1 
2 /* Implements thread-local variables, which are all combined into one
3    big table.
4 
5    When thread-local variables are not needed, this file doesn't
6    declare them. Instead, declarations marked with
7    THREAD_LOCAL_DECL() are used.
8 
9    When thread-local variables are needed, then THREAD_LOCAL_DECL()
10    expands to nothing, and this file defines each thread-local variable
11    as a field in one big record. The record is accessed through a single
12    thread-local variable or through pthread_getspecific().
13 
14    Choose the names of thread-local variables carefully. The names are
15    globally visible, and macros to redirect uses of thread-local
16    variables can create trouble and poor error messages from the C
17    compiler if the same name is used for a local variable. */
18 
19 #ifndef SCHEME_THREADLOCAL_H
20 #define SCHEME_THREADLOCAL_H
21 
22 #include "mzconfig.h"
23 
24 # ifdef __cplusplus
25 extern "C" {
26 # endif
27 
28 #if defined(MZ_USE_PLACES) || defined(MZ_USE_FUTURES)
29 # define USE_THREAD_LOCAL
30 # ifdef _WIN32
31 #  if defined(_WIN64)
32 #   if defined(__MINGW32__)
33 #     define THREAD_LOCAL /* empty */
34 #     define IMPLEMENT_THREAD_LOCAL_VIA_WIN_TLS
35 #   else
36 #     define THREAD_LOCAL __declspec(thread)
37 #     define MZ_THREAD_EXTERN extern
38 #     define IMPLEMENT_THREAD_LOCAL_VIA_OFFSET
39 #     define IMPLEMENT_THREAD_LOCAL_EXTERNALLY_VIA_PROC
40 #   endif
41 #  else
42 #   define THREAD_LOCAL /* empty */
43 #   define IMPLEMENT_THREAD_LOCAL_VIA_WIN_TLS
44 #  endif
45 # elif (defined(__APPLE__) && defined(__MACH__)) || defined(GC2_PLACES_TESTING)
46 #  define IMPLEMENT_THREAD_LOCAL_VIA_PTHREADS
47 #  if defined(__x86_64__) || defined(__i386__)
48 #   define INLINE_GETSPECIFIC_ASSEMBLY_CODE
49 #  endif
50 # else
51 #  define THREAD_LOCAL __thread
52 # endif
53 #else
54 # define THREAD_LOCAL /* empty */
55 #endif
56 
57 /* Set up MZ_EXTERN for DLL build */
58 #if (defined(__WIN32__) || defined(WIN32) || defined(_WIN32) || defined(__CYGWIN32__)) \
59     && !defined(LINK_EXTENSIONS_BY_TABLE) \
60     && !defined(SCHEME_EMBEDDED_NO_DLL)
61 # define MZ_DLLIMPORT __declspec(dllimport)
62 # define MZ_DLLEXPORT __declspec(dllexport)
63 # if (defined(__mzscheme_private__) || defined(__MINGW32_DELAY_LOAD__) \
64       || defined(MZ_NO_LIBRACKET_DLL)                                  \
65       || (defined(__CYGWIN32__) && !defined(MZ_USES_SHARED_LIB)))
66 #  define MZ_DLLSPEC __declspec(dllexport)
67 # else
68 #  define MZ_DLLSPEC __declspec(dllimport)
69 # endif
70 # if (defined(__CYGWIN32__) && !defined(MZ_USES_SHARED_LIB)) || defined(MZ_PRECISE_GC)
71 #  define MZGC_DLLIMPORT
72 # else
73 #  define MZGC_DLLIMPORT MZ_DLLIMPORT
74 # endif
75 #else
76 # define MZ_DLLSPEC
77 # define MZ_DLLIMPORT
78 # define MZ_DLLEXPORT
79 # define MZGC_DLLIMPORT
80 #endif
81 
82 #define MZ_EXTERN extern MZ_DLLSPEC
83 
84 #ifndef MZ_THREAD_EXTERN
85 # define MZ_THREAD_EXTERN MZ_EXTERN
86 #endif
87 
88 MZ_EXTERN void scheme_init_os_thread(void);
89 
90 /* **************************************************************** */
91 /* Declarations that we wish were elsewhere, but are needed here to */
92 /* determine the size and type of some thread-local record fields.  */
93 /* **************************************************************** */
94 
95 #define STACK_COPY_CACHE_SIZE 10
96 #define BIGNUM_CACHE_SIZE 16
97 #define STACK_CACHE_SIZE 32
98 #define NUM_MORE_CONSTANT_STXES 24
99 
100   /* The number of cached scope sets should be a power of 2: */
101 #define NUM_RECENT_SCOPE_SETS 8
102 
103 /* This structure must be 4 words: */
104 typedef struct {
105   void *orig_return_address;
106   void *stack_frame;
107   struct Scheme_Object *cache;
108   void *orig_result;
109 } Stack_Cache_Elem;
110 
111 typedef intptr_t rxpos;
112 
113 struct gmp_tmp_stack
114 {
115   void *end;
116   void *alloc_point;
117   struct gmp_tmp_stack *prev;
118 };
119 
120 #ifndef MZ_PRECISE_GC
121 typedef intptr_t objhead;
122 #endif
123 
124 typedef void (*Scheme_Sleep_Proc)(float seconds, void *fds);
125 
126 typedef void (*Scheme_On_Atomic_Timeout_Proc)(void *data, int must_give_up);
127 
128 /* **************************************** */
129 
130 #ifndef USE_THREAD_LOCAL
131 
132 # define THREAD_LOCAL_DECL(x) x
133 
134 #else
135 
136 /* **************************************** */
137 
138 typedef struct Thread_Local_Variables {
139   int scheme_current_place_id_;
140   void **GC_variable_stack_;
141   struct NewGC *GC_instance_;
142   uintptr_t GC_gen0_alloc_page_ptr_;
143   uintptr_t GC_gen0_alloc_page_end_;
144   int GC_gen0_alloc_only_;
145   uintptr_t force_gc_for_place_accounting_;
146   uintptr_t scheme_os_thread_id_;
147   int scheme_starting_up_;
148   struct rktio_t *scheme_rktio_;
149   void *bignum_cache_[BIGNUM_CACHE_SIZE];
150   int cache_count_;
151   struct Scheme_Hash_Table *toplevels_ht_;
152   struct Scheme_Hash_Table *locals_ht_[2];
153   volatile int scheme_fuel_counter_;
154   uintptr_t scheme_stack_boundary_;
155   uintptr_t volatile scheme_jit_stack_boundary_;
156   volatile int scheme_future_need_gc_pause_;
157   int scheme_use_rtcall_;
158   int in_jit_critical_section_;
159   void *jit_buffer_cache_;
160   intptr_t jit_buffer_cache_size_;
161   int jit_buffer_cache_registered_;
162 #ifdef MZ_USE_MAP_JIT
163   int jit_code_write_enabled_;
164 #endif
165   int scheme_continuation_application_count_;
166   int scheme_cont_capture_count_;
167   int scheme_prompt_capture_count_;
168   struct Scheme_Prompt *available_prompt_;
169   struct Scheme_Prompt *available_cws_prompt_;
170   struct Scheme_Prompt *available_regular_prompt_;
171   struct Scheme_Dynamic_Wind *available_prompt_dw_;
172   struct Scheme_Meta_Continuation *available_prompt_mc_;
173   struct Scheme_Cont *offstack_cont_;
174   struct Scheme_Overflow *offstack_overflow_;
175   struct Scheme_Overflow_Jmp *scheme_overflow_jmp_;
176   void *scheme_overflow_stack_start_;
177   void **codetab_tree_;
178   int during_set_;
179   Stack_Cache_Elem stack_cache_stack_[STACK_CACHE_SIZE];
180   intptr_t stack_cache_stack_pos_;
181   struct Scheme_Object **fixup_runstack_base_;
182   int fixup_already_in_place_;
183   void *retry_alloc_r1_;
184   double scheme_jit_save_fp_;
185   double scheme_jit_save_fp2_;
186 #ifdef MZ_LONG_DOUBLE
187   mz_long_double scheme_jit_save_extfp_;
188   mz_long_double scheme_jit_save_extfp2_;
189 #endif
190   struct Scheme_Bucket_Table *starts_table_;
191   struct mz_proc_thread *proc_thread_self_;
192   struct Scheme_Object *scheme_orig_stdout_port_;
193   struct Scheme_Object *scheme_orig_stderr_port_;
194   struct Scheme_Object *scheme_orig_stdin_port_;
195   struct rktio_ltps_t *scheme_semaphore_fd_set_;
196   struct Scheme_Object *fs_change_props_;
197   struct Scheme_Custodian *new_port_cust_;
198   char *read_string_byte_buffer_;
199   struct ITimer_Data *itimerdata_;
200   char *quick_buffer_;
201   char *quick_encode_buffer_;
202   char *quick_print_buffer_;
203   struct Scheme_Hash_Table *cache_ht_;
204   char *regstr_;
205   char *regparsestr_;
206   int regmatchmin_;
207   int regmatchmax_;
208   int regmaxbackposn_;
209   int regsavepos_;
210   struct Scheme_Hash_Table *regbackknown_;
211   struct Scheme_Hash_Table *regbackdepends_;
212   rxpos regparse_;
213   rxpos regparse_end_;
214   int regnpar_;
215   int regncounter_;
216   rxpos regcode_;
217   rxpos regcodesize_;
218   rxpos regcodemax_;
219   intptr_t regmaxlookback_;
220   const char *regerrorwho_;
221   Scheme_Object *regerrorproc_;
222   Scheme_Object *regerrorval_;
223   intptr_t rx_buffer_size_;
224   rxpos *startp_buffer_cache_;
225   rxpos *endp_buffer_cache_;
226   rxpos *maybep_buffer_cache_;
227   rxpos *match_stack_buffer_cache_;
228   uintptr_t scheme_os_thread_stack_base_;
229   struct Scheme_Object *scheme_system_idle_channel_;
230   struct Scheme_Object *system_idle_put_evt_;
231   void *stack_copy_cache_[STACK_COPY_CACHE_SIZE];
232   intptr_t stack_copy_size_cache_[STACK_COPY_CACHE_SIZE];
233   int scc_pos_;
234   struct Scheme_Instance *scheme_startup_instance_;
235   struct startup_instance_top_t *c_startup_instance_top_;
236   struct Scheme_Thread *scheme_current_thread_;
237   struct Scheme_Thread *scheme_main_thread_;
238   struct Scheme_Thread *scheme_first_thread_;
239   struct Scheme_Thread *gc_prep_thread_chain_;
240   struct Scheme_Thread_Set *scheme_thread_set_top_;
241   struct Scheme_Current_LWC *scheme_current_lwc_;
242   intptr_t process_time_at_swap_;
243   intptr_t process_time_skips_;
244   int num_running_threads_;
245   int swap_no_setjmp_;
246   int thread_swap_count_;
247   int scheme_did_gc_count_;
248   struct Scheme_Future_State *scheme_future_state_;
249   struct Scheme_Future_Thread_State *scheme_future_thread_state_;
250   void *jit_future_storage_[4];
251   struct Scheme_Object **scheme_current_runstack_start_;
252   struct Scheme_Object **scheme_current_runstack_;
253   intptr_t scheme_current_cont_mark_stack_;
254   intptr_t scheme_current_cont_mark_pos_;
255   struct Scheme_Custodian *main_custodian_;
256   struct Scheme_Hash_Table *limited_custodians_;
257   struct Scheme_Plumber *initial_plumber_;
258   struct Scheme_Config *initial_config_;
259   struct Scheme_Thread *swap_target_;
260   struct Scheme_Object *scheduled_kills_;
261   struct Scheme_Hash_Table *late_will_executors_with_pending_;
262   int do_atomic_;
263   int missed_context_switch_;
264   int all_breaks_disabled_;
265   int have_activity_;
266   int scheme_active_but_sleeping_;
267   int thread_ended_with_activity_;
268   int scheme_no_stack_overflow_;
269   int needs_sleep_cancelled_;
270   double needs_sleep_time_end_;
271   int tls_pos_;
272   struct Scheme_Object *the_nested_exn_handler_;
273   struct Scheme_Object *cust_closers_;
274   struct Scheme_Object *thread_swap_callbacks_;
275   struct Scheme_Object *thread_swap_out_callbacks_;
276   struct Scheme_Object *recycle_cell_;
277   struct Scheme_Object *maybe_recycle_cell_;
278   int recycle_cc_count_;
279   void *gmp_mem_pool_;
280   uintptr_t max_total_allocation_;
281   uintptr_t current_total_allocation_;
282   struct gmp_tmp_stack gmp_tmp_xxx_;
283   struct gmp_tmp_stack *gmp_tmp_current_;
284   struct Scheme_Logger *scheme_main_logger_;
285   struct Scheme_Logger *scheme_gc_logger_;
286   struct Scheme_Logger *scheme_future_logger_;
287   struct Scheme_Logger *scheme_place_logger_;
288   int scheme_overflow_count_;
289   struct Scheme_Object *original_pwd_;
290   void *file_path_wc_buffer_;
291   intptr_t scheme_hash_request_count_;
292   intptr_t scheme_hash_iteration_count_;
293   struct Scheme_Bucket_Table *scheme_namespace_to_env_;
294   int special_is_ok_;
295   int scheme_force_port_closed_;
296   int fd_reserved_;
297   struct rktio_fd_t *the_fd_;
298   int scheme_num_read_syntax_objects_;
299   struct Scheme_Load_Delay *clear_bytes_chain_;
300   const char *failure_msg_for_read_;
301   void **dgc_array_;
302   int *dgc_count_;
303   int dgc_size_;
304   void (*save_oom_)(void);
305   int current_lifetime_;
306   int scheme_main_was_once_suspended_;
307   int buffer_init_size_;
308   uintptr_t scheme_total_gc_time_;
309   uintptr_t start_this_gc_time_;
310   uintptr_t end_this_gc_time_;
311   double start_this_gc_real_time_;
312   double end_this_gc_real_time_;
313   struct Scheme_Struct_Type *gc_info_prefab_;
314   struct Scheme_Struct_Type *place_event_prefab_;
315   volatile short delayed_break_ready_;
316   struct Scheme_Thread *main_break_target_thread_;
317   intptr_t scheme_code_page_total_;
318   intptr_t scheme_code_total_;
319   intptr_t scheme_code_count_;
320   intptr_t max_gc_pre_used_bytes_;
321   intptr_t max_code_page_total_;
322   int num_major_garbage_collections_;
323   int num_minor_garbage_collections_;
324   int locale_on_;
325   void *current_locale_name_ptr_;
326   char *cached_locale_encoding_name_;
327   struct rktio_converter_t *cached_locale_to_converter_;
328   struct rktio_converter_t *cached_locale_from_converter_;
329   int gensym_counter_;
330   struct Scheme_Object *dummy_input_port_;
331   struct Scheme_Object *dummy_output_port_;
332   struct Scheme_Hash_Table *opened_libs_;
333   struct mzrt_mutex *jit_lock_;
334   struct free_list_entry *free_list_;
335   int free_list_bucket_count_;
336   void *code_allocation_page_list_;
337   struct Scheme_Bucket_Table *prefab_table_;
338   struct Scheme_Hash_Table *place_local_symbol_table_;
339   struct Scheme_Hash_Table *place_local_keyword_table_;
340   struct Scheme_Hash_Table *place_local_parallel_symbol_table_;
341   struct Scheme_Bucket_Table *literal_string_table_;
342   struct Scheme_Bucket_Table *literal_number_table_;
343   struct FFI_Sync_Queue *ffi_sync_queue_;
344   struct Scheme_GC_Pre_Post_Callback_Desc *gc_prepost_callback_descs_;
345   struct Scheme_Hash_Table *place_local_misc_table_;
346   int place_evts_array_size_;
347   struct Evt **place_evts_;
348   struct Scheme_Place_Object *place_object_;
349   struct Scheme_Place *all_child_places_;
350   struct Scheme_Place_Bi_Channel_Link *place_channel_links_;
351   struct Scheme_Object **reusable_ifs_stack_;
352   struct Scheme_Object *group_member_cache_;
353   struct Scheme_Prefix *scheme_prefix_finalize_;
354   struct Scheme_Prefix *scheme_inc_prefix_finalize_;
355   struct Scheme_Hash_Table *loaded_extensions_;
356   struct Scheme_Hash_Table *fullpath_loaded_extensions_;
357   Scheme_Sleep_Proc scheme_place_sleep_;
358   struct Scheme_Object *thread_sleep_callback_;
359   int thread_sleep_callback_fd_;
360   struct GHBN_Thread_Data *ghbn_thread_data_;
361   Scheme_On_Atomic_Timeout_Proc on_atomic_timeout_;
362   void *on_atomic_timeout_data_;
363   int atomic_timeout_auto_suspend_;
364   int atomic_timeout_atomic_level_;
365   struct Scheme_Object *configuration_callback_cache_[2];
366   struct FFI_Orig_Place_Call *cached_orig_place_todo_;
367   struct Scheme_Hash_Table *ffi_lock_ht_;
368   struct Scheme_Object *is_syntax_proc_;
369   struct Scheme_Object *expander_syntax_to_datum_proc_;
370   struct Scheme_Hash_Table *local_primitive_tables_;
371   struct Scheme_Object *current_linklet_native_lambdas_;
372 } Thread_Local_Variables;
373 
374 #if defined(IMPLEMENT_THREAD_LOCAL_VIA_PTHREADS)
375 /* Using Pthread getspecific() */
376 # include <pthread.h>
377 MZ_EXTERN pthread_key_t scheme_thread_local_key;
378 # if defined(__APPLE__) && defined(__MACH__)
379 # define PREFER_TO_CACHE_THREAD_LOCAL
380 MZ_EXTERN int scheme_thread_local_offset;
381 # endif
382 # ifndef INLINE_GETSPECIFIC_ASSEMBLY_CODE
383 #  define scheme_get_thread_local_variables() ((Thread_Local_Variables *)pthread_getspecific(scheme_thread_local_key))
384 #  ifdef MZ_XFORM
385 XFORM_GC_VARIABLE_STACK_THROUGH_GETSPECIFIC;
386 #  endif
387 # else
388 #  ifdef MZ_XFORM
389 START_XFORM_SKIP;
390 #  endif
391 static inline Thread_Local_Variables *scheme_get_thread_local_variables(void) __attribute__((used));
scheme_get_thread_local_variables(void)392 static inline Thread_Local_Variables *scheme_get_thread_local_variables(void) {
393   Thread_Local_Variables *x = NULL;
394 #  if defined(__APPLE__) && defined(__MACH__)
395 #   if defined(__x86_64__)
396   asm("movq %%gs:0(%1,%2,8), %0" : "=r"(x) : "r"(scheme_thread_local_offset), "r"((int)scheme_thread_local_key));
397 #   else
398   asm("movl %%gs:0(%1,%2,4), %0" : "=r"(x) : "r"(scheme_thread_local_offset), "r"(scheme_thread_local_key));
399 #   endif
400 #  elif defined(linux)
401 #   if defined(__x86_64__)
402   asm( "mov %1, %%eax;"
403   "shl $0x4, %%rax;"
404   "mov %%fs:0x10, %%rdx;"
405   "mov 0x118(%%rax,%%rdx), %0;"
406       :"=r"(x)        /* output */
407       :"r"(scheme_thread_local_key)
408       :"%rax", "%rdx"  /* clobbered register */
409      );
410 #   else
411 #    error scheme_get_thread_local_variables no defined on this platform
412 #   endif
413 #  else
414 #    error scheme_get_thread_local_variables no defined on this platform
415 #  endif
416   return x;
417 }
418 #  ifdef MZ_XFORM
419 END_XFORM_SKIP;
420 XFORM_GC_VARIABLE_STACK_THROUGH_FUNCTION;
421 #  endif
422 # endif
423 #elif defined(IMPLEMENT_THREAD_LOCAL_VIA_PROCEDURE)
424 /* Using external scheme_get_thread_local_variables() procedure */
425 MZ_EXTERN Thread_Local_Variables *scheme_get_thread_local_variables(void);
426 # ifdef MZ_XFORM
427 XFORM_GC_VARIABLE_STACK_THROUGH_FUNCTION;
428 # endif
429 #elif defined(IMPLEMENT_THREAD_LOCAL_VIA_WIN_TLS)
430 # ifdef MZ_XFORM
431 START_XFORM_SKIP;
432 # endif
433 MZ_EXTERN Thread_Local_Variables *scheme_external_get_thread_local_variables(void);
434 # ifdef __mzscheme_private__
435 /* In the Racket DLL, need thread-local to be fast: */
436 MZ_EXTERN uintptr_t scheme_tls_delta;
437 #  ifdef MZ_USE_WIN_TLS_VIA_DLL
438 MZ_EXTERN int scheme_tls_index;
439 #  endif
scheme_get_thread_local_variables_ptr(void)440 static __inline Thread_Local_Variables **scheme_get_thread_local_variables_ptr(void) {
441 # ifdef __MINGW32__
442   Thread_Local_Variables **x;
443 #  ifdef _WIN64
444   asm (
445        "mov %%gs:(0x58), %%rax;"
446        "mov (%%rax), %%rax;"
447        "add %1, %%rax;"
448        "mov %%rax, %0;"
449        :"=r"(x)        /* output */
450        :"r"(scheme_tls_delta)
451        :"%rax"  /* clobbered register */
452        );
453 #  else
454   asm (
455        "mov %%fs:(0x2C), %%eax;"
456        "mov (%%eax), %%eax;"
457        "add %1, %%eax;"
458        "mov %%eax, %0;"
459        :"=r"(x)        /* output */
460        :"r"(scheme_tls_delta)
461        :"%eax"  /* clobbered register */
462        );
463 #  endif
464   return x;
465 # else
466   __asm { mov eax, FS:[0x2C]
467 #  ifdef MZ_USE_WIN_TLS_VIA_DLL
468           add eax, scheme_tls_index
469 #  endif
470           mov eax, [eax]
471           add eax, scheme_tls_delta }
472   /* result is in eax */
473 # endif
474 }
scheme_get_thread_local_variables(void)475 static __inline Thread_Local_Variables *scheme_get_thread_local_variables(void) {
476   return *scheme_get_thread_local_variables_ptr();
477 }
478 # else
479 /* Outside the Racket DLL, slower thread-local is ok: */
scheme_get_thread_local_variables(void)480 static __inline Thread_Local_Variables *scheme_get_thread_local_variables(void) {
481   return scheme_external_get_thread_local_variables();
482 }
483 # endif
484 # ifdef MZ_XFORM
485 END_XFORM_SKIP;
486 XFORM_GC_VARIABLE_STACK_THROUGH_FUNCTION;
487 # endif
488 #else
489 /* Using `THREAD_LOCAL' variable: */
490 # if defined(IMPLEMENT_THREAD_LOCAL_EXTERNALLY_VIA_PROC) && !defined(__mzscheme_private__)
491 #  ifdef MZ_XFORM
492 START_XFORM_SKIP;
493 #  endif
494 MZ_EXTERN Thread_Local_Variables *scheme_external_get_thread_local_variables(void);
scheme_get_thread_local_variables(void)495 static __inline Thread_Local_Variables *scheme_get_thread_local_variables(void) {
496   return scheme_external_get_thread_local_variables();
497 }
498 #  ifdef MZ_XFORM
499 END_XFORM_SKIP;
500 XFORM_GC_VARIABLE_STACK_THROUGH_FUNCTION;
501 #  endif
502 # elif defined (IMPLEMENT_THREAD_LOCAL_VIA_OFFSET)
503 MZ_THREAD_EXTERN THREAD_LOCAL Thread_Local_Variables scheme_thread_locals_space;
504 extern int scheme_tls_delta;
505 #  define scheme_get_thread_local_variables() ((Thread_Local_Variables *)((char *)&scheme_thread_locals_space + scheme_tls_delta))
506 #  ifdef MZ_XFORM
507 XFORM_GC_VARIABLE_STACK_THROUGH_DELTA;
508 #  endif
509 # else
510 MZ_THREAD_EXTERN THREAD_LOCAL Thread_Local_Variables scheme_thread_locals;
511 #  define scheme_get_thread_local_variables() (&scheme_thread_locals)
512 #  ifdef MZ_XFORM
513 XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL;
514 #  endif
515 # endif
516 #endif
517 
518 /* **************************************** */
519 
520 #ifdef MZ_XFORM
521 # define XOA XFORM_OK_ASSIGN
522 #else
523 # define XOA /* empty */
524 #endif
525 
526 #define scheme_current_place_id XOA (scheme_get_thread_local_variables()->scheme_current_place_id_)
527 #define GC_objhead_template XOA (scheme_get_thread_local_variables()->GC_objhead_template_)
528 #define GC_instance XOA (scheme_get_thread_local_variables()->GC_instance_)
529 #define GC_gen0_alloc_page_ptr XOA (scheme_get_thread_local_variables()->GC_gen0_alloc_page_ptr_)
530 #define GC_gen0_alloc_page_end XOA (scheme_get_thread_local_variables()->GC_gen0_alloc_page_end_)
531 #define GC_gen0_alloc_only XOA (scheme_get_thread_local_variables()->GC_gen0_alloc_only_)
532 #define GC_variable_stack XOA (scheme_get_thread_local_variables()->GC_variable_stack_)
533 #define force_gc_for_place_accounting XOA (scheme_get_thread_local_variables()->force_gc_for_place_accounting_)
534 #define scheme_os_thread_id XOA (scheme_get_thread_local_variables()->scheme_os_thread_id_)
535 #define scheme_starting_up XOA (scheme_get_thread_local_variables()->scheme_starting_up_)
536 #define scheme_rktio XOA (scheme_get_thread_local_variables()->scheme_rktio_)
537 #define bignum_cache XOA (scheme_get_thread_local_variables()->bignum_cache_)
538 #define cache_count XOA (scheme_get_thread_local_variables()->cache_count_)
539 #define toplevels_ht XOA (scheme_get_thread_local_variables()->toplevels_ht_)
540 #define locals_ht XOA (scheme_get_thread_local_variables()->locals_ht_)
541 #define scheme_fuel_counter XOA (scheme_get_thread_local_variables()->scheme_fuel_counter_)
542 #define scheme_stack_boundary XOA (scheme_get_thread_local_variables()->scheme_stack_boundary_)
543 #define scheme_jit_stack_boundary XOA (scheme_get_thread_local_variables()->scheme_jit_stack_boundary_)
544 #define scheme_future_need_gc_pause XOA (scheme_get_thread_local_variables()->scheme_future_need_gc_pause_)
545 #define scheme_use_rtcall XOA (scheme_get_thread_local_variables()->scheme_use_rtcall_)
546 #define in_jit_critical_section XOA (scheme_get_thread_local_variables()->in_jit_critical_section_)
547 #define jit_buffer_cache XOA (scheme_get_thread_local_variables()->jit_buffer_cache_)
548 #define jit_buffer_cache_size XOA (scheme_get_thread_local_variables()->jit_buffer_cache_size_)
549 #define jit_buffer_cache_registered XOA (scheme_get_thread_local_variables()->jit_buffer_cache_registered_)
550 #define jit_code_write_enabled XOA (scheme_get_thread_local_variables()->jit_code_write_enabled_)
551 #define scheme_continuation_application_count XOA (scheme_get_thread_local_variables()->scheme_continuation_application_count_)
552 #define scheme_cont_capture_count XOA (scheme_get_thread_local_variables()->scheme_cont_capture_count_)
553 #define scheme_prompt_capture_count XOA (scheme_get_thread_local_variables()->scheme_prompt_capture_count_)
554 #define available_prompt XOA (scheme_get_thread_local_variables()->available_prompt_)
555 #define available_cws_prompt XOA (scheme_get_thread_local_variables()->available_cws_prompt_)
556 #define available_regular_prompt XOA (scheme_get_thread_local_variables()->available_regular_prompt_)
557 #define available_prompt_dw XOA (scheme_get_thread_local_variables()->available_prompt_dw_)
558 #define available_prompt_mc XOA (scheme_get_thread_local_variables()->available_prompt_mc_)
559 #define offstack_cont XOA (scheme_get_thread_local_variables()->offstack_cont_)
560 #define offstack_overflow XOA (scheme_get_thread_local_variables()->offstack_overflow_)
561 #define scheme_overflow_jmp XOA (scheme_get_thread_local_variables()->scheme_overflow_jmp_)
562 #define scheme_overflow_stack_start XOA (scheme_get_thread_local_variables()->scheme_overflow_stack_start_)
563 #define codetab_tree XOA (scheme_get_thread_local_variables()->codetab_tree_)
564 #define during_set XOA (scheme_get_thread_local_variables()->during_set_)
565 #define thread_local_pointers XOA (scheme_get_thread_local_variables()->thread_local_pointers_)
566 #define stack_cache_stack XOA (scheme_get_thread_local_variables()->stack_cache_stack_)
567 #define stack_cache_stack_pos XOA (scheme_get_thread_local_variables()->stack_cache_stack_pos_)
568 #define fixup_runstack_base XOA (scheme_get_thread_local_variables()->fixup_runstack_base_)
569 #define fixup_already_in_place XOA (scheme_get_thread_local_variables()->fixup_already_in_place_)
570 #define retry_alloc_r1 XOA (scheme_get_thread_local_variables()->retry_alloc_r1_)
571 #define scheme_jit_save_fp XOA (scheme_get_thread_local_variables()->scheme_jit_save_fp_)
572 #define scheme_jit_save_fp2 XOA (scheme_get_thread_local_variables()->scheme_jit_save_fp2_)
573 #ifdef MZ_LONG_DOUBLE
574 #define scheme_jit_save_extfp XOA (scheme_get_thread_local_variables()->scheme_jit_save_extfp_)
575 #define scheme_jit_save_extfp2 XOA (scheme_get_thread_local_variables()->scheme_jit_save_extfp2_)
576 #endif
577 #define starts_table XOA (scheme_get_thread_local_variables()->starts_table_)
578 #define proc_thread_self XOA (scheme_get_thread_local_variables()->proc_thread_self_)
579 #define scheme_orig_stdout_port XOA (scheme_get_thread_local_variables()->scheme_orig_stdout_port_)
580 #define scheme_orig_stderr_port XOA (scheme_get_thread_local_variables()->scheme_orig_stderr_port_)
581 #define scheme_orig_stdin_port XOA (scheme_get_thread_local_variables()->scheme_orig_stdin_port_)
582 #define scheme_semaphore_fd_set XOA (scheme_get_thread_local_variables()->scheme_semaphore_fd_set_)
583 #define fs_change_props XOA (scheme_get_thread_local_variables()->fs_change_props_)
584 #define new_port_cust XOA (scheme_get_thread_local_variables()->new_port_cust_)
585 #define read_string_byte_buffer XOA (scheme_get_thread_local_variables()->read_string_byte_buffer_)
586 #define itimerdata XOA (scheme_get_thread_local_variables()->itimerdata_)
587 #define quick_buffer XOA (scheme_get_thread_local_variables()->quick_buffer_)
588 #define quick_encode_buffer XOA (scheme_get_thread_local_variables()->quick_encode_buffer_)
589 #define quick_print_buffer XOA (scheme_get_thread_local_variables()->quick_print_buffer_)
590 #define cache_ht XOA (scheme_get_thread_local_variables()->cache_ht_)
591 #define regstr XOA (scheme_get_thread_local_variables()->regstr_)
592 #define regparsestr XOA (scheme_get_thread_local_variables()->regparsestr_)
593 #define regmatchmin XOA (scheme_get_thread_local_variables()->regmatchmin_)
594 #define regmatchmax XOA (scheme_get_thread_local_variables()->regmatchmax_)
595 #define regmaxbackposn XOA (scheme_get_thread_local_variables()->regmaxbackposn_)
596 #define regsavepos XOA (scheme_get_thread_local_variables()->regsavepos_)
597 #define regbackknown XOA (scheme_get_thread_local_variables()->regbackknown_)
598 #define regbackdepends XOA (scheme_get_thread_local_variables()->regbackdepends_)
599 #define regparse XOA (scheme_get_thread_local_variables()->regparse_)
600 #define regparse_end XOA (scheme_get_thread_local_variables()->regparse_end_)
601 #define regnpar XOA (scheme_get_thread_local_variables()->regnpar_)
602 #define regncounter XOA (scheme_get_thread_local_variables()->regncounter_)
603 #define regcode XOA (scheme_get_thread_local_variables()->regcode_)
604 #define regcodesize XOA (scheme_get_thread_local_variables()->regcodesize_)
605 #define regcodemax XOA (scheme_get_thread_local_variables()->regcodemax_)
606 #define regmaxlookback XOA (scheme_get_thread_local_variables()->regmaxlookback_)
607 #define regerrorwho XOA (scheme_get_thread_local_variables()->regerrorwho_)
608 #define regerrorproc XOA (scheme_get_thread_local_variables()->regerrorproc_)
609 #define regerrorval XOA (scheme_get_thread_local_variables()->regerrorval_)
610 #define rx_buffer_size XOA (scheme_get_thread_local_variables()->rx_buffer_size_)
611 #define startp_buffer_cache XOA (scheme_get_thread_local_variables()->startp_buffer_cache_)
612 #define endp_buffer_cache XOA (scheme_get_thread_local_variables()->endp_buffer_cache_)
613 #define maybep_buffer_cache XOA (scheme_get_thread_local_variables()->maybep_buffer_cache_)
614 #define match_stack_buffer_cache XOA (scheme_get_thread_local_variables()->match_stack_buffer_cache_)
615 #define scheme_os_thread_stack_base XOA (scheme_get_thread_local_variables()->scheme_os_thread_stack_base_)
616 #define scheme_system_idle_channel XOA (scheme_get_thread_local_variables()->scheme_system_idle_channel_)
617 #define system_idle_put_evt XOA (scheme_get_thread_local_variables()->system_idle_put_evt_)
618 #define stack_copy_cache XOA (scheme_get_thread_local_variables()->stack_copy_cache_)
619 #define stack_copy_size_cache XOA (scheme_get_thread_local_variables()->stack_copy_size_cache_)
620 #define scc_pos XOA (scheme_get_thread_local_variables()->scc_pos_)
621 #define scheme_startup_instance XOA (scheme_get_thread_local_variables()->scheme_startup_instance_)
622 #define c_startup_instance_top XOA (scheme_get_thread_local_variables()->c_startup_instance_top_)
623 #define scheme_current_thread XOA (scheme_get_thread_local_variables()->scheme_current_thread_)
624 #define scheme_main_thread XOA (scheme_get_thread_local_variables()->scheme_main_thread_)
625 #define scheme_first_thread XOA (scheme_get_thread_local_variables()->scheme_first_thread_)
626 #define gc_prep_thread_chain XOA (scheme_get_thread_local_variables()->gc_prep_thread_chain_)
627 #define scheme_thread_set_top XOA (scheme_get_thread_local_variables()->scheme_thread_set_top_)
628 #define scheme_current_lwc XOA (scheme_get_thread_local_variables()->scheme_current_lwc_)
629 #define num_running_threads XOA (scheme_get_thread_local_variables()->num_running_threads_)
630 #define swap_no_setjmp XOA (scheme_get_thread_local_variables()->swap_no_setjmp_)
631 #define thread_swap_count XOA (scheme_get_thread_local_variables()->thread_swap_count_)
632 #define process_time_at_swap XOA (scheme_get_thread_local_variables()->process_time_at_swap_)
633 #define process_time_skips XOA (scheme_get_thread_local_variables()->process_time_skips_)
634 #define scheme_did_gc_count XOA (scheme_get_thread_local_variables()->scheme_did_gc_count_)
635 #define scheme_future_state XOA (scheme_get_thread_local_variables()->scheme_future_state_)
636 #define scheme_future_thread_state XOA (scheme_get_thread_local_variables()->scheme_future_thread_state_)
637 #define jit_future_storage XOA (scheme_get_thread_local_variables()->jit_future_storage_)
638 #define scheme_current_runstack_start XOA (scheme_get_thread_local_variables()->scheme_current_runstack_start_)
639 #define scheme_current_runstack XOA (scheme_get_thread_local_variables()->scheme_current_runstack_)
640 #define scheme_current_cont_mark_stack XOA (scheme_get_thread_local_variables()->scheme_current_cont_mark_stack_)
641 #define scheme_current_cont_mark_pos XOA (scheme_get_thread_local_variables()->scheme_current_cont_mark_pos_)
642 #define main_custodian XOA (scheme_get_thread_local_variables()->main_custodian_)
643 #define last_custodian XOA (scheme_get_thread_local_variables()->last_custodian_)
644 #define limited_custodians XOA (scheme_get_thread_local_variables()->limited_custodians_)
645 #define initial_plumber XOA (scheme_get_thread_local_variables()->initial_plumber_)
646 #define initial_config XOA (scheme_get_thread_local_variables()->initial_config_)
647 #define swap_target XOA (scheme_get_thread_local_variables()->swap_target_)
648 #define scheduled_kills XOA (scheme_get_thread_local_variables()->scheduled_kills_)
649 #define late_will_executors_with_pending XOA (scheme_get_thread_local_variables()->late_will_executors_with_pending_)
650 #define do_atomic XOA (scheme_get_thread_local_variables()->do_atomic_)
651 #define missed_context_switch XOA (scheme_get_thread_local_variables()->missed_context_switch_)
652 #define all_breaks_disabled XOA (scheme_get_thread_local_variables()->all_breaks_disabled_)
653 #define have_activity XOA (scheme_get_thread_local_variables()->have_activity_)
654 #define scheme_active_but_sleeping XOA (scheme_get_thread_local_variables()->scheme_active_but_sleeping_)
655 #define thread_ended_with_activity XOA (scheme_get_thread_local_variables()->thread_ended_with_activity_)
656 #define scheme_no_stack_overflow XOA (scheme_get_thread_local_variables()->scheme_no_stack_overflow_)
657 #define needs_sleep_cancelled XOA (scheme_get_thread_local_variables()->needs_sleep_cancelled_)
658 #define needs_sleep_time_end XOA (scheme_get_thread_local_variables()->needs_sleep_time_end_)
659 #define tls_pos XOA (scheme_get_thread_local_variables()->tls_pos_)
660 #define the_nested_exn_handler XOA (scheme_get_thread_local_variables()->the_nested_exn_handler_)
661 #define cust_closers XOA (scheme_get_thread_local_variables()->cust_closers_)
662 #define thread_swap_callbacks XOA (scheme_get_thread_local_variables()->thread_swap_callbacks_)
663 #define thread_swap_out_callbacks XOA (scheme_get_thread_local_variables()->thread_swap_out_callbacks_)
664 #define recycle_cell XOA (scheme_get_thread_local_variables()->recycle_cell_)
665 #define maybe_recycle_cell XOA (scheme_get_thread_local_variables()->maybe_recycle_cell_)
666 #define recycle_cc_count XOA (scheme_get_thread_local_variables()->recycle_cc_count_)
667 #define gmp_mem_pool XOA (scheme_get_thread_local_variables()->gmp_mem_pool_)
668 #define max_total_allocation XOA (scheme_get_thread_local_variables()->max_total_allocation_)
669 #define current_total_allocation XOA (scheme_get_thread_local_variables()->current_total_allocation_)
670 #define gmp_tmp_xxx XOA (scheme_get_thread_local_variables()->gmp_tmp_xxx_)
671 #define gmp_tmp_current XOA (scheme_get_thread_local_variables()->gmp_tmp_current_)
672 #define scheme_main_logger XOA (scheme_get_thread_local_variables()->scheme_main_logger_)
673 #define scheme_gc_logger XOA (scheme_get_thread_local_variables()->scheme_gc_logger_)
674 #define scheme_future_logger XOA (scheme_get_thread_local_variables()->scheme_future_logger_)
675 #define scheme_place_logger XOA (scheme_get_thread_local_variables()->scheme_place_logger_)
676 #define scheme_overflow_count XOA (scheme_get_thread_local_variables()->scheme_overflow_count_)
677 #define original_pwd XOA (scheme_get_thread_local_variables()->original_pwd_)
678 #define file_path_wc_buffer XOA (scheme_get_thread_local_variables()->file_path_wc_buffer_)
679 #define scheme_hash_request_count XOA (scheme_get_thread_local_variables()->scheme_hash_request_count_)
680 #define scheme_hash_iteration_count XOA (scheme_get_thread_local_variables()->scheme_hash_iteration_count_)
681 #define scheme_namespace_to_env XOA (scheme_get_thread_local_variables()->scheme_namespace_to_env_)
682 #define special_is_ok XOA (scheme_get_thread_local_variables()->special_is_ok_)
683 #define scheme_force_port_closed XOA (scheme_get_thread_local_variables()->scheme_force_port_closed_)
684 #define fd_reserved XOA (scheme_get_thread_local_variables()->fd_reserved_)
685 #define the_fd XOA (scheme_get_thread_local_variables()->the_fd_)
686 #define scheme_num_read_syntax_objects XOA (scheme_get_thread_local_variables()->scheme_num_read_syntax_objects_)
687 #define clear_bytes_chain XOA (scheme_get_thread_local_variables()->clear_bytes_chain_)
688 #define failure_msg_for_read XOA (scheme_get_thread_local_variables()->failure_msg_for_read_)
689 #define dgc_array XOA (scheme_get_thread_local_variables()->dgc_array_)
690 #define dgc_count XOA (scheme_get_thread_local_variables()->dgc_count_)
691 #define dgc_size XOA (scheme_get_thread_local_variables()->dgc_size_)
692 #define save_oom XOA (scheme_get_thread_local_variables()->save_oom_)
693 #define current_lifetime XOA (scheme_get_thread_local_variables()->current_lifetime_)
694 #define scheme_main_was_once_suspended XOA (scheme_get_thread_local_variables()->scheme_main_was_once_suspended_)
695 #define buffer_init_size XOA (scheme_get_thread_local_variables()->buffer_init_size_)
696 #define scheme_total_gc_time XOA (scheme_get_thread_local_variables()->scheme_total_gc_time_)
697 #define start_this_gc_time XOA (scheme_get_thread_local_variables()->start_this_gc_time_)
698 #define end_this_gc_time XOA (scheme_get_thread_local_variables()->end_this_gc_time_)
699 #define start_this_gc_real_time XOA (scheme_get_thread_local_variables()->start_this_gc_real_time_)
700 #define end_this_gc_real_time XOA (scheme_get_thread_local_variables()->end_this_gc_real_time_)
701 #define gc_info_prefab XOA (scheme_get_thread_local_variables()->gc_info_prefab_)
702 #define place_event_prefab XOA (scheme_get_thread_local_variables()->place_event_prefab_)
703 #define delayed_break_ready XOA (scheme_get_thread_local_variables()->delayed_break_ready_)
704 #define main_break_target_thread XOA (scheme_get_thread_local_variables()->main_break_target_thread_)
705 #define scheme_code_page_total XOA (scheme_get_thread_local_variables()->scheme_code_page_total_)
706 #define scheme_code_total XOA (scheme_get_thread_local_variables()->scheme_code_total_)
707 #define scheme_code_count XOA (scheme_get_thread_local_variables()->scheme_code_count_)
708 #define max_gc_pre_used_bytes XOA (scheme_get_thread_local_variables()->max_gc_pre_used_bytes_)
709 #define max_code_page_total XOA (scheme_get_thread_local_variables()->max_code_page_total_)
710 #define num_major_garbage_collections XOA (scheme_get_thread_local_variables()->num_major_garbage_collections_)
711 #define num_minor_garbage_collections XOA (scheme_get_thread_local_variables()->num_minor_garbage_collections_)
712 #define locale_on XOA (scheme_get_thread_local_variables()->locale_on_)
713 #define current_locale_name_ptr XOA (scheme_get_thread_local_variables()->current_locale_name_ptr_)
714 #define cached_locale_encoding_name XOA (scheme_get_thread_local_variables()->cached_locale_encoding_name_)
715 #define cached_locale_to_converter XOA (scheme_get_thread_local_variables()->cached_locale_to_converter_)
716 #define cached_locale_from_converter XOA (scheme_get_thread_local_variables()->cached_locale_from_converter_)
717 #define gensym_counter XOA (scheme_get_thread_local_variables()->gensym_counter_)
718 #define dummy_input_port XOA (scheme_get_thread_local_variables()->dummy_input_port_)
719 #define dummy_output_port XOA (scheme_get_thread_local_variables()->dummy_output_port_)
720 #define opened_libs XOA (scheme_get_thread_local_variables()->opened_libs_)
721 #define jit_lock XOA (scheme_get_thread_local_variables()->jit_lock_)
722 #define free_list XOA (scheme_get_thread_local_variables()->free_list_)
723 #define free_list_bucket_count XOA (scheme_get_thread_local_variables()->free_list_bucket_count_)
724 #define code_allocation_page_list XOA (scheme_get_thread_local_variables()->code_allocation_page_list_)
725 #define prefab_table XOA (scheme_get_thread_local_variables()->prefab_table_)
726 #define place_local_symbol_table XOA (scheme_get_thread_local_variables()->place_local_symbol_table_)
727 #define place_local_keyword_table XOA (scheme_get_thread_local_variables()->place_local_keyword_table_)
728 #define place_local_parallel_symbol_table XOA (scheme_get_thread_local_variables()->place_local_parallel_symbol_table_)
729 #define literal_string_table XOA (scheme_get_thread_local_variables()->literal_string_table_)
730 #define literal_number_table XOA (scheme_get_thread_local_variables()->literal_number_table_)
731 #define ffi_sync_queue XOA (scheme_get_thread_local_variables()->ffi_sync_queue_)
732 #define gc_prepost_callback_descs XOA (scheme_get_thread_local_variables()->gc_prepost_callback_descs_)
733 #define place_local_misc_table XOA (scheme_get_thread_local_variables()->place_local_misc_table_)
734 #define place_evts_array_size XOA (scheme_get_thread_local_variables()->place_evts_array_size_)
735 #define place_evts XOA (scheme_get_thread_local_variables()->place_evts_)
736 #define place_object XOA (scheme_get_thread_local_variables()->place_object_)
737 #define all_child_places XOA (scheme_get_thread_local_variables()->all_child_places_)
738 #define place_channel_links XOA (scheme_get_thread_local_variables()->place_channel_links_)
739 #define reusable_ifs_stack XOA (scheme_get_thread_local_variables()->reusable_ifs_stack_)
740 #define group_member_cache XOA (scheme_get_thread_local_variables()->group_member_cache_)
741 #define scheme_prefix_finalize XOA (scheme_get_thread_local_variables()->scheme_prefix_finalize_)
742 #define scheme_inc_prefix_finalize XOA (scheme_get_thread_local_variables()->scheme_inc_prefix_finalize_)
743 #define loaded_extensions XOA (scheme_get_thread_local_variables()->loaded_extensions_)
744 #define fullpath_loaded_extensions XOA (scheme_get_thread_local_variables()->fullpath_loaded_extensions_)
745 #define scheme_place_sleep XOA (scheme_get_thread_local_variables()->scheme_place_sleep_)
746 #define thread_sleep_callback XOA (scheme_get_thread_local_variables()->thread_sleep_callback_)
747 #define thread_sleep_callback_fd XOA (scheme_get_thread_local_variables()->thread_sleep_callback_fd_)
748 #define ghbn_thread_data XOA (scheme_get_thread_local_variables()->ghbn_thread_data_)
749 #define on_atomic_timeout XOA (scheme_get_thread_local_variables()->on_atomic_timeout_)
750 #define on_atomic_timeout_data XOA (scheme_get_thread_local_variables()->on_atomic_timeout_data_)
751 #define atomic_timeout_auto_suspend XOA (scheme_get_thread_local_variables()->atomic_timeout_auto_suspend_)
752 #define atomic_timeout_atomic_level XOA (scheme_get_thread_local_variables()->atomic_timeout_atomic_level_)
753 #define configuration_callback_cache XOA (scheme_get_thread_local_variables()->configuration_callback_cache_)
754 #define cached_orig_place_todo XOA (scheme_get_thread_local_variables()->cached_orig_place_todo_)
755 #define ffi_lock_ht XOA (scheme_get_thread_local_variables()->ffi_lock_ht_)
756 #define is_syntax_proc XOA (scheme_get_thread_local_variables()->is_syntax_proc_)
757 #define expander_syntax_to_datum_proc XOA (scheme_get_thread_local_variables()->expander_syntax_to_datum_proc_)
758 #define local_primitive_tables XOA (scheme_get_thread_local_variables()->local_primitive_tables_)
759 #define current_linklet_native_lambdas XOA (scheme_get_thread_local_variables()->current_linklet_native_lambdas_)
760 
761 /* **************************************** */
762 
763 # define THREAD_LOCAL_DECL(x) /* empty */
764 
765 #endif
766 
767 /* **************************************** */
768 
769 # ifdef __cplusplus
770 }
771 # endif
772 
773 #endif
774