X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-array-list.c;h=2fd54d986d0d6ded4b26dc3efb5203198bd4d3ec;hb=5ac651e7b47c855011b5ffadeb4f031e39865edc;hp=0247a6b12695c3e1368d327fefd5f58dd31fd2da;hpb=f704d56c378b28e252572db4730a6e13edc14aa0;p=mono.git diff --git a/mono/sgen/sgen-array-list.c b/mono/sgen/sgen-array-list.c index 0247a6b1269..2fd54d986d0 100644 --- a/mono/sgen/sgen-array-list.c +++ b/mono/sgen/sgen-array-list.c @@ -207,4 +207,27 @@ sgen_array_list_default_is_slot_set (volatile gpointer *slot) return *slot != NULL; } +/* Removes all NULL pointers from the array. Not thread safe */ +void +sgen_array_list_remove_nulls (SgenArrayList *array) +{ + guint32 start = 0; + volatile gpointer *slot; + gboolean skipped = FALSE; + + SGEN_ARRAY_LIST_FOREACH_SLOT (array, slot) { + if (*slot) { + *sgen_array_list_get_slot (array, start++) = *slot; + if (skipped) + *slot = NULL; + } else { + skipped = TRUE; + } + } SGEN_ARRAY_LIST_END_FOREACH_SLOT; + + mono_memory_write_barrier (); + array->next_slot = start; + array->slot_hint = start; +} + #endif