X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-minor-scan-object.h;h=f0baac8f87ebcdc8561b7ded135a3a033f74a33d;hb=1e58d75461d3a60ac6be6ff60b30d7e67cdd3dee;hp=cc3e7a4539e794037d54c6055196b2d9df815fef;hpb=fee5ece80556eb45d16da5f6c0fde991e5af1d40;p=mono.git diff --git a/mono/sgen/sgen-minor-scan-object.h b/mono/sgen/sgen-minor-scan-object.h index cc3e7a4539e..f0baac8f87e 100644 --- a/mono/sgen/sgen-minor-scan-object.h +++ b/mono/sgen/sgen-minor-scan-object.h @@ -1,5 +1,6 @@ -/* - * sgen-minor-scan-object.h: Object scanning in the nursery collectors. +/** + * \file + * Object scanning in the nursery collectors. * * Copyright 2001-2003 Ximian, Inc * Copyright 2003-2010 Novell, Inc. @@ -13,17 +14,34 @@ extern guint64 stat_scan_object_called_nursery; #undef SERIAL_SCAN_OBJECT #undef SERIAL_SCAN_VTYPE #undef SERIAL_SCAN_PTR_FIELD +#undef SERIAL_DRAIN_GRAY_STACK #if defined(SGEN_SIMPLE_NURSERY) +#ifdef SGEN_SIMPLE_PAR_NURSERY +#ifdef SGEN_CONCURRENT_MAJOR +#define SERIAL_SCAN_OBJECT simple_par_nursery_serial_with_concurrent_major_scan_object +#define SERIAL_SCAN_VTYPE simple_par_nursery_serial_with_concurrent_major_scan_vtype +#define SERIAL_SCAN_PTR_FIELD simple_par_nursery_serial_with_concurrent_major_scan_ptr_field +#define SERIAL_DRAIN_GRAY_STACK simple_par_nursery_serial_with_concurrent_major_drain_gray_stack +#else +#define SERIAL_SCAN_OBJECT simple_par_nursery_serial_scan_object +#define SERIAL_SCAN_VTYPE simple_par_nursery_serial_scan_vtype +#define SERIAL_SCAN_PTR_FIELD simple_par_nursery_serial_scan_ptr_field +#define SERIAL_DRAIN_GRAY_STACK simple_par_nursery_serial_drain_gray_stack +#endif +#else #ifdef SGEN_CONCURRENT_MAJOR #define SERIAL_SCAN_OBJECT simple_nursery_serial_with_concurrent_major_scan_object #define SERIAL_SCAN_VTYPE simple_nursery_serial_with_concurrent_major_scan_vtype #define SERIAL_SCAN_PTR_FIELD simple_nursery_serial_with_concurrent_major_scan_ptr_field +#define SERIAL_DRAIN_GRAY_STACK simple_nursery_serial_with_concurrent_major_drain_gray_stack #else #define SERIAL_SCAN_OBJECT simple_nursery_serial_scan_object #define SERIAL_SCAN_VTYPE simple_nursery_serial_scan_vtype #define SERIAL_SCAN_PTR_FIELD simple_nursery_serial_scan_ptr_field +#define SERIAL_DRAIN_GRAY_STACK simple_nursery_serial_drain_gray_stack +#endif #endif #elif defined (SGEN_SPLIT_NURSERY) @@ -32,10 +50,12 @@ extern guint64 stat_scan_object_called_nursery; #define SERIAL_SCAN_OBJECT split_nursery_serial_with_concurrent_major_scan_object #define SERIAL_SCAN_VTYPE split_nursery_serial_with_concurrent_major_scan_vtype #define SERIAL_SCAN_PTR_FIELD split_nursery_serial_with_concurrent_major_scan_ptr_field +#define SERIAL_DRAIN_GRAY_STACK split_nursery_serial_with_concurrent_major_drain_gray_stack #else #define SERIAL_SCAN_OBJECT split_nursery_serial_scan_object #define SERIAL_SCAN_VTYPE split_nursery_serial_scan_vtype #define SERIAL_SCAN_PTR_FIELD split_nursery_serial_scan_ptr_field +#define SERIAL_DRAIN_GRAY_STACK split_nursery_serial_drain_gray_stack #endif #else @@ -95,8 +115,39 @@ SERIAL_SCAN_PTR_FIELD (GCObject *full_object, GCObject **ptr, SgenGrayQueue *que HANDLE_PTR (ptr, NULL); } +static gboolean +SERIAL_DRAIN_GRAY_STACK (SgenGrayQueue *queue) +{ +#ifdef SGEN_SIMPLE_PAR_NURSERY + int i; + /* + * We do bounded iteration so we can switch to optimized context + * when we are the last worker remaining. + */ + for (i = 0; i < 32; i++) { +#else + for (;;) { +#endif + GCObject *obj; + SgenDescriptor desc; + +#ifdef SGEN_SIMPLE_PAR_NURSERY + GRAY_OBJECT_DEQUEUE_PARALLEL (queue, &obj, &desc); +#else + GRAY_OBJECT_DEQUEUE_SERIAL (queue, &obj, &desc); +#endif + if (!obj) + return TRUE; + + SERIAL_SCAN_OBJECT (obj, desc, queue); + } + + return FALSE; +} + #define FILL_MINOR_COLLECTOR_SCAN_OBJECT(ops) do { \ (ops)->scan_object = SERIAL_SCAN_OBJECT; \ (ops)->scan_vtype = SERIAL_SCAN_VTYPE; \ (ops)->scan_ptr_field = SERIAL_SCAN_PTR_FIELD; \ + (ops)->drain_gray_stack = SERIAL_DRAIN_GRAY_STACK; \ } while (0)