[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49799] trunk/blender: add MEM_recallocN() , so bytes are ensured to be zero'd when growing.

Campbell Barton ideasman42 at gmail.com
Sat Aug 11 14:16:09 CEST 2012


Revision: 49799
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49799
Author:   campbellbarton
Date:     2012-08-11 12:16:09 +0000 (Sat, 11 Aug 2012)
Log Message:
-----------
add MEM_recallocN(), so bytes are ensured to be zero'd when growing.

Modified Paths:
--------------
    trunk/blender/intern/guardedalloc/MEM_guardedalloc.h
    trunk/blender/intern/guardedalloc/intern/mallocn.c
    trunk/blender/source/blender/avi/intern/avi.c

Modified: trunk/blender/intern/guardedalloc/MEM_guardedalloc.h
===================================================================
--- trunk/blender/intern/guardedalloc/MEM_guardedalloc.h	2012-08-11 10:56:30 UTC (rev 49798)
+++ trunk/blender/intern/guardedalloc/MEM_guardedalloc.h	2012-08-11 12:16:09 UTC (rev 49799)
@@ -111,6 +111,16 @@
 	;
 
 	/**
+	 * A variant of realloc which zeros new bytes
+	 */
+	void *MEM_recallocN(void *vmemh, size_t len)
+#if MEM_GNU_ATTRIBUTES
+	__attribute__((warn_unused_result))
+	__attribute__((alloc_size(2)))
+#endif
+	;
+
+	/**
 	 * Allocate a block of memory of size len, with tag name str. The
 	 * memory is cleared. The name must be static, because only a
 	 * pointer to it is stored ! */

Modified: trunk/blender/intern/guardedalloc/intern/mallocn.c
===================================================================
--- trunk/blender/intern/guardedalloc/intern/mallocn.c	2012-08-11 10:56:30 UTC (rev 49798)
+++ trunk/blender/intern/guardedalloc/intern/mallocn.c	2012-08-11 12:16:09 UTC (rev 49799)
@@ -302,10 +302,14 @@
 
 		newp = MEM_mallocN(len, memh->name);
 		if (newp) {
-			if (len < memh->len)
+			if (len < memh->len) {
+				/* shrink */
 				memcpy(newp, vmemh, len);
-			else
+			}
+			else {
+				/* grow (or remain same size) */
 				memcpy(newp, vmemh, memh->len);
+			}
 		}
 
 		MEM_freeN(vmemh);
@@ -314,6 +318,37 @@
 	return newp;
 }
 
+void *MEM_recallocN(void *vmemh, size_t len)
+{
+	void *newp = NULL;
+
+	if (vmemh) {
+		MemHead *memh = vmemh;
+		memh--;
+
+		newp = MEM_mallocN(len, memh->name);
+		if (newp) {
+			if (len < memh->len) {
+				/* shrink */
+				memcpy(newp, vmemh, len);
+			}
+			else {
+				memcpy(newp, vmemh, memh->len);
+
+				if (len > memh->len) {
+					/* grow */
+					/* zero new bytes */
+					memset(((char *)newp) + memh->len, 0, len - memh->len);
+				}
+			}
+		}
+
+		MEM_freeN(vmemh);
+	}
+
+	return newp;
+}
+
 static void make_memhead_header(MemHead *memh, size_t len, const char *str)
 {
 	MemTail *memt;

Modified: trunk/blender/source/blender/avi/intern/avi.c
===================================================================
--- trunk/blender/source/blender/avi/intern/avi.c	2012-08-11 10:56:30 UTC (rev 49798)
+++ trunk/blender/source/blender/avi/intern/avi.c	2012-08-11 12:16:09 UTC (rev 49799)
@@ -968,9 +968,7 @@
 		const size_t entry_size = (movie->header->Streams + 1) * sizeof(AviIndexEntry);
 
 		if (movie->entries != NULL) {
-			temp = (AviIndexEntry *)MEM_reallocN(movie->entries, (frame_num + 1) * entry_size);
-			/* clear new bytes */
-			memset(&temp[movie->index_entries + 1], 0, (frame_num - movie->index_entries) * entry_size);
+			temp = (AviIndexEntry *)MEM_recallocN(movie->entries, (frame_num + 1) * entry_size);
 		}
 		else {
 			temp = (AviIndexEntry *) MEM_callocN((frame_num + 1) * entry_size, "newidxentry");




More information about the Bf-blender-cvs mailing list