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");

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

Reply via email to