X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-pinning.c;h=6b2b2e33547f2c2009616a0d628c00a4fd6fa14b;hb=b9e6227efb697f121da8402ce96386d7735f31ce;hp=eedd1f0343a93e720cac0838ec29ff70e8bd773e;hpb=0db5f5ad0edd151e472c0742e978234d9bc6fa1c;p=mono.git diff --git a/mono/sgen/sgen-pinning.c b/mono/sgen/sgen-pinning.c index eedd1f0343a..6b2b2e33547 100644 --- a/mono/sgen/sgen-pinning.c +++ b/mono/sgen/sgen-pinning.c @@ -21,15 +21,29 @@ static SgenPointerQueue pin_queue; static size_t last_num_pinned = 0; +/* + * While we hold the pin_queue_mutex, all objects in pin_queue_objs will + * stay pinned, which means they can't move, therefore they can be scanned. + */ +static SgenPointerQueue pin_queue_objs; +static mono_mutex_t pin_queue_mutex; #define PIN_HASH_SIZE 1024 static void *pin_hash_filter [PIN_HASH_SIZE]; +void +sgen_pinning_init (void) +{ + mono_os_mutex_init (&pin_queue_mutex); +} + void sgen_init_pinning (void) { + mono_os_mutex_lock (&pin_queue_mutex); memset (pin_hash_filter, 0, sizeof (pin_hash_filter)); pin_queue.mem_type = INTERNAL_MEM_PIN_QUEUE; + sgen_pointer_queue_clear (&pin_queue_objs); } void @@ -37,6 +51,27 @@ sgen_finish_pinning (void) { last_num_pinned = pin_queue.next_slot; sgen_pointer_queue_clear (&pin_queue); + mono_os_mutex_unlock (&pin_queue_mutex); +} + +void +sgen_pinning_register_pinned_in_nursery (GCObject *obj) +{ + sgen_pointer_queue_add (&pin_queue_objs, obj); +} + +void +sgen_scan_pin_queue_objects (ScanCopyContext ctx) +{ + int i; + ScanObjectFunc scan_func = ctx.ops->scan_object; + + mono_os_mutex_lock (&pin_queue_mutex); + for (i = 0; i < pin_queue_objs.next_slot; ++i) { + GCObject *obj = (GCObject *)pin_queue_objs.data [i]; + scan_func (obj, sgen_obj_get_descriptor_safe (obj), ctx.queue); + } + mono_os_mutex_unlock (&pin_queue_mutex); } void