void mono_gc_wait_for_bridge_processing (void) { if (!bridge_processing_in_progress) return; mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "GC_BRIDGE waiting for bridge processing to finish"); sgen_gc_lock (); sgen_gc_unlock (); }
/** * mono_gc_toggleref_add: * @object object to register for toggleref processing * @strong_ref if true the object is registered with a strong ref, a weak one otherwise * * Register a given object for toggleref processing. It will be stored internally and the toggleref callback will be called * on it until it returns MONO_TOGGLE_REF_DROP or is collected. */ void mono_gc_toggleref_add (MonoObject *object, mono_bool strong_ref) { if (!toggleref_callback) return; SGEN_LOG (4, "Adding toggleref %p %d", object, strong_ref); sgen_gc_lock (); ensure_toggleref_capacity (1); toggleref_array [toggleref_array_size].strong_ref = strong_ref ? object : NULL; toggleref_array [toggleref_array_size].weak_ref = strong_ref ? NULL : object; ++toggleref_array_size; sgen_gc_unlock (); }
/** * mono_gc_toggleref_add: * @object object to register for toggleref processing * @strong_ref if true the object is registered with a strong ref, a weak one otherwise * * Register a given object for toggleref processing. It will be stored internally and the toggleref callback will be called * on it until it returns MONO_TOGGLE_REF_DROP or is collected. */ void mono_gc_toggleref_add (MonoObject *object, mono_bool strong_ref) { if (!toggleref_callback) return; DEBUG (4, fprintf (gc_debug_file, "Adding toggleref %p %d\n", object, strong_ref)); sgen_gc_lock (); ensure_toggleref_capacity (1); toggleref_array [toggleref_array_size].strong_ref = strong_ref ? object : NULL; toggleref_array [toggleref_array_size].weak_ref = strong_ref ? NULL : object; ++toggleref_array_size; sgen_gc_unlock (); }
static int alloc_complex_descriptor (gsize *bitmap, int numbits) { int nwords, res, i; numbits = ALIGN_TO (numbits, GC_BITS_PER_WORD); nwords = numbits / GC_BITS_PER_WORD + 1; sgen_gc_lock (); res = complex_descriptors_next; /* linear search, so we don't have duplicates with domain load/unload * this should not be performance critical or we'd have bigger issues * (the number and size of complex descriptors should be small). */ for (i = 0; i < complex_descriptors_next; ) { if (complex_descriptors [i] == nwords) { int j, found = TRUE; for (j = 0; j < nwords - 1; ++j) { if (complex_descriptors [i + 1 + j] != bitmap [j]) { found = FALSE; break; } } if (found) { sgen_gc_unlock (); return i; } } i += (int)complex_descriptors [i]; } if (complex_descriptors_next + nwords > complex_descriptors_size) { int new_size = complex_descriptors_size * 2 + nwords; complex_descriptors = (gsize *)g_realloc (complex_descriptors, new_size * sizeof (gsize)); complex_descriptors_size = new_size; } SGEN_LOG (6, "Complex descriptor %d, size: %d (total desc memory: %d)", res, nwords, complex_descriptors_size); complex_descriptors_next += nwords; complex_descriptors [res] = nwords; for (i = 0; i < nwords - 1; ++i) { complex_descriptors [res + 1 + i] = bitmap [i]; SGEN_LOG (6, "\tvalue: %p", (void*)complex_descriptors [res + 1 + i]); } sgen_gc_unlock (); return res; }