[Bf-blender-cvs] [57777b95428] master: Fix T61906: crash rendering softbody with Cycles and timeline visible.

Brecht Van Lommel noreply at git.blender.org
Mon Mar 11 14:35:02 CET 2019


Commit: 57777b95428cef886bd3b2317b7728fa066acee1
Author: Brecht Van Lommel
Date:   Mon Mar 11 10:07:36 2019 +0100
Branches: master
https://developer.blender.org/rB57777b95428cef886bd3b2317b7728fa066acee1

Fix T61906: crash rendering softbody with Cycles and timeline visible.

Make sure we don't reallocate arrays in the pointcache when not needed, the
size of a memory allocation can be slightly bigger than the requested size.

Also, use consistent check for shared cached in copy and free functions.

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

M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/blenkernel/intern/softbody.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/makesdna/DNA_object_force_types.h

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

diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index ed949e68f13..3371c3dbe48 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -3202,7 +3202,7 @@ int  BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
 	if (cfra<pid->cache->startframe || cfra > pid->cache->endframe)
 		return 0;
 
-	if (pid->cache->cached_frames &&	pid->cache->cached_frames[cfra-pid->cache->startframe]==0)
+	if (pid->cache->cached_frames && pid->cache->cached_frames[cfra-pid->cache->startframe]==0)
 		return 0;
 
 	if (pid->cache->flag & PTCACHE_DISK_CACHE) {
@@ -3258,9 +3258,10 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
 
 	/* verify cached_frames array is up to date */
 	if (cache->cached_frames) {
-		if (MEM_allocN_len(cache->cached_frames) != sizeof(char) * (cache->endframe-cache->startframe+1)) {
+		if (cache->cached_frames_len != (cache->endframe - cache->startframe + 1)) {
 			MEM_freeN(cache->cached_frames);
 			cache->cached_frames = NULL;
+			cache->cached_frames_len = 0;
 		}
 	}
 
@@ -3268,7 +3269,8 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
 		unsigned int sta=cache->startframe;
 		unsigned int end=cache->endframe;
 
-		cache->cached_frames = MEM_callocN(sizeof(char) * (cache->endframe-cache->startframe+1), "cached frames array");
+		cache->cached_frames_len = cache->endframe - cache->startframe + 1;
+		cache->cached_frames = MEM_callocN(sizeof(char) * cache->cached_frames_len, "cached frames array");
 
 		if (pid->cache->flag & PTCACHE_DISK_CACHE) {
 			/* mode is same as fopen's modes */
@@ -3544,6 +3546,7 @@ static PointCache *ptcache_copy(PointCache *cache, const bool copy_data)
 
 	if (copy_data == false) {
 		ncache->cached_frames = NULL;
+		ncache->cached_frames_len = 0;
 
 		/* flag is a mix of user settings and simulator/baking state */
 		ncache->flag= ncache->flag & (PTCACHE_DISK_CACHE|PTCACHE_EXTERNAL|PTCACHE_IGNORE_LIBPATH);
@@ -3902,7 +3905,8 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
 
 	if (cache->cached_frames) {
 		MEM_freeN(cache->cached_frames);
-		cache->cached_frames=NULL;
+		cache->cached_frames = NULL;
+		cache->cached_frames_len = 0;
 	}
 
 	if (cache->flag & PTCACHE_DISK_CACHE)
@@ -4082,7 +4086,8 @@ void BKE_ptcache_load_external(PTCacheID *pid)
 	/* make sure all new frames are loaded */
 	if (cache->cached_frames) {
 		MEM_freeN(cache->cached_frames);
-		cache->cached_frames=NULL;
+		cache->cached_frames = NULL;
+		cache->cached_frames_len = 0;
 	}
 	BKE_ptcache_update_info(pid);
 }
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index a1e2e0971d1..481eb617cc0 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -3037,7 +3037,7 @@ void sbFree(Object *ob)
 
 	free_softbody_intern(sb);
 
-	if ((ob->id.tag & LIB_TAG_COPIED_ON_WRITE) == 0) {
+	if ((ob->id.tag & LIB_TAG_NO_MAIN) == 0) {
 		/* Only free shared data on non-CoW copies */
 		BKE_ptcache_free_list(&sb->shared->ptcaches);
 		sb->shared->pointcache = NULL;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 49c62372a85..4b1ca9aeaef 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -4582,6 +4582,7 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
 	cache->edit = NULL;
 	cache->free_edit = NULL;
 	cache->cached_frames = NULL;
+	cache->cached_frames_len = 0;
 }
 
 static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointCache **ocache, int force_disk)
diff --git a/source/blender/makesdna/DNA_object_force_types.h b/source/blender/makesdna/DNA_object_force_types.h
index c7bb3dad809..e09df0635ef 100644
--- a/source/blender/makesdna/DNA_object_force_types.h
+++ b/source/blender/makesdna/DNA_object_force_types.h
@@ -272,11 +272,15 @@ typedef struct PointCache {
 	char info[64];
 	/** File path, 1024 = FILE_MAX. */
 	char path[1024];
+
 	/**
 	 * Array of length endframe-startframe+1 with flags to indicate cached frames.
 	 * Can be later used for other per frame flags too if needed.
 	 */
 	char *cached_frames;
+	int cached_frames_len;
+	char _pad1[4];
+
 	struct ListBase mem_cache;
 
 	struct PTCacheEdit *edit;



More information about the Bf-blender-cvs mailing list