Fix creation of types and events after the master gc has been switched out
This commit is contained in:
parent
d2771cfb53
commit
528948291d
|
@ -484,6 +484,13 @@ GC2_EXTERN void GC_adopt_message_allocator(void *msg_memory);
|
|||
the current receiving place's gc
|
||||
*/
|
||||
|
||||
GC2_EXTERN intptr_t GC_is_place();
|
||||
/*
|
||||
Returns 1 if current GC is a place gc.
|
||||
Otherwise returns 0;
|
||||
*/
|
||||
|
||||
|
||||
|
||||
# ifdef __cplusplus
|
||||
};
|
||||
|
|
|
@ -152,6 +152,12 @@ inline static int postmaster_and_master_gc(NewGC *gc) {
|
|||
inline static int postmaster_and_place_gc(NewGC *gc) {
|
||||
return (MASTERGC && gc != MASTERGC);
|
||||
}
|
||||
|
||||
intptr_t GC_is_place() {
|
||||
NewGC *gc = GC_get_GC();
|
||||
return postmaster_and_place_gc(gc);
|
||||
}
|
||||
|
||||
static void master_collect_initiate(NewGC *gc);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -307,6 +307,8 @@ typedef struct Thread_Local_Variables {
|
|||
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_;
|
||||
int place_evts_array_size_;
|
||||
struct Evt **place_evts_;
|
||||
} Thread_Local_Variables;
|
||||
|
||||
#if defined(IMPLEMENT_THREAD_LOCAL_VIA_PTHREADS)
|
||||
|
@ -619,6 +621,8 @@ XFORM_GC_VARIABLE_STACK_THROUGH_THREAD_LOCAL;
|
|||
#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_)
|
||||
#define place_evts_array_size XOA (scheme_get_thread_local_variables()->place_evts_array_size_)
|
||||
#define place_evts XOA (scheme_get_thread_local_variables()->place_evts_)
|
||||
|
||||
/* **************************************** */
|
||||
|
||||
|
|
|
@ -240,6 +240,10 @@ THREAD_LOCAL_DECL(static int recycle_cc_count);
|
|||
|
||||
THREAD_LOCAL_DECL(struct Scheme_Hash_Table *place_local_misc_table);
|
||||
|
||||
#if defined(MZ_PRECISE_GC) && defined(MZ_USE_PLACES)
|
||||
extern intptr_t GC_is_place();
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef MZ_PRECISE_GC
|
||||
extern intptr_t GC_get_memory_use(void *c);
|
||||
|
@ -5435,31 +5439,31 @@ typedef struct Evt {
|
|||
|
||||
|
||||
/* PLACE_THREAD_DECL */
|
||||
FIXME_LATER static int evts_array_size;
|
||||
FIXME_LATER static Evt **evts;
|
||||
static int evts_array_size;
|
||||
static Evt **evts;
|
||||
THREAD_LOCAL_DECL(static int place_evts_array_size);
|
||||
THREAD_LOCAL_DECL(static Evt **place_evts);
|
||||
|
||||
void scheme_add_evt(Scheme_Type type,
|
||||
Scheme_Ready_Fun ready,
|
||||
Scheme_Needs_Wakeup_Fun wakeup,
|
||||
Scheme_Sync_Filter_Fun filter,
|
||||
int can_redirect)
|
||||
void scheme_add_evt_worker(Evt ***evt_array,
|
||||
int *evt_size,
|
||||
Scheme_Type type,
|
||||
Scheme_Ready_Fun ready,
|
||||
Scheme_Needs_Wakeup_Fun wakeup,
|
||||
Scheme_Sync_Filter_Fun filter,
|
||||
int can_redirect)
|
||||
{
|
||||
Evt *naya;
|
||||
|
||||
if (!evts) {
|
||||
REGISTER_SO(evts);
|
||||
}
|
||||
|
||||
if (evts_array_size <= type) {
|
||||
if (*evt_size <= type) {
|
||||
Evt **nevts;
|
||||
int new_size;
|
||||
new_size = type + 1;
|
||||
if (new_size < _scheme_last_type_)
|
||||
new_size = _scheme_last_type_;
|
||||
nevts = MALLOC_N(Evt*, new_size);
|
||||
memcpy(nevts, evts, evts_array_size * sizeof(Evt*));
|
||||
evts = nevts;
|
||||
evts_array_size = new_size;
|
||||
memcpy(nevts, (*evt_array), (*evt_size) * sizeof(Evt*));
|
||||
(*evt_array) = nevts;
|
||||
(*evt_size) = new_size;
|
||||
}
|
||||
|
||||
naya = MALLOC_ONE_RT(Evt);
|
||||
|
@ -5472,7 +5476,31 @@ void scheme_add_evt(Scheme_Type type,
|
|||
naya->filter = filter;
|
||||
naya->can_redirect = can_redirect;
|
||||
|
||||
evts[type] = naya;
|
||||
(*evt_array)[type] = naya;
|
||||
}
|
||||
|
||||
void scheme_add_evt(Scheme_Type type,
|
||||
Scheme_Ready_Fun ready,
|
||||
Scheme_Needs_Wakeup_Fun wakeup,
|
||||
Scheme_Sync_Filter_Fun filter,
|
||||
int can_redirect)
|
||||
{
|
||||
#if defined(MZ_PRECISE_GC) && defined(MZ_USE_PLACES)
|
||||
if (GC_is_place()) {
|
||||
if (!place_evts) {
|
||||
REGISTER_SO(place_evts);
|
||||
}
|
||||
scheme_add_evt_worker(&place_evts, &place_evts_array_size, type, ready, wakeup, filter, can_redirect);
|
||||
}
|
||||
else {
|
||||
#endif
|
||||
if (!evts) {
|
||||
REGISTER_SO(evts);
|
||||
}
|
||||
scheme_add_evt_worker(&evts, &evts_array_size, type, ready, wakeup, filter, can_redirect);
|
||||
#if defined(MZ_PRECISE_GC) && defined(MZ_USE_PLACES)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void scheme_add_evt_through_sema(Scheme_Type type,
|
||||
|
@ -5486,21 +5514,23 @@ void scheme_add_evt_through_sema(Scheme_Type type,
|
|||
static Evt *find_evt(Scheme_Object *o)
|
||||
{
|
||||
Scheme_Type t;
|
||||
Evt *w;
|
||||
Evt *w = NULL;
|
||||
|
||||
t = SCHEME_TYPE(o);
|
||||
w = evts[t];
|
||||
if (w) {
|
||||
if (w->filter) {
|
||||
Scheme_Sync_Filter_Fun filter;
|
||||
filter = w->filter;
|
||||
if (!filter(o))
|
||||
return NULL;
|
||||
}
|
||||
return w;
|
||||
}
|
||||
if (t < evts_array_size)
|
||||
w = evts[t];
|
||||
#if defined(MZ_PRECISE_GC) && defined(MZ_USE_PLACES)
|
||||
if (place_evts && w == NULL)
|
||||
w = place_evts[t];
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
if (w && w->filter) {
|
||||
Scheme_Sync_Filter_Fun filter;
|
||||
filter = w->filter;
|
||||
if (!filter(o))
|
||||
return NULL;
|
||||
}
|
||||
return w;
|
||||
}
|
||||
|
||||
int scheme_is_evt(Scheme_Object *o)
|
||||
|
|
|
@ -289,6 +289,12 @@ scheme_init_type ()
|
|||
|
||||
Scheme_Type scheme_make_type(const char *name)
|
||||
{
|
||||
Scheme_Type newtype;
|
||||
#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
|
||||
void *saved_gc;
|
||||
saved_gc = GC_switch_to_master_gc();
|
||||
#endif
|
||||
|
||||
if (!type_names)
|
||||
init_type_arrays();
|
||||
|
||||
|
@ -341,7 +347,12 @@ Scheme_Type scheme_make_type(const char *name)
|
|||
type_names[maxtype] = tn;
|
||||
}
|
||||
|
||||
return maxtype++;
|
||||
newtype = maxtype;
|
||||
maxtype++;
|
||||
#if defined(MZ_USE_PLACES) && defined(MZ_PRECISE_GC)
|
||||
GC_switch_back_from_master(saved_gc);
|
||||
#endif
|
||||
return newtype;
|
||||
}
|
||||
|
||||
char *scheme_get_type_name(Scheme_Type t)
|
||||
|
|
Loading…
Reference in New Issue
Block a user