Commit: 2016c92ef18383cf0b055d0b74e7b034772ba155
Author: Kévin Dietrich
Date:   Sat May 23 05:58:11 2015 +0200
Branches: openvdb
https://developer.blender.org/rB2016c92ef18383cf0b055d0b74e7b034772ba155

Fix segault when closing Blender.

The cache was freed after the smoke domain...

===================================================================

M       intern/openvdb/intern/openvdb_writer.cpp
M       intern/openvdb/intern/openvdb_writer.h
M       source/blender/blenkernel/intern/smoke.c

===================================================================

diff --git a/intern/openvdb/intern/openvdb_writer.cpp 
b/intern/openvdb/intern/openvdb_writer.cpp
index 37cd28e..9c2ad40 100644
--- a/intern/openvdb/intern/openvdb_writer.cpp
+++ b/intern/openvdb/intern/openvdb_writer.cpp
@@ -27,8 +27,9 @@
 
 OpenVDBWriter::OpenVDBWriter()
     : m_grids(new openvdb::GridPtrVec())
+    , m_meta_map(new openvdb::MetaMap())
 {
-       m_meta_map.insertMeta("creator", 
openvdb::StringMetadata("Blender/OpenVDBWriter"));
+       m_meta_map->insertMeta("creator", 
openvdb::StringMetadata("Blender/OpenVDBWriter"));
 }
 
 OpenVDBWriter::~OpenVDBWriter()
@@ -46,22 +47,22 @@ void OpenVDBWriter::insert(const openvdb::GridBase &grid)
 
 void OpenVDBWriter::insertFloatMeta(const std::string &name, const float value)
 {
-       m_meta_map.insertMeta(name, openvdb::FloatMetadata(value));
+       m_meta_map->insertMeta(name, openvdb::FloatMetadata(value));
 }
 
 void OpenVDBWriter::insertIntMeta(const std::string &name, const int value)
 {
-       m_meta_map.insertMeta(name, openvdb::Int32Metadata(value));
+       m_meta_map->insertMeta(name, openvdb::Int32Metadata(value));
 }
 
 void OpenVDBWriter::insertVec3sMeta(const std::string &name, const 
openvdb::Vec3s value)
 {
-       m_meta_map.insertMeta(name, openvdb::Vec3SMetadata(value));
+       m_meta_map->insertMeta(name, openvdb::Vec3SMetadata(value));
 }
 
 void OpenVDBWriter::insertVec3IMeta(const std::string &name, const 
openvdb::Vec3I value)
 {
-       m_meta_map.insertMeta(name, openvdb::Vec3IMetadata(value));
+       m_meta_map->insertMeta(name, openvdb::Vec3IMetadata(value));
 }
 
 void OpenVDBWriter::insertMat4sMeta(const std::string &name, const float 
value[4][4])
@@ -72,7 +73,7 @@ void OpenVDBWriter::insertMat4sMeta(const std::string &name, 
const float value[4
            value[2][0], value[2][1], value[2][2], value[2][3],
            value[3][0], value[3][1], value[3][2], value[3][3]);
 
-       m_meta_map.insertMeta(name, openvdb::Mat4SMetadata(mat));
+       m_meta_map->insertMeta(name, openvdb::Mat4SMetadata(mat));
 }
 
 void OpenVDBWriter::setFileCompression(const int flags)
@@ -84,7 +85,7 @@ void OpenVDBWriter::write(const std::string &filename) const
 {
        openvdb::io::File file(filename);
        file.setCompression(m_flags);
-       file.write(*m_grids, m_meta_map);
+       file.write(*m_grids, *m_meta_map);
        file.close();
 
        /* Should perhaps be an option at some point */
diff --git a/intern/openvdb/intern/openvdb_writer.h 
b/intern/openvdb/intern/openvdb_writer.h
index e710397..6f36d62 100644
--- a/intern/openvdb/intern/openvdb_writer.h
+++ b/intern/openvdb/intern/openvdb_writer.h
@@ -30,7 +30,7 @@
 
 class OpenVDBWriter {
        openvdb::GridPtrVecPtr m_grids;
-       openvdb::MetaMap m_meta_map;
+       openvdb::MetaMap::Ptr m_meta_map;
 
        int m_flags;
 
diff --git a/source/blender/blenkernel/intern/smoke.c 
b/source/blender/blenkernel/intern/smoke.c
index a9ed7ba..6a2c1e3 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -399,12 +399,13 @@ static void smokeModifier_freeDomain(SmokeModifierData 
*smd)
                BKE_ptcache_free_list(&(smd->domain->ptcaches[0]));
                smd->domain->point_cache[0] = NULL;
 
-               MEM_freeN(smd->domain);
-               smd->domain = NULL;
-
-               for (cache = smd->domain->vdb_caches.first; cache; cache = 
cache->next) {
+               while ((cache = BLI_pophead(&(smd->domain->vdb_caches)))) {
+                       OpenVDBWriter_free(cache->writer);
                        MEM_freeN(cache);
                }
+
+               MEM_freeN(smd->domain);
+               smd->domain = NULL;
        }
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to