#define TYPD_EXTRA_BYTES (sizeof(word) - EXTRA_BYTES)
-STATIC GC_bool GC_explicit_typing_initialized = FALSE;
-
STATIC int GC_explicit_kind = 0;
/* Object kind for objects with indirect */
/* (possibly extended) descriptors. */
STATIC int GC_typed_mark_proc_index = 0; /* Indices of my mark */
STATIC int GC_array_mark_proc_index = 0; /* procedures. */
+#if !defined(AO_HAVE_load_acquire) && defined(GC_FORCE_INCLUDE_ATOMIC_OPS)
+# include "atomic_ops.h"
+#endif
+
+STATIC
+# ifdef AO_HAVE_load_acquire
+ AO_t
+# else
+ GC_bool
+# endif
+ GC_explicit_typing_initialized = FALSE;
+
STATIC void GC_push_typed_structures_proc(void)
{
GC_push_all((ptr_t)&GC_ext_descriptors,
STATIC mse * GC_array_mark_proc(word * addr, mse * mark_stack_ptr,
mse * mark_stack_limit, word env);
-/* Caller does not hold allocation lock. */
STATIC void GC_init_explicit_typing(void)
{
- register unsigned i;
- DCL_LOCK_STATE;
+ unsigned i;
GC_STATIC_ASSERT(sizeof(struct LeafDescriptor) % sizeof(word) == 0);
- LOCK();
- if (GC_explicit_typing_initialized) {
- UNLOCK();
- return;
- }
- GC_explicit_typing_initialized = TRUE;
/* Set up object kind with simple indirect descriptor. */
GC_eobjfreelist = (ptr_t *)GC_new_free_list_inner();
GC_explicit_kind = GC_new_kind_inner(
for (i = 0; i < WORDSZ/2; i++) {
GC_bm_table[i] = (((word)-1) << (WORDSZ - i)) | GC_DS_BITMAP;
}
- UNLOCK();
}
STATIC mse * GC_typed_mark_proc(word * addr, mse * mark_stack_ptr,
GC_descr result;
signed_word i;
# define HIGH_BIT (((word)1) << (WORDSZ - 1))
+ DCL_LOCK_STATE;
- if (!EXPECT(GC_explicit_typing_initialized, TRUE))
- GC_init_explicit_typing();
+# if defined(THREADS) && defined(AO_HAVE_load_acquire)
+ if (!EXPECT(AO_load_acquire(
+ (volatile AO_t *)&GC_explicit_typing_initialized),
+ TRUE))
+# endif
+ {
+ LOCK();
+# if defined(THREADS) && defined(AO_HAVE_load_acquire)
+ if (!GC_explicit_typing_initialized)
+# else
+ if (!EXPECT(GC_explicit_typing_initialized, TRUE))
+# endif
+ {
+ GC_init_explicit_typing();
+ GC_explicit_typing_initialized = TRUE;
+ }
+ UNLOCK();
+ }
while (last_set_bit >= 0 && !GC_get_bit(bm, last_set_bit))
last_set_bit--;
size_t lg;
DCL_LOCK_STATE;
+ GC_ASSERT(GC_explicit_typing_initialized);
lb += TYPD_EXTRA_BYTES;
- if(SMALL_OBJ(lb)) {
+ if (SMALL_OBJ(lb)) {
GC_DBG_COLLECT_AT_MALLOC(lb);
lg = GC_size_map[lb];
opp = &(GC_eobjfreelist[lg]);
size_t lg;
DCL_LOCK_STATE;
+ GC_ASSERT(GC_explicit_typing_initialized);
lb += TYPD_EXTRA_BYTES;
if( SMALL_OBJ(lb) ) {
GC_DBG_COLLECT_AT_MALLOC(lb);
struct LeafDescriptor leaf;
DCL_LOCK_STATE;
+ GC_ASSERT(GC_explicit_typing_initialized);
descr_type = GC_make_array_descriptor((word)n, (word)lb, d,
&simple_descr, &complex_descr, &leaf);
switch(descr_type) {