~ chicken-core (chicken-5) b88c768ed1143134a213b008395701409abb39e0
commit b88c768ed1143134a213b008395701409abb39e0
Author: Jim Ursetto <zbigniewsz@gmail.com>
AuthorDate: Mon Aug 12 15:51:41 2013 -0500
Commit: Peter Bex <peter.bex@xs4all.nl>
CommitDate: Tue Aug 13 20:52:06 2013 +0200
Make trace buffer resizable at runtime, via ##sys#resize-trace-buffer
- Add C_resize_trace_buffer
- Add ##sys#resize-trace-buffer interface, returning old size
- Move check for min trace buffer size to C_clear_trace_buffer,
where the buffer is actually allocated
- In the current implementation, resizing the buffer clears its contents.
Signed-off-by: Peter Bex <peter.bex@xs4all.nl>
diff --git a/NEWS b/NEWS
index 4d96844e..5b3cfdb3 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,8 @@
+4.8.3
+
+- Runtime system
+ - The procedure trace buffer has been made resizable.
+
4.8.2
- Security fixes
diff --git a/chicken.h b/chicken.h
index e75e79b1..d828a668 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1665,6 +1665,7 @@ C_fctexport void *C_register_lf2(C_word *lf, int count, C_PTABLE_ENTRY *ptable);
C_fctexport void C_unregister_lf(void *handle);
C_fctexport C_char *C_dump_trace(int start);
C_fctexport void C_fcall C_clear_trace_buffer(void) C_regparm;
+C_fctexport C_word C_resize_trace_buffer(C_word size);
C_fctexport C_word C_fetch_trace(C_word start, C_word buffer);
C_fctexport C_word C_fcall C_string(C_word **ptr, int len, C_char *str) C_regparm;
C_fctexport C_word C_fcall C_static_string(C_word **ptr, int len, C_char *str) C_regparm;
diff --git a/eval.scm b/eval.scm
index 607246b6..b6d72fd4 100644
--- a/eval.scm
+++ b/eval.scm
@@ -1534,6 +1534,9 @@
(##sys#flush-output ##sys#standard-output) ) ) )
(define ##sys#clear-trace-buffer (foreign-lambda void "C_clear_trace_buffer"))
+(define (##sys#resize-trace-buffer i)
+ (##sys#check-exact i)
+ (##core#inline "C_resize_trace_buffer" i))
(define repl
(let ((eval eval)
diff --git a/runtime.c b/runtime.c
index 85a1b1f8..c018f8bc 100644
--- a/runtime.c
+++ b/runtime.c
@@ -714,9 +714,6 @@ int CHICKEN_initialize(int heap, int stack, int symbols, void *toplevel)
gc_root_list = NULL;
/* Initialize global variables: */
- if(C_trace_buffer_size < MIN_TRACE_BUFFER_SIZE)
- C_trace_buffer_size = MIN_TRACE_BUFFER_SIZE;
-
if(C_heap_growth <= 0) C_heap_growth = DEFAULT_HEAP_GROWTH;
if(C_heap_shrinkage <= 0) C_heap_shrinkage = DEFAULT_HEAP_SHRINKAGE;
@@ -3875,6 +3872,9 @@ C_regparm void C_fcall C_clear_trace_buffer(void)
int i;
if(trace_buffer == NULL) {
+ if(C_trace_buffer_size < MIN_TRACE_BUFFER_SIZE)
+ C_trace_buffer_size = MIN_TRACE_BUFFER_SIZE;
+
trace_buffer = (TRACE_INFO *)C_malloc(sizeof(TRACE_INFO) * C_trace_buffer_size);
if(trace_buffer == NULL)
@@ -3892,6 +3892,15 @@ C_regparm void C_fcall C_clear_trace_buffer(void)
}
}
+C_word C_resize_trace_buffer(C_word size) {
+ int old_size = C_trace_buffer_size;
+ assert(trace_buffer);
+ free(trace_buffer);
+ trace_buffer = NULL;
+ C_trace_buffer_size = C_unfix(size);
+ C_clear_trace_buffer();
+ return(C_fix(old_size));
+}
C_word C_fetch_trace(C_word starti, C_word buffer)
{
Trap