--- parser3/src/include/pa_memory.h 2020/12/15 17:10:31 1.41 +++ parser3/src/include/pa_memory.h 2021/01/16 15:47:05 1.43 @@ -9,7 +9,7 @@ #ifndef PA_MEMORY_H #define PA_MEMORY_H -#define IDENT_PA_MEMORY_H "$Id: pa_memory.h,v 1.41 2020/12/15 17:10:31 moko Exp $" +#define IDENT_PA_MEMORY_H "$Id: pa_memory.h,v 1.43 2021/01/16 15:47:05 moko Exp $" // include @@ -42,18 +42,19 @@ inline void *pa_malloc_atomic(size_t siz return pa_fail_alloc("allocate clean", size); } -/// @a length may be null, which mean "autocalc it" -inline char *pa_strdup(const char* auto_variable_never_null, size_t helper_length=0) { - size_t known_length= helper_length ? helper_length : strlen(auto_variable_never_null); - - size_t size=known_length+1; - if(char *result=static_cast(GC_MALLOC_ATOMIC(size))) { +/// length may be zero, and this is normal +inline char *pa_strdup(const char* auto_variable_never_null, size_t known_length) { + if(char *result=static_cast(GC_MALLOC_ATOMIC(known_length+1))) { memcpy(result, auto_variable_never_null, known_length); result[known_length]=0; return result; } - return static_cast(pa_fail_alloc("allocate clean", size)); + return static_cast(pa_fail_alloc("allocate clean", known_length+1)); +} + +inline char *pa_strdup(const char* auto_variable_never_null) { + return pa_strdup(auto_variable_never_null, strlen(auto_variable_never_null)); } inline void pa_free(void *ptr) { @@ -146,10 +147,7 @@ inline char *strdup(const char*, size_t) #endif // _MSC_VER -#ifdef PA_DEBUG_DISABLE_GC -#define PA_GC_GCOLLECT -#else -#define PA_GC_GCOLLECT { GC_enable(); GC_gcollect(); GC_disable(); } -#endif +void pa_gc_collect(bool forced=false); +void pa_gc_set_free_space_divisor(int); #endif