From a5c7d4f5f852916ea520a487b6bf67de46b8a0c0 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 14 Sep 2010 09:35:44 -0600 Subject: [PATCH] add scheme_get_place_table() --- collects/scribblings/inside/misc.scrbl | 18 ++++++++++++++++++ src/racket/include/mzwin.def | 1 + src/racket/include/mzwin3m.def | 1 + src/racket/include/racket.exp | 1 + src/racket/include/racket3m.exp | 1 + src/racket/include/schthread.h | 2 ++ src/racket/src/schemef.h | 1 + src/racket/src/schemex.h | 1 + src/racket/src/schemex.inc | 1 + src/racket/src/schemexm.h | 1 + src/racket/src/thread.c | 11 +++++++++++ 11 files changed, 39 insertions(+) diff --git a/collects/scribblings/inside/misc.scrbl b/collects/scribblings/inside/misc.scrbl index 65d8102b63..4698248864 100644 --- a/collects/scribblings/inside/misc.scrbl +++ b/collects/scribblings/inside/misc.scrbl @@ -339,3 +339,21 @@ Returns the string that is used as the Racket startup banner.} @function[(char* scheme_version)]{ Returns a string for the executing version of Racket.} + +@function[(Scheme_Object* scheme_get_place_table)]{ + +Returns an @racket[eq?]-based hash table that is global to the current +place.} + +@function[(void* scheme_register_process_global + [const-char* key] + [void* val])]{ + +Gets or sets a value in a process-global table (i.e., shared across +multiple places, if any). If @var{val} is NULL, the current mapping +for @var{key} is given, otherwise @var{val} is installed as the value +for @var{key} and @cpp{NULL} is returned. The given @var{val} must not +refer to garbage-collected memory. + +This function is intended for infrequent use with a small number of +keys.} diff --git a/src/racket/include/mzwin.def b/src/racket/include/mzwin.def index 3cb7a765b3..e7cf48a25b 100644 --- a/src/racket/include/mzwin.def +++ b/src/racket/include/mzwin.def @@ -583,4 +583,5 @@ EXPORTS scheme_get_signal_handle scheme_char_strlen scheme_stx_extract_marks + scheme_get_place_table scheme_register_process_global diff --git a/src/racket/include/mzwin3m.def b/src/racket/include/mzwin3m.def index 20d3c108c8..9bf3983e38 100644 --- a/src/racket/include/mzwin3m.def +++ b/src/racket/include/mzwin3m.def @@ -599,4 +599,5 @@ EXPORTS scheme_get_signal_handle scheme_char_strlen scheme_stx_extract_marks + scheme_get_place_table scheme_register_process_global diff --git a/src/racket/include/racket.exp b/src/racket/include/racket.exp index 824e48413a..007918dfff 100644 --- a/src/racket/include/racket.exp +++ b/src/racket/include/racket.exp @@ -600,4 +600,5 @@ scheme_signal_received_at scheme_get_signal_handle scheme_char_strlen scheme_stx_extract_marks +scheme_get_place_table scheme_register_process_global diff --git a/src/racket/include/racket3m.exp b/src/racket/include/racket3m.exp index 7b620836f5..1cfeca2f42 100644 --- a/src/racket/include/racket3m.exp +++ b/src/racket/include/racket3m.exp @@ -607,4 +607,5 @@ scheme_signal_received_at scheme_get_signal_handle scheme_char_strlen scheme_stx_extract_marks +scheme_get_place_table scheme_register_process_global diff --git a/src/racket/include/schthread.h b/src/racket/include/schthread.h index c002ba3d2a..5cff0cea4a 100644 --- a/src/racket/include/schthread.h +++ b/src/racket/include/schthread.h @@ -294,6 +294,7 @@ typedef struct Thread_Local_Variables { struct Scheme_Hash_Table *place_local_parallel_symbol_table_; struct FFI_Sync_Queue *ffi_sync_queue_; struct Scheme_GC_Pre_Post_Callback_Desc *gc_prepost_callback_descs_; + struct Scheme_Hash_Table *place_local_misc_table_; } Thread_Local_Variables; #if defined(IMPLEMENT_THREAD_LOCAL_VIA_PTHREADS) @@ -589,6 +590,7 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL; #define place_local_parallel_symbol_table XOA (scheme_get_thread_local_variables()->place_local_parallel_symbol_table_) #define ffi_sync_queue XOA (scheme_get_thread_local_variables()->ffi_sync_queue_) #define gc_prepost_callback_descs XOA (scheme_get_thread_local_variables()->gc_prepost_callback_descs_) +#define place_local_misc_table XOA (scheme_get_thread_local_variables()->place_local_misc_table_) /* **************************************** */ diff --git a/src/racket/src/schemef.h b/src/racket/src/schemef.h index 2621474fbd..4dc2e3f1e4 100644 --- a/src/racket/src/schemef.h +++ b/src/racket/src/schemef.h @@ -1128,4 +1128,5 @@ MZ_EXTERN int scheme_char_strlen(const mzchar *s); MZ_EXTERN Scheme_Object *scheme_stx_extract_marks(Scheme_Object *stx); +MZ_EXTERN Scheme_Object *scheme_get_place_table(void); MZ_EXTERN void *scheme_register_process_global(const char *key, void *val); diff --git a/src/racket/src/schemex.h b/src/racket/src/schemex.h index 843d606486..d23416ffbf 100644 --- a/src/racket/src/schemex.h +++ b/src/racket/src/schemex.h @@ -929,6 +929,7 @@ void (*scheme_signal_received_at)(void *); void *(*scheme_get_signal_handle)(); int (*scheme_char_strlen)(const mzchar *s); Scheme_Object *(*scheme_stx_extract_marks)(Scheme_Object *stx); +Scheme_Object *(*scheme_get_place_table)(void); void *(*scheme_register_process_global)(const char *key, void *val); #ifndef SCHEME_EX_INLINE } Scheme_Extension_Table; diff --git a/src/racket/src/schemex.inc b/src/racket/src/schemex.inc index c3090a1dea..5b08be1366 100644 --- a/src/racket/src/schemex.inc +++ b/src/racket/src/schemex.inc @@ -655,4 +655,5 @@ scheme_extension_table->scheme_get_signal_handle = scheme_get_signal_handle; scheme_extension_table->scheme_char_strlen = scheme_char_strlen; scheme_extension_table->scheme_stx_extract_marks = scheme_stx_extract_marks; + scheme_extension_table->scheme_get_place_table = scheme_get_place_table; scheme_extension_table->scheme_register_process_global = scheme_register_process_global; diff --git a/src/racket/src/schemexm.h b/src/racket/src/schemexm.h index 998743c940..0ad9fe40cd 100644 --- a/src/racket/src/schemexm.h +++ b/src/racket/src/schemexm.h @@ -655,6 +655,7 @@ #define scheme_get_signal_handle (scheme_extension_table->scheme_get_signal_handle) #define scheme_char_strlen (scheme_extension_table->scheme_char_strlen) #define scheme_stx_extract_marks (scheme_extension_table->scheme_stx_extract_marks) +#define scheme_get_place_table (scheme_extension_table->scheme_get_place_table) #define scheme_register_process_global (scheme_extension_table->scheme_register_process_global) #ifdef MZ_PRECISE_GC #pragma GC_VARIABLE_STACK_THOUGH_TABLE diff --git a/src/racket/src/thread.c b/src/racket/src/thread.c index 8b82ea693d..a60dd0b15c 100644 --- a/src/racket/src/thread.c +++ b/src/racket/src/thread.c @@ -239,6 +239,9 @@ THREAD_LOCAL_DECL(static Scheme_Object *recycle_cell); THREAD_LOCAL_DECL(static Scheme_Object *maybe_recycle_cell); THREAD_LOCAL_DECL(static int recycle_cc_count); +THREAD_LOCAL_DECL(struct Scheme_Hash_Table *place_local_misc_table); + + #ifdef MZ_PRECISE_GC extern long GC_get_memory_use(void *c); #else @@ -827,6 +830,7 @@ void scheme_init_thread_places(void) { REGISTER_SO(recycle_cell); REGISTER_SO(maybe_recycle_cell); REGISTER_SO(gc_prepost_callback_descs); + REGISTER_SO(place_local_misc_table); } void scheme_init_memtrace(Scheme_Env *env) @@ -2584,6 +2588,13 @@ void scheme_init_process_globals(void) #endif } +Scheme_Object *scheme_get_place_table(void) +{ + if (!place_local_misc_table) + place_local_misc_table = scheme_make_hash_table(SCHEME_hash_ptr); + return (Scheme_Object *)place_local_misc_table; +} + /*========================================================================*/ /* thread creation and swapping */ /*========================================================================*/