diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-03-27 16:09:00 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-03-27 16:09:00 +0300 |
commit | 90b7bcb48d9a58b0f6e6cde5e5d7a412f94cf7f9 (patch) | |
tree | 810afed3ab403743d705611aa6768dd19d4fb17f /source/blender/blenloader | |
parent | ddecf23711ec8a3a4247f78c01e3f1a0c36eaaea (diff) | |
parent | e22b870b4a4c02f762471744675f5b4d8a940304 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r-- | source/blender/blenloader/BLO_undofile.h | 11 | ||||
-rw-r--r-- | source/blender/blenloader/intern/undofile.c | 26 |
2 files changed, 21 insertions, 16 deletions
diff --git a/source/blender/blenloader/BLO_undofile.h b/source/blender/blenloader/BLO_undofile.h index fb96ec75e62..d3c0130a63b 100644 --- a/source/blender/blenloader/BLO_undofile.h +++ b/source/blender/blenloader/BLO_undofile.h @@ -35,15 +35,16 @@ typedef struct { void *next, *prev; - - char *buf; - unsigned int ident, size; - + const char *buf; + /** Size in bytes. */ + unsigned int size; + /** When true, this chunk doesn't own the memory, it's shared with a previous #MemFileChunk */ + bool is_identical; } MemFileChunk; typedef struct MemFile { ListBase chunks; - unsigned int size; + size_t size; } MemFile; /* actually only used writefile.c */ diff --git a/source/blender/blenloader/intern/undofile.c b/source/blender/blenloader/intern/undofile.c index c191e48a143..ffc7d7c83f5 100644 --- a/source/blender/blenloader/intern/undofile.c +++ b/source/blender/blenloader/intern/undofile.c @@ -43,6 +43,9 @@ #include "BLO_undofile.h" +/* keep last */ +#include "BLI_strict_flags.h" + /* **************** support for memory-write, for undo buffers *************** */ /* not memfile itself */ @@ -51,8 +54,9 @@ void BLO_memfile_free(MemFile *memfile) MemFileChunk *chunk; while ((chunk = BLI_pophead(&memfile->chunks))) { - if (chunk->ident == 0) - MEM_freeN(chunk->buf); + if (chunk->is_identical == false) { + MEM_freeN((void *)chunk->buf); + } MEM_freeN(chunk); } memfile->size = 0; @@ -68,9 +72,9 @@ void BLO_memfile_merge(MemFile *first, MemFile *second) sc = second->chunks.first; while (fc || sc) { if (fc && sc) { - if (sc->ident) { - sc->ident = 0; - fc->ident = 1; + if (sc->is_identical) { + sc->is_identical = false; + fc->is_identical = true; } } if (fc) fc = fc->next; @@ -98,7 +102,7 @@ void memfile_chunk_add(MemFile *compare, MemFile *current, const char *buf, unsi curchunk = MEM_mallocN(sizeof(MemFileChunk), "MemFileChunk"); curchunk->size = size; curchunk->buf = NULL; - curchunk->ident = 0; + curchunk->is_identical = false; BLI_addtail(¤t->chunks, curchunk); /* we compare compchunk with buf */ @@ -106,17 +110,17 @@ void memfile_chunk_add(MemFile *compare, MemFile *current, const char *buf, unsi if (compchunk->size == curchunk->size) { if (memcmp(compchunk->buf, buf, size) == 0) { curchunk->buf = compchunk->buf; - curchunk->ident = 1; + curchunk->is_identical = true; } } compchunk = compchunk->next; } - + /* not equal... */ if (curchunk->buf == NULL) { - curchunk->buf = MEM_mallocN(size, "Chunk buffer"); - memcpy(curchunk->buf, buf, size); + char *buf_new = MEM_mallocN(size, "Chunk buffer"); + memcpy(buf_new, buf, size); + curchunk->buf = buf_new; current->size += size; } } - |