Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-02-12 08:47:39 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-02-12 08:52:54 +0300
commitf96bfde4a5ef3c3c0b2878dec3828a967fda86cc (patch)
tree0f50e730d0ab9e05e62dd67c868b69fbee3f193b
parentb539aee0c98524bb24591ce5398bf3b851ee2e05 (diff)
makesdna: use memarena for string allocations
Include it since versioning code will need to perform small string allocations too, which doesn't fit will into the currently used fixed size buffers.
-rw-r--r--source/blender/makesdna/intern/CMakeLists.txt1
-rw-r--r--source/blender/makesdna/intern/makesdna.c90
2 files changed, 53 insertions, 38 deletions
diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt
index 8ad1d189ccf..ad84ffc68c1 100644
--- a/source/blender/makesdna/intern/CMakeLists.txt
+++ b/source/blender/makesdna/intern/CMakeLists.txt
@@ -34,6 +34,7 @@ blender_include_dirs(
# Build makesdna executable
set(SRC
makesdna.c
+ ../../blenlib/intern/BLI_memarena.c
../../../../intern/guardedalloc/intern/mallocn.c
../../../../intern/guardedalloc/intern/mallocn_guarded_impl.c
../../../../intern/guardedalloc/intern/mallocn_lockfree_impl.c
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 1e53ce65e7b..f957bf637c3 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -46,11 +46,11 @@
#include "MEM_guardedalloc.h"
-#include "../blenlib/BLI_sys_types.h" // for intptr_t support
+#include "BLI_sys_types.h" /* for intptr_t support */
+#include "BLI_memarena.h"
#define SDNA_MAX_FILENAME_LENGTH 255
-
/* Included the path relative from /source/blender/ here, so we can move */
/* headers around with more freedom. */
static const char *includefiles[] = {
@@ -130,14 +130,16 @@ static const char *includefiles[] = {
"",
};
+MemArena *mem_arena = NULL;
+
static int maxdata = 500000, maxnr = 50000;
static int nr_names = 0;
static int nr_types = 0;
static int nr_structs = 0;
/** at address names[a] is string a */
-static char **names, *namedata;
+static char **names;
/** at address types[a] is string a */
-static char **types, *typedata;
+static char **types;
/** at typelens[a] is the length of type 'a' on this systems bitness (32 or 64) */
static short *typelens_native;
/** contains sizes as they are calculated on 32 bit systems */
@@ -163,6 +165,16 @@ static int additional_slen_offset;
#define DEBUG_PRINTF(debug_level, ...) \
{ if (debugSDNA > debug_level) { printf(__VA_ARGS__); } } ((void)0)
+
+/* stub for BLI_abort() */
+#ifndef NDEBUG
+void BLI_system_backtrace(FILE *fp);
+void BLI_system_backtrace(FILE *fp)
+{
+ (void)fp;
+}
+#endif
+
/* ************************************************************************** */
/* Functions */
/* ************************************************************************** */
@@ -253,13 +265,9 @@ static int add_type(const char *str, int len)
}
/* append new type */
- if (nr_types == 0) {
- cp = typedata;
- }
- else {
- cp = types[nr_types - 1] + strlen(types[nr_types - 1]) + 1;
- }
- strcpy(cp, str);
+ const int str_size = strlen(str) + 1;
+ cp = BLI_memarena_alloc(mem_arena, str_size);
+ memcpy(cp, str, str_size);
types[nr_types] = cp;
typelens_native[nr_types] = len;
typelens_32[nr_types] = len;
@@ -400,13 +408,9 @@ static int add_name(const char *str)
}
/* append new type */
- if (nr_names == 0) {
- cp = namedata;
- }
- else {
- cp = names[nr_names - 1] + strlen(names[nr_names - 1]) + 1;
- }
- strcpy(cp, name);
+ const int name_size = strlen(name) + 1;
+ cp = BLI_memarena_alloc(mem_arena, name_size);
+ memcpy(cp, name, name_size);
names[nr_names] = cp;
if (nr_names >= maxnr) {
@@ -993,7 +997,7 @@ static int make_structDNA(const char *baseDirectory, FILE *file, FILE *file_offs
const short *sp;
/* str contains filenames. Since we now include paths, I stretched */
/* it a bit. Hope this is enough :) -nzc- */
- char str[SDNA_MAX_FILENAME_LENGTH], *cp;
+ char str[SDNA_MAX_FILENAME_LENGTH];
int firststruct;
if (debugSDNA > 0) {
@@ -1001,9 +1005,9 @@ static int make_structDNA(const char *baseDirectory, FILE *file, FILE *file_offs
printf("Running makesdna at debug level %d\n", debugSDNA);
}
+ mem_arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__);
+
/* the longest known struct is 50k, so we assume 100k is sufficient! */
- namedata = MEM_callocN(maxdata, "namedata");
- typedata = MEM_callocN(maxdata, "typedata");
structdata = MEM_callocN(maxdata, "structdata");
/* a maximum of 5000 variables, must be sufficient? */
@@ -1098,32 +1102,42 @@ static int make_structDNA(const char *baseDirectory, FILE *file, FILE *file_offs
/* pass */
}
else {
+ const char nil_bytes[4] = {0};
+ int len_align;
+
dna_write(file, "SDNA", 4);
/* write names */
dna_write(file, "NAME", 4);
len = nr_names;
dna_write(file, &len, 4);
-
- /* calculate size of datablock with strings */
- cp = names[nr_names - 1];
- cp += strlen(names[nr_names - 1]) + 1; /* +1: null-terminator */
- len = (intptr_t) (cp - (char *) names[0]);
- len = (len + 3) & ~3;
- dna_write(file, names[0], len);
+ /* write array */
+ len = 0;
+ for (int nr = 0; nr < nr_names; nr++) {
+ int name_size = strlen(names[nr]) + 1;
+ dna_write(file, names[nr], name_size);
+ len += name_size;
+ }
+ len_align = (len + 3) & ~3;
+ if (len != len_align) {
+ dna_write(file, nil_bytes, len_align - len);
+ }
/* write TYPES */
dna_write(file, "TYPE", 4);
len = nr_types;
dna_write(file, &len, 4);
-
- /* calculate datablock size */
- cp = types[nr_types - 1];
- cp += strlen(types[nr_types - 1]) + 1; /* +1: null-terminator */
- len = (intptr_t) (cp - (char *) types[0]);
- len = (len + 3) & ~3;
-
- dna_write(file, types[0], len);
+ /* write array */
+ len = 0;
+ for (int nr = 0; nr < nr_types; nr++) {
+ int type_size = strlen(types[nr]) + 1;
+ dna_write(file, types[nr], type_size);
+ len += type_size;
+ }
+ len_align = (len + 3) & ~3;
+ if (len != len_align) {
+ dna_write(file, nil_bytes, len_align - len);
+ }
/* WRITE TYPELENGTHS */
dna_write(file, "TLEN", 4);
@@ -1192,8 +1206,6 @@ static int make_structDNA(const char *baseDirectory, FILE *file, FILE *file_offs
fprintf(file_offsets, "};\n");
}
- MEM_freeN(namedata);
- MEM_freeN(typedata);
MEM_freeN(structdata);
MEM_freeN(names);
MEM_freeN(types);
@@ -1202,6 +1214,8 @@ static int make_structDNA(const char *baseDirectory, FILE *file, FILE *file_offs
MEM_freeN(typelens_64);
MEM_freeN(structs);
+ BLI_memarena_free(mem_arena);
+
DEBUG_PRINTF(0, "done.\n");
return(0);