From e333bf9ffc7f32a5291afb5bc98f615f458d434d Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 17 Nov 2009 19:55:03 +0000 Subject: [PATCH] basics for future primitive type svn: r16840 --- src/mzscheme/src/future.c | 20 +++++ src/mzscheme/src/future.h | 2 + src/mzscheme/src/mzmark.c | 43 +++++++++++ src/mzscheme/src/mzmarksrc.c | 21 +++++ src/mzscheme/src/stypes.h | 145 ++++++++++++++++++----------------- src/mzscheme/src/type.c | 2 + 6 files changed, 161 insertions(+), 72 deletions(-) diff --git a/src/mzscheme/src/future.c b/src/mzscheme/src/future.c index ad25b945d1..f611fa1ec9 100644 --- a/src/mzscheme/src/future.c +++ b/src/mzscheme/src/future.c @@ -988,4 +988,24 @@ void clear_futures(void) g_future_queue = NULL; } +/**********************************************************************/ +/* Precise GC */ +/**********************************************************************/ + +#ifdef MZ_PRECISE_GC + +START_XFORM_SKIP; + +#define MARKS_FOR_FUTURE_C +#include "mzmark.c" + +static void register_traversers(void) +{ + GC_REG_TRAV(scheme_future_type, future); +} + +END_XFORM_SKIP; + +#endif + #endif diff --git a/src/mzscheme/src/future.h b/src/mzscheme/src/future.h index 660b4b7e3a..4b074004ca 100644 --- a/src/mzscheme/src/future.h +++ b/src/mzscheme/src/future.h @@ -69,6 +69,8 @@ typedef struct { #define FINISHED 3 typedef struct future { + Scheme_Object so; + int id; pthread_t threadid; int status; diff --git a/src/mzscheme/src/mzmark.c b/src/mzscheme/src/mzmark.c index 3438c881e7..9736a6962d 100644 --- a/src/mzscheme/src/mzmark.c +++ b/src/mzscheme/src/mzmark.c @@ -5411,4 +5411,47 @@ static int native_unclosed_proc_plus_case_FIXUP(void *p) { /**********************************************************************/ +#ifdef MARKS_FOR_FUTURE_C + +static int future_SIZE(void *p) { + return + gcBYTES_TO_WORDS(sizeof(future_t)); +} + +static int future_MARK(void *p) { + future_t *c = (future_t *)p; + gcMARK(f->runstack); + gcMARK(f->runstack_start); + gcMARK(f->orig_thread); + gcMARK(f->rt_prim_args); + gcMARK(f->rt_prim_result); + gcMARK(f->retval); + gcMARK(f->prev); + gcMARK(f->next); + return + gcBYTES_TO_WORDS(sizeof(future_t)); +} + +static int future_FIXUP(void *p) { + future_t *c = (future_t *)p; + gcFIXUP(f->runstack); + gcFIXUP(f->runstack_start); + gcFIXUP(f->orig_thread); + gcFIXUP(f->rt_prim_args); + gcFIXUP(f->rt_prim_result); + gcFIXUP(f->retval); + gcFIXUP(f->prev); + gcFIXUP(f->next); + return + gcBYTES_TO_WORDS(sizeof(future_t)); +} + +#define future_IS_ATOMIC 0 +#define future_IS_CONST_SIZE 1 + + +#endif /* FUTURE */ + +/**********************************************************************/ + #define GC_REG_TRAV(type, base) GC_register_traversers(type, base ## _SIZE, base ## _MARK, base ## _FIXUP, base ## _IS_CONST_SIZE, base ## _IS_ATOMIC) diff --git a/src/mzscheme/src/mzmarksrc.c b/src/mzscheme/src/mzmarksrc.c index e7461311cd..7ca1896486 100644 --- a/src/mzscheme/src/mzmarksrc.c +++ b/src/mzscheme/src/mzmarksrc.c @@ -2218,4 +2218,25 @@ END jit; /**********************************************************************/ +START future; + +future { + mark: + future_t *c = (future_t *)p; + gcMARK(f->runstack); + gcMARK(f->runstack_start); + gcMARK(f->orig_thread); + gcMARK(f->rt_prim_args); + gcMARK(f->rt_prim_result); + gcMARK(f->retval); + gcMARK(f->prev); + gcMARK(f->next); + size: + gcBYTES_TO_WORDS(sizeof(future_t)); +} + +END future; + +/**********************************************************************/ + #define GC_REG_TRAV(type, base) GC_register_traversers(type, base ## _SIZE, base ## _MARK, base ## _FIXUP, base ## _IS_CONST_SIZE, base ## _IS_ATOMIC) diff --git a/src/mzscheme/src/stypes.h b/src/mzscheme/src/stypes.h index dfd293cf26..ea2d45731e 100644 --- a/src/mzscheme/src/stypes.h +++ b/src/mzscheme/src/stypes.h @@ -170,84 +170,85 @@ enum { scheme_rib_delimiter_type, /* 152 */ scheme_noninline_proc_type, /* 153 */ scheme_prune_context_type, /* 154 */ + scheme_future_type, /* 155 */ #ifdef MZTAG_REQUIRED - _scheme_last_normal_type_, /* 155 */ + _scheme_last_normal_type_, /* 156 */ - scheme_rt_weak_array, /* 156 */ + scheme_rt_weak_array, /* 157 */ - scheme_rt_comp_env, /* 157 */ - scheme_rt_constant_binding, /* 158 */ - scheme_rt_resolve_info, /* 159 */ - scheme_rt_optimize_info, /* 160 */ - scheme_rt_compile_info, /* 161 */ - scheme_rt_cont_mark, /* 162 */ - scheme_rt_saved_stack, /* 163 */ - scheme_rt_reply_item, /* 164 */ - scheme_rt_closure_info, /* 165 */ - scheme_rt_overflow, /* 166 */ - scheme_rt_overflow_jmp, /* 167 */ - scheme_rt_meta_cont, /* 168 */ - scheme_rt_dyn_wind_cell, /* 169 */ - scheme_rt_dyn_wind_info, /* 170 */ - scheme_rt_dyn_wind, /* 171 */ - scheme_rt_dup_check, /* 172 */ - scheme_rt_thread_memory, /* 173 */ - scheme_rt_input_file, /* 174 */ - scheme_rt_input_fd, /* 175 */ - scheme_rt_oskit_console_input, /* 176 */ - scheme_rt_tested_input_file, /* 177 */ - scheme_rt_tested_output_file, /* 178 */ - scheme_rt_indexed_string, /* 179 */ - scheme_rt_output_file, /* 180 */ - scheme_rt_load_handler_data, /* 181 */ - scheme_rt_pipe, /* 182 */ - scheme_rt_beos_process, /* 183 */ - scheme_rt_system_child, /* 184 */ - scheme_rt_tcp, /* 185 */ - scheme_rt_write_data, /* 186 */ - scheme_rt_tcp_select_info, /* 187 */ - scheme_rt_namespace_option, /* 188 */ - scheme_rt_param_data, /* 189 */ - scheme_rt_will, /* 190 */ - scheme_rt_struct_proc_info, /* 191 */ - scheme_rt_linker_name, /* 192 */ - scheme_rt_param_map, /* 193 */ - scheme_rt_finalization, /* 194 */ - scheme_rt_finalizations, /* 195 */ - scheme_rt_cpp_object, /* 196 */ - scheme_rt_cpp_array_object, /* 197 */ - scheme_rt_stack_object, /* 198 */ - scheme_rt_preallocated_object, /* 199 */ - scheme_thread_hop_type, /* 200 */ - scheme_rt_srcloc, /* 201 */ - scheme_rt_evt, /* 202 */ - scheme_rt_syncing, /* 203 */ - scheme_rt_comp_prefix, /* 204 */ - scheme_rt_user_input, /* 205 */ - scheme_rt_user_output, /* 206 */ - scheme_rt_compact_port, /* 207 */ - scheme_rt_read_special_dw, /* 208 */ - scheme_rt_regwork, /* 209 */ - scheme_rt_buf_holder, /* 210 */ - scheme_rt_parameterization, /* 211 */ - scheme_rt_print_params, /* 212 */ - scheme_rt_read_params, /* 213 */ - scheme_rt_native_code, /* 214 */ - scheme_rt_native_code_plus_case, /* 215 */ - scheme_rt_jitter_data, /* 216 */ - scheme_rt_module_exports, /* 217 */ - scheme_rt_delay_load_info, /* 218 */ - scheme_rt_marshal_info, /* 219 */ - scheme_rt_unmarshal_info, /* 220 */ - scheme_rt_runstack, /* 221 */ - scheme_rt_sfs_info, /* 222 */ - scheme_rt_validate_clearing, /* 223 */ - scheme_rt_rb_node, /* 224 */ + scheme_rt_comp_env, /* 158 */ + scheme_rt_constant_binding, /* 159 */ + scheme_rt_resolve_info, /* 160 */ + scheme_rt_optimize_info, /* 161 */ + scheme_rt_compile_info, /* 162 */ + scheme_rt_cont_mark, /* 163 */ + scheme_rt_saved_stack, /* 164 */ + scheme_rt_reply_item, /* 165 */ + scheme_rt_closure_info, /* 166 */ + scheme_rt_overflow, /* 167 */ + scheme_rt_overflow_jmp, /* 168 */ + scheme_rt_meta_cont, /* 169 */ + scheme_rt_dyn_wind_cell, /* 170 */ + scheme_rt_dyn_wind_info, /* 171 */ + scheme_rt_dyn_wind, /* 172 */ + scheme_rt_dup_check, /* 173 */ + scheme_rt_thread_memory, /* 174 */ + scheme_rt_input_file, /* 175 */ + scheme_rt_input_fd, /* 176 */ + scheme_rt_oskit_console_input, /* 177 */ + scheme_rt_tested_input_file, /* 178 */ + scheme_rt_tested_output_file, /* 179 */ + scheme_rt_indexed_string, /* 180 */ + scheme_rt_output_file, /* 181 */ + scheme_rt_load_handler_data, /* 182 */ + scheme_rt_pipe, /* 183 */ + scheme_rt_beos_process, /* 184 */ + scheme_rt_system_child, /* 185 */ + scheme_rt_tcp, /* 186 */ + scheme_rt_write_data, /* 187 */ + scheme_rt_tcp_select_info, /* 188 */ + scheme_rt_namespace_option, /* 189 */ + scheme_rt_param_data, /* 190 */ + scheme_rt_will, /* 191 */ + scheme_rt_struct_proc_info, /* 192 */ + scheme_rt_linker_name, /* 193 */ + scheme_rt_param_map, /* 194 */ + scheme_rt_finalization, /* 195 */ + scheme_rt_finalizations, /* 196 */ + scheme_rt_cpp_object, /* 197 */ + scheme_rt_cpp_array_object, /* 198 */ + scheme_rt_stack_object, /* 199 */ + scheme_rt_preallocated_object, /* 200 */ + scheme_thread_hop_type, /* 201 */ + scheme_rt_srcloc, /* 202 */ + scheme_rt_evt, /* 203 */ + scheme_rt_syncing, /* 204 */ + scheme_rt_comp_prefix, /* 205 */ + scheme_rt_user_input, /* 206 */ + scheme_rt_user_output, /* 207 */ + scheme_rt_compact_port, /* 208 */ + scheme_rt_read_special_dw, /* 209 */ + scheme_rt_regwork, /* 210 */ + scheme_rt_buf_holder, /* 211 */ + scheme_rt_parameterization, /* 212 */ + scheme_rt_print_params, /* 213 */ + scheme_rt_read_params, /* 214 */ + scheme_rt_native_code, /* 215 */ + scheme_rt_native_code_plus_case, /* 216 */ + scheme_rt_jitter_data, /* 217 */ + scheme_rt_module_exports, /* 218 */ + scheme_rt_delay_load_info, /* 219 */ + scheme_rt_marshal_info, /* 220 */ + scheme_rt_unmarshal_info, /* 221 */ + scheme_rt_runstack, /* 222 */ + scheme_rt_sfs_info, /* 223 */ + scheme_rt_validate_clearing, /* 224 */ + scheme_rt_rb_node, /* 225 */ #endif - scheme_place_type, /* 225 */ - scheme_engine_type, /* 226 */ + scheme_place_type, /* 226 */ + scheme_engine_type, /* 227 */ _scheme_last_type_ }; diff --git a/src/mzscheme/src/type.c b/src/mzscheme/src/type.c index acc68f8551..297e0ab71f 100644 --- a/src/mzscheme/src/type.c +++ b/src/mzscheme/src/type.c @@ -268,6 +268,8 @@ scheme_init_type () set_name(scheme_logger_type, ""); set_name(scheme_log_reader_type, ""); + set_name(scheme_future_type, ""); + set_name(_scheme_values_types_, ""); set_name(_scheme_compiled_values_types_, "");