少年修仙传客户端基础资源
hch
2024-04-01 d01413b00ef631ac20347716b23818b0b811f65f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
 * \file
 * Object scanning in the nursery collectors.
 *
 * Copyright 2001-2003 Ximian, Inc
 * Copyright 2003-2010 Novell, Inc.
 * Copyright (C) 2012 Xamarin Inc
 *
 * 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 "No nursery configuration specified"
#endif
 
#undef HANDLE_PTR
/* Global remsets are handled in SERIAL_COPY_OBJECT_FROM_OBJ */
#define HANDLE_PTR(ptr,obj)    do {    \
        void *__old = *(ptr);    \
        SGEN_OBJECT_LAYOUT_STATISTICS_MARK_BITMAP ((obj), (ptr)); \
        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); \
        }    \
    } while (0)
 
static void
SERIAL_SCAN_OBJECT (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue)
{
    char *start = (char*)full_object;
 
    SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
 
#ifdef HEAVY_STATISTICS
    sgen_descriptor_count_scanned_object (desc);
#endif
 
    SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection.");
 
#define SCAN_OBJECT_PROTOCOL
#include "sgen-scan-object.h"
 
    SGEN_OBJECT_LAYOUT_STATISTICS_COMMIT_BITMAP;
    HEAVY_STAT (++stat_scan_object_called_nursery);
}
 
static void
SERIAL_SCAN_VTYPE (GCObject *full_object, char *start, SgenDescriptor desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size))
{
    SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
 
    SGEN_ASSERT (9, sgen_get_current_collection_generation () == GENERATION_NURSERY, "Must not use minor scan during major collection.");
 
    /* The descriptors include info about the MonoObject header as well */
    start -= SGEN_CLIENT_OBJECT_HEADER_SIZE;
 
#define SCAN_OBJECT_NOVTABLE
#define SCAN_OBJECT_PROTOCOL
#include "sgen-scan-object.h"
}
 
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)