return obj->vtable;
}
-static inline mword
+static inline SgenDescriptor
sgen_vtable_get_descriptor (GCVTable vtable)
{
- return (mword)vtable->gc_descr;
+ return (SgenDescriptor)vtable->gc_descr;
}
typedef struct _SgenClientThreadInfo SgenClientThreadInfo;
static MONO_NEVER_INLINE mword
sgen_client_par_object_get_size (GCVTable vtable, GCObject* o)
{
- mword descr = sgen_vtable_get_descriptor (vtable);
+ SgenDescriptor descr = sgen_vtable_get_descriptor (vtable);
mword type = descr & DESC_TYPE_MASK;
if (type == DESC_TYPE_RUN_LENGTH || type == DESC_TYPE_SMALL_PTRFREE) {
int
mono_gc_register_root (char *start, size_t size, void *descr)
{
- return sgen_register_root (start, size, descr, descr ? ROOT_TYPE_NORMAL : ROOT_TYPE_PINNED);
+ return sgen_register_root (start, size, (SgenDescriptor)descr, descr ? ROOT_TYPE_NORMAL : ROOT_TYPE_PINNED);
}
int
mono_gc_register_root_wbarrier (char *start, size_t size, void *descr)
{
- return sgen_register_root (start, size, descr, ROOT_TYPE_WBARRIER);
+ return sgen_register_root (start, size, (SgenDescriptor)descr, ROOT_TYPE_WBARRIER);
}
void
void*
mono_gc_make_root_descr_user (MonoGCRootMarkFunc marker)
{
- return sgen_make_user_root_descriptor ((SgenUserRootMarkFunc)marker);
+ return (void*)sgen_make_user_root_descriptor ((SgenUserRootMarkFunc)marker);
}
void*
describe_pointer (char *ptr, gboolean need_setup)
{
GCVTable vtable;
- mword desc;
+ SgenDescriptor desc;
int type;
char *start;
char *forwarded;
{
char *start = (char*)obj;
GCVTable vt = LOAD_VTABLE (obj);
- mword desc = sgen_vtable_get_descriptor (vt);
+ SgenDescriptor desc = sgen_vtable_get_descriptor (vt);
SGEN_LOG (8, "Scanning object %p, vtable: %p (%s)", start, vt, sgen_client_vtable_get_name (vt));
#include "sgen-scan-object.h"
char *start = (char*)obj;
gboolean in_los = (gboolean) (size_t) dummy;
GCVTable vt = LOAD_VTABLE (obj);
- mword desc = sgen_vtable_get_descriptor (vt);
+ SgenDescriptor desc = sgen_vtable_get_descriptor (vt);
guint8 *cards;
SGEN_LOG (8, "Scanning object %p, vtable: %p (%s)", obj, vt, sgen_client_vtable_get_name (vt));
check_major_refs_callback (GCObject *obj, size_t size, void *dummy)
{
char *start = (char*)obj;
- mword desc = sgen_obj_get_descriptor (obj);
+ SgenDescriptor desc = sgen_obj_get_descriptor (obj);
#include "sgen-scan-object.h"
}
check_object (GCObject *obj)
{
char *start = (char*)obj;
- mword desc;
+ SgenDescriptor desc;
if (!start)
return;
{
char *start = (char*)obj;
gboolean allow_missing_pinned = (gboolean) (size_t) data;
- mword desc = sgen_obj_get_descriptor (obj);
+ SgenDescriptor desc = sgen_obj_get_descriptor (obj);
#include "sgen-scan-object.h"
}
{
char *start = (char*)obj;
gboolean flag = (gboolean) (size_t) dummy;
- mword desc;
+ SgenDescriptor desc;
if (sgen_ptr_in_nursery (start)) {
if (flag)
if (scan_object_for_specific_ref_precise) {
char *start = (char*)obj;
- mword desc = sgen_obj_get_descriptor_safe (obj);
+ SgenDescriptor desc = sgen_obj_get_descriptor_safe (obj);
#include "sgen-scan-object.h"
} else {
mword *words = (mword*)obj;
check_key = key;
SGEN_HASH_TABLE_FOREACH (&roots_hash [root_type], start_root, root) {
- mword desc = root->root_desc;
+ SgenDescriptor desc = root->root_desc;
check_root = root;
RootRecord *root;
check_domain = domain;
SGEN_HASH_TABLE_FOREACH (&roots_hash [root_type], start_root, root) {
- mword desc = root->root_desc;
+ SgenDescriptor desc = root->root_desc;
/* The MonoDomain struct is allowed to hold
references to objects in its own domain. */
char *start = (char*)obj;
MonoVTable *vt = SGEN_LOAD_VTABLE (obj);
MonoDomain *domain = vt->domain;
- mword desc = sgen_vtable_get_descriptor (vt);
+ SgenDescriptor desc = sgen_vtable_get_descriptor (vt);
#include "sgen-scan-object.h"
}
}
gsize*
-sgen_get_complex_descriptor (mword desc)
+sgen_get_complex_descriptor (SgenDescriptor desc)
{
return complex_descriptors + (desc >> LOW_TYPE_BITS);
}
mono_gc_make_descr_for_object (gsize *bitmap, int numbits, size_t obj_size)
{
int first_set = -1, num_set = 0, last_set = -1, i;
- mword desc = 0;
+ SgenDescriptor desc = 0;
size_t stored_size = obj_size;
stored_size += SGEN_ALLOC_ALIGN - 1;
mono_gc_make_descr_for_array (int vector, gsize *elem_bitmap, int numbits, size_t elem_size)
{
int first_set = -1, num_set = 0, last_set = -1, i;
- mword desc = DESC_TYPE_VECTOR | (vector ? VECTOR_KIND_SZARRAY : VECTOR_KIND_ARRAY);
+ SgenDescriptor desc = DESC_TYPE_VECTOR | (vector ? VECTOR_KIND_SZARRAY : VECTOR_KIND_ARRAY);
for (i = 0; i < numbits; ++i) {
if (elem_bitmap [i / GC_BITS_PER_WORD] & ((gsize)1 << (i % GC_BITS_PER_WORD))) {
if (first_set < 0)
gsize*
mono_gc_get_bitmap_for_descr (void *descr, int *numbits)
{
- mword d = (mword)descr;
+ SgenDescriptor d = (SgenDescriptor)descr;
gsize *bitmap;
switch (d & DESC_TYPE_MASK) {
} else if (numbits < ((sizeof (*bitmap) * 8) - ROOT_DESC_TYPE_SHIFT)) {
return (void*)MAKE_ROOT_DESC (ROOT_DESC_BITMAP, bitmap [0]);
} else {
- mword complex = alloc_complex_descriptor (bitmap, numbits);
+ SgenDescriptor complex = alloc_complex_descriptor (bitmap, numbits);
return (void*)MAKE_ROOT_DESC (ROOT_DESC_COMPLEX, complex);
}
}
return descr;
}
-void*
+SgenDescriptor
sgen_make_user_root_descriptor (SgenUserRootMarkFunc marker)
{
- void *descr;
+ SgenDescriptor descr;
g_assert (user_descriptors_next < MAX_USER_DESCRIPTORS);
- descr = (void*)MAKE_ROOT_DESC (ROOT_DESC_USER, (mword)user_descriptors_next);
+ descr = MAKE_ROOT_DESC (ROOT_DESC_USER, (SgenDescriptor)user_descriptors_next);
user_descriptors [user_descriptors_next ++] = marker;
return descr;
}
void*
-sgen_get_complex_descriptor_bitmap (mword desc)
+sgen_get_complex_descriptor_bitmap (SgenDescriptor desc)
{
return complex_descriptors + (desc >> ROOT_DESC_TYPE_SHIFT);
}
SgenUserRootMarkFunc
-sgen_get_user_descriptor_func (mword desc)
+sgen_get_user_descriptor_func (SgenDescriptor desc)
{
return user_descriptors [desc >> ROOT_DESC_TYPE_SHIFT];
}
#ifdef HEAVY_STATISTICS
void
-sgen_descriptor_count_scanned_object (mword desc)
+sgen_descriptor_count_scanned_object (SgenDescriptor desc)
{
int type = desc & DESC_TYPE_MASK;
SGEN_ASSERT (0, type, "Descriptor type can't be zero");
}
void
-sgen_descriptor_count_copied_object (mword desc)
+sgen_descriptor_count_copied_object (SgenDescriptor desc)
{
int type = desc & DESC_TYPE_MASK;
SGEN_ASSERT (0, type, "Descriptor type can't be zero");
#include <mono/sgen/sgen-conf.h>
-
/*
* ######################################################################
* ######## GC descriptors
typedef void (*SgenUserMarkFunc) (GCObject **addr, void *gc_data);
typedef void (*SgenUserRootMarkFunc) (void *addr, SgenUserMarkFunc mark_func, void *gc_data);
-void* sgen_make_user_root_descriptor (SgenUserRootMarkFunc marker);
+SgenDescriptor sgen_make_user_root_descriptor (SgenUserRootMarkFunc marker);
-gsize* sgen_get_complex_descriptor (mword desc);
-void* sgen_get_complex_descriptor_bitmap (mword desc);
-SgenUserRootMarkFunc sgen_get_user_descriptor_func (mword desc);
+gsize* sgen_get_complex_descriptor (SgenDescriptor desc);
+void* sgen_get_complex_descriptor_bitmap (SgenDescriptor desc);
+SgenUserRootMarkFunc sgen_get_user_descriptor_func (SgenDescriptor desc);
void sgen_init_descriptors (void);
#ifdef HEAVY_STATISTICS
-void sgen_descriptor_count_scanned_object (mword desc);
-void sgen_descriptor_count_copied_object (mword desc);
+void sgen_descriptor_count_scanned_object (SgenDescriptor desc);
+void sgen_descriptor_count_copied_object (SgenDescriptor desc);
#endif
static inline gboolean
-sgen_gc_descr_has_references (mword desc)
+sgen_gc_descr_has_references (SgenDescriptor desc)
{
/* This covers SMALL_PTRFREE and COMPLEX_PTRFREE */
if ((desc & DESC_TYPE_PTRFREE_MASK) == DESC_TYPE_PTRFREE_BITS)
int i;
for (i = 0; i != max_objs; ++i) {
GCObject *obj;
- mword desc;
+ SgenDescriptor desc;
GRAY_OBJECT_DEQUEUE (queue, &obj, &desc);
if (!obj)
return TRUE;
while (start < end) {
void *obj_to_pin = NULL;
size_t obj_to_pin_size = 0;
- mword desc;
+ SgenDescriptor desc;
addr = *start;
{
for (;;) {
GCObject *addr;
- mword desc;
+ SgenDescriptor desc;
GRAY_OBJECT_DEQUEUE (queue, &addr, &desc);
if (!addr)
break;
* This function is not thread-safe!
*/
static void
-precisely_scan_objects_from (void** start_root, void** end_root, char* n_start, char *n_end, mword desc, ScanCopyContext ctx)
+precisely_scan_objects_from (void** start_root, void** end_root, char* n_start, char *n_end, SgenDescriptor desc, ScanCopyContext ctx)
{
CopyOrMarkObjectFunc copy_func = ctx.ops->copy_or_mark_object;
SgenGrayQueue *queue = ctx.queue;
* We do not coalesce roots.
*/
int
-sgen_register_root (char *start, size_t size, void *descr, int root_type)
+sgen_register_root (char *start, size_t size, SgenDescriptor descr, int root_type)
{
RootRecord new_root;
int i;
if (root) {
size_t old_size = root->end_root - start;
root->end_root = start + size;
- g_assert (((root->root_desc != 0) && (descr != NULL)) ||
- ((root->root_desc == 0) && (descr == NULL)));
- root->root_desc = (mword)descr;
+ SGEN_ASSERT (0, !!root->root_desc == !!descr, "Can't change whether a root is precise or conservative.");
+ root->root_desc = descr;
roots_size += size;
roots_size -= old_size;
UNLOCK_GC;
}
new_root.end_root = start + size;
- new_root.root_desc = (mword)descr;
+ new_root.root_desc = descr;
sgen_hash_table_replace (&roots_hash [root_type], start, &new_root, NULL);
roots_size += size;
- SGEN_LOG (3, "Added root for range: %p-%p, descr: %p (%d/%d bytes)", start, new_root.end_root, descr, (int)size, (int)roots_size);
+ SGEN_LOG (3, "Added root for range: %p-%p, descr: %llx (%d/%d bytes)", start, new_root.end_root, descr, (int)size, (int)roots_size);
UNLOCK_GC;
return TRUE;
SGEN_GC_BIT_FINALIZER_AWARE = 4,
};
-/* the runtime can register areas of memory as roots: we keep two lists of roots,
- * a pinned root set for conservatively scanned roots and a normal one for
- * precisely scanned roots (currently implemented as a single list).
- */
-typedef struct _RootRecord RootRecord;
-struct _RootRecord {
- char *end_root;
- mword root_desc;
-};
-
-enum {
- ROOT_TYPE_NORMAL = 0, /* "normal" roots */
- ROOT_TYPE_PINNED = 1, /* roots without a GC descriptor */
- ROOT_TYPE_WBARRIER = 2, /* roots with a write barrier */
- ROOT_TYPE_NUM
-};
-
-extern SgenHashTable roots_hash [ROOT_TYPE_NUM];
-
-int sgen_register_root (char *start, size_t size, void *descr, int root_type);
-void sgen_deregister_root (char* addr);
+typedef mword SgenDescriptor;
void sgen_gc_init (void);
#include "mono/sgen/sgen-descriptor.h"
#include "mono/sgen/sgen-gray.h"
+/* the runtime can register areas of memory as roots: we keep two lists of roots,
+ * a pinned root set for conservatively scanned roots and a normal one for
+ * precisely scanned roots (currently implemented as a single list).
+ */
+typedef struct _RootRecord RootRecord;
+struct _RootRecord {
+ char *end_root;
+ SgenDescriptor root_desc;
+};
+
+enum {
+ ROOT_TYPE_NORMAL = 0, /* "normal" roots */
+ ROOT_TYPE_PINNED = 1, /* roots without a GC descriptor */
+ ROOT_TYPE_WBARRIER = 2, /* roots with a write barrier */
+ ROOT_TYPE_NUM
+};
+
+extern SgenHashTable roots_hash [ROOT_TYPE_NUM];
+
+int sgen_register_root (char *start, size_t size, SgenDescriptor descr, int root_type);
+void sgen_deregister_root (char* addr);
+
typedef void (*IterateObjectCallbackFunc) (GCObject*, size_t, void*);
void sgen_scan_area_with_callback (char *start, char *end, IterateObjectCallbackFunc callback, void *data, gboolean allow_flags);
gboolean sgen_is_worker_thread (MonoNativeThreadId thread);
typedef void (*CopyOrMarkObjectFunc) (GCObject**, SgenGrayQueue*);
-typedef void (*ScanObjectFunc) (GCObject *obj, mword desc, SgenGrayQueue*);
-typedef void (*ScanVTypeFunc) (GCObject *full_object, char *start, mword desc, SgenGrayQueue* BINARY_PROTOCOL_ARG (size_t size));
+typedef void (*ScanObjectFunc) (GCObject *obj, SgenDescriptor desc, SgenGrayQueue*);
+typedef void (*ScanVTypeFunc) (GCObject *full_object, char *start, SgenDescriptor desc, SgenGrayQueue* BINARY_PROTOCOL_ARG (size_t size));
typedef struct {
CopyOrMarkObjectFunc copy_or_mark_object;
void sgen_wbarrier_value_copy_bitmap (gpointer _dest, gpointer _src, int size, unsigned bitmap);
-static inline mword
+static inline SgenDescriptor
sgen_obj_get_descriptor (GCObject *obj)
{
GCVTable vtable = SGEN_LOAD_VTABLE_UNCHECKED (obj);
return sgen_vtable_get_descriptor (vtable);
}
-static inline mword
+static inline SgenDescriptor
sgen_obj_get_descriptor_safe (GCObject *obj)
{
GCVTable vtable = SGEN_LOAD_VTABLE (obj);
*/
void
-sgen_gray_object_enqueue (SgenGrayQueue *queue, GCObject *obj, mword desc)
+sgen_gray_object_enqueue (SgenGrayQueue *queue, GCObject *obj, SgenDescriptor desc)
{
GrayQueueEntry entry = SGEN_GRAY_QUEUE_ENTRY (obj, desc);
typedef struct _GrayQueueEntry GrayQueueEntry;
struct _GrayQueueEntry {
GCObject *obj;
- mword desc;
+ SgenDescriptor desc;
};
#define SGEN_GRAY_QUEUE_ENTRY(obj,desc) { (obj), (desc) }
void sgen_init_gray_queues (void);
-void sgen_gray_object_enqueue (SgenGrayQueue *queue, GCObject *obj, mword desc);
+void sgen_gray_object_enqueue (SgenGrayQueue *queue, GCObject *obj, SgenDescriptor desc);
GrayQueueEntry sgen_gray_object_dequeue (SgenGrayQueue *queue);
GrayQueueSection* sgen_gray_object_dequeue_section (SgenGrayQueue *queue);
void sgen_gray_object_enqueue_section (SgenGrayQueue *queue, GrayQueueSection *section);
}
static inline MONO_ALWAYS_INLINE void
-GRAY_OBJECT_ENQUEUE (SgenGrayQueue *queue, GCObject *obj, mword desc)
+GRAY_OBJECT_ENQUEUE (SgenGrayQueue *queue, GCObject *obj, SgenDescriptor desc)
{
#if SGEN_MAX_DEBUG_LEVEL >= 9
sgen_gray_object_enqueue (queue, obj, desc);
}
static inline MONO_ALWAYS_INLINE void
-GRAY_OBJECT_DEQUEUE (SgenGrayQueue *queue, GCObject** obj, mword *desc)
+GRAY_OBJECT_DEQUEUE (SgenGrayQueue *queue, GCObject** obj, SgenDescriptor *desc)
{
GrayQueueEntry entry;
#if SGEN_MAX_DEBUG_LEVEL >= 9
++stat_optimized_copy;
{
char *forwarded;
- mword desc;
+ SgenDescriptor desc;
if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj)))
desc = sgen_obj_get_descriptor_safe (forwarded);
else
return FALSE;
} else {
mword vtable_word = *(mword*)obj;
- mword desc;
+ SgenDescriptor desc;
int type;
HEAVY_STAT (++stat_optimized_copy_major);
}
static void
-SCAN_OBJECT_FUNCTION_NAME (GCObject *obj, mword desc, SgenGrayQueue *queue)
+SCAN_OBJECT_FUNCTION_NAME (GCObject *obj, SgenDescriptor desc, SgenGrayQueue *queue)
{
char *start = (char*)obj;
for (;;) {
GCObject *obj;
- mword desc;
+ SgenDescriptor desc;
HEAVY_STAT (++stat_drain_loops);
#define ADD_TO_GLOBAL_REMSET(object,ptr,target) mark_mod_union_card ((object), (void**)(ptr))
static void
-major_scan_object_no_mark_concurrent_anywhere (GCObject *full_object, mword desc, SgenGrayQueue *queue)
+major_scan_object_no_mark_concurrent_anywhere (GCObject *full_object, SgenDescriptor desc, SgenGrayQueue *queue)
{
char *start = (char*)full_object;
}
static void
-major_scan_object_no_mark_concurrent_start (GCObject *start, mword desc, SgenGrayQueue *queue)
+major_scan_object_no_mark_concurrent_start (GCObject *start, SgenDescriptor desc, SgenGrayQueue *queue)
{
major_scan_object_no_mark_concurrent_anywhere (start, desc, queue);
}
static void
-major_scan_object_no_mark_concurrent (GCObject *start, mword desc, SgenGrayQueue *queue)
+major_scan_object_no_mark_concurrent (GCObject *start, SgenDescriptor desc, SgenGrayQueue *queue)
{
SGEN_ASSERT (0, !sgen_ptr_in_nursery (start), "Why are we scanning nursery objects in the concurrent collector?");
major_scan_object_no_mark_concurrent_anywhere (start, desc, queue);
#define ADD_TO_GLOBAL_REMSET(object,ptr,target) sgen_add_to_global_remset ((ptr), (target))
static void
-major_scan_vtype_concurrent_finish (GCObject *full_object, char *start, mword desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size))
+major_scan_vtype_concurrent_finish (GCObject *full_object, char *start, SgenDescriptor desc, SgenGrayQueue *queue BINARY_PROTOCOL_ARG (size_t size))
{
SGEN_OBJECT_LAYOUT_STATISTICS_DECLARE_BITMAP;
} while (0)
static void
-SERIAL_SCAN_OBJECT (GCObject *object, mword desc, SgenGrayQueue *queue)
+SERIAL_SCAN_OBJECT (GCObject *object, SgenDescriptor desc, SgenGrayQueue *queue)
{
char *start = (char*)object;
}
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;