X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-minor-scan-object.h;h=f0baac8f87ebcdc8561b7ded135a3a033f74a33d;hb=HEAD;hp=5bd452578d99e6d668e0b045caefd3a5a2380474;hpb=335952335d783b31fc13b86d9a80ef24ea598662;p=mono.git diff --git a/mono/sgen/sgen-minor-scan-object.h b/mono/sgen/sgen-minor-scan-object.h index 5bd452578d9..f0baac8f87e 100644 --- a/mono/sgen/sgen-minor-scan-object.h +++ b/mono/sgen/sgen-minor-scan-object.h @@ -1,36 +1,65 @@ -/* - * 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. * Copyright (C) 2012 Xamarin Inc * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License 2.0 as published by the Free Software Foundation; - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License 2.0 along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ 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) + +#ifdef SGEN_CONCURRENT_MAJOR +#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 -#error "Please define GC_CONF_NAME" +#error "No nursery configuration specified" #endif #undef HANDLE_PTR @@ -38,7 +67,7 @@ extern guint64 stat_scan_object_called_nursery; #define HANDLE_PTR(ptr,obj) do { \ void *__old = *(ptr); \ SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \ - binary_protocol_scan_process_reference ((obj), (ptr), __old); \ + binary_protocol_scan_process_reference ((full_object), (ptr), __old); \ if (__old) { \ SERIAL_COPY_OBJECT_FROM_OBJ ((ptr), queue); \ SGEN_COND_LOG (9, __old != *(ptr), "Overwrote field at %p with %p (was: %p)", (ptr), *(ptr), __old); \ @@ -46,9 +75,9 @@ extern guint64 stat_scan_object_called_nursery; } while (0) static void -SERIAL_SCAN_OBJECT (GCObject *object, mword desc, SgenGrayQueue *queue) +SERIAL_SCAN_OBJECT (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue) { - char *start = (char*)object; + char *start = (char*)full_object; SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP; @@ -66,7 +95,7 @@ SERIAL_SCAN_OBJECT (GCObject *object, mword desc, SgenGrayQueue *queue) } static void -SERIAL_SCAN_VTYPE (GCObject *full_object, char *start, mword desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size)) +SERIAL_SCAN_VTYPE (GCObject *full_object, char *start, SgenDescriptor desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size)) { SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP; @@ -80,7 +109,45 @@ SERIAL_SCAN_VTYPE (GCObject *full_object, char *start, mword desc, SgenGrayQueue #include "sgen-scan-object.h" } -#define FILL_MINOR_COLLECTOR_SCAN_OBJECT(collector) do { \ - (collector)->serial_ops.scan_object = SERIAL_SCAN_OBJECT; \ - (collector)->serial_ops.scan_vtype = SERIAL_SCAN_VTYPE; \ +static void +SERIAL_SCAN_PTR_FIELD (GCObject *full_object, GCObject **ptr, SgenGrayQueue *queue) +{ + 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)