diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-08-18 06:38:30 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-08-18 06:38:30 -0700 |
commit | b79bc438aadeda878eaa2a26c72129edffba4be7 (patch) | |
tree | 0b5e993bb988e49375d5d6d75549ae7e330932ac /lib.c | |
parent | 56ff4d38c78dd99873017c075861efefe5428bad (diff) | |
download | txr-b79bc438aadeda878eaa2a26c72129edffba4be7.tar.gz txr-b79bc438aadeda878eaa2a26c72129edffba4be7.tar.bz2 txr-b79bc438aadeda878eaa2a26c72129edffba4be7.zip |
Revising out-of-memory handling.
We don't want to be aborting on OOM, but throwing an
exception.
* lib.c (alloc_error_s): New symbol variable.
(oom_realloc): Global variable removed.
(oom): New static function.
(chk_malloc, chk_malloc_gc_more, chk_calloc, chk_realloc):
Call oom instead of removed oom_realloc handler.
(env): Throw alloc-error rather than error by calling oom.
(obj_init): Initialize alloc_error_s.
(init): Drop function pointer argument; do not
initialize removed oom_realloc.
* lib.h (alloc_error_s): Declared.
(oom_realloc): Declaration removed.
(init): Declaration updated.
* txr.1: Type tree diagram includes alloc-error.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 27 |
1 files changed, 14 insertions, 13 deletions
@@ -105,7 +105,7 @@ val eof_s, eol_s, assert_s, name_s; val error_s, type_error_s, internal_error_s, panic_s; val numeric_error_s, range_error_s; val query_error_s, file_error_s, process_error_s, syntax_error_s; -val timeout_error_s, system_error_s; +val timeout_error_s, system_error_s, alloc_error_s; val warning_s, defr_warning_s, restart_s, continue_s; val gensym_counter_s, nullify_s, from_list_s, lambda_set_s, length_s; @@ -127,8 +127,6 @@ val year_s, month_s, day_s, hour_s, min_s, sec_s, dst_s, gmtoff_s, zone_s; static val env_list; static val recycled_conses; -mem_t *(*oom_realloc)(mem_t *, size_t); - /* C99 inline instantiations. */ #if __STDC_VERSION__ >= 199901L loc mkloc_fun(val *ptr, val obj); @@ -2602,6 +2600,11 @@ val equal(val left, val right) alloc_bytes_t malloc_bytes; +static void oom(void) +{ + uw_throwf(alloc_error_s, lit("out of memory"), nao); +} + mem_t *chk_malloc(size_t size) { mem_t *ptr = convert(mem_t *, malloc(size)); @@ -2609,7 +2612,7 @@ mem_t *chk_malloc(size_t size) assert (!async_sig_enabled); if (size && ptr == 0) - ptr = convert(mem_t *, oom_realloc(0, size)); + oom(); malloc_bytes += size; return ptr; } @@ -2619,7 +2622,7 @@ mem_t *chk_malloc_gc_more(size_t size) mem_t *ptr = convert(mem_t *, malloc(size)); assert (!async_sig_enabled); if (size && ptr == 0) - ptr = convert(mem_t *, oom_realloc(0, size)); + oom(); return ptr; } @@ -2630,10 +2633,8 @@ mem_t *chk_calloc(size_t n, size_t size) assert (!async_sig_enabled); - if (size && ptr == 0) { - ptr = convert(mem_t *, oom_realloc(0, total)); - memset(ptr, 0, total); - } + if (size && ptr == 0) + oom(); malloc_bytes += total; return ptr; } @@ -2645,7 +2646,7 @@ mem_t *chk_realloc(mem_t *old, size_t size) assert (!async_sig_enabled); if (size != 0 && newptr == 0) - newptr = oom_realloc(old, size); + oom(); malloc_bytes += size; return newptr; } @@ -10129,7 +10130,7 @@ val env(void) wchar_t *iter = env; if (iter == 0) - uw_throwf(error_s, lit("out of memory"), nao); + oom(); for (; *iter; iter += wcslen(iter) + 1) ptail = list_collect(ptail, string(iter)); @@ -10281,6 +10282,7 @@ static void obj_init(void) syntax_error_s = intern(lit("syntax-error"), user_package); system_error_s = intern(lit("system-error"), user_package); timeout_error_s = intern(lit("timeout-error"), user_package); + alloc_error_s = intern(lit("alloc-error"), user_package); assert_s = intern(lit("assert"), user_package); warning_s = intern(lit("warning"), user_package); defr_warning_s = intern(lit("defr-warning"), user_package); @@ -11459,12 +11461,11 @@ static void time_init(void) #endif } -void init(mem_t *(*oom)(mem_t *, size_t), val *stack_bottom) +void init(val *stack_bottom) { int gc_save; gc_save = gc_state(0); - oom_realloc = oom; gc_init(stack_bottom); obj_init(); uw_init(); |