#ifndef DISABLE_CRITICAL_REGION
ENTER_CRITICAL_REGION;
- arr = sgen_try_alloc_obj_nolock (vtable, size);
+ arr = (MonoArray*)sgen_try_alloc_obj_nolock (vtable, size);
if (arr) {
/*This doesn't require fencing since EXIT_CRITICAL_REGION already does it for us*/
arr->max_length = (mono_array_size_t)max_length;
LOCK_GC;
- arr = sgen_alloc_obj_nolock (vtable, size);
+ arr = (MonoArray*)sgen_alloc_obj_nolock (vtable, size);
if (G_UNLIKELY (!arr)) {
UNLOCK_GC;
return mono_gc_out_of_memory (size);
#ifndef DISABLE_CRITICAL_REGION
ENTER_CRITICAL_REGION;
- arr = sgen_try_alloc_obj_nolock (vtable, size);
+ arr = (MonoArray*)sgen_try_alloc_obj_nolock (vtable, size);
if (arr) {
/*This doesn't require fencing since EXIT_CRITICAL_REGION already does it for us*/
arr->max_length = (mono_array_size_t)max_length;
LOCK_GC;
- arr = sgen_alloc_obj_nolock (vtable, size);
+ arr = (MonoArray*)sgen_alloc_obj_nolock (vtable, size);
if (G_UNLIKELY (!arr)) {
UNLOCK_GC;
return mono_gc_out_of_memory (size);
#ifndef DISABLE_CRITICAL_REGION
ENTER_CRITICAL_REGION;
- str = sgen_try_alloc_obj_nolock (vtable, size);
+ str = (MonoString*)sgen_try_alloc_obj_nolock (vtable, size);
if (str) {
/*This doesn't require fencing since EXIT_CRITICAL_REGION already does it for us*/
str->length = len;
LOCK_GC;
- str = sgen_alloc_obj_nolock (vtable, size);
+ str = (MonoString*)sgen_alloc_obj_nolock (vtable, size);
if (G_UNLIKELY (!str)) {
UNLOCK_GC;
return mono_gc_out_of_memory (size);
#define TLAB_REAL_END (__thread_info__->tlab_real_end)
#endif
-static void*
+static GCObject*
alloc_degraded (GCVTable vtable, size_t size, gboolean for_mature)
{
- void *p;
+ GCObject *p;
if (!for_mature) {
sgen_client_degraded_allocation (size);
* so when we scan the thread stacks for pinned objects, we can start
* a search for the pinned object in SGEN_SCAN_START_SIZE chunks.
*/
-void*
+GCObject*
sgen_alloc_obj_nolock (GCVTable vtable, size_t size)
{
/* FIXME: handle OOM */
g_assert (*p == NULL);
mono_atomic_store_seq (p, vtable);
- return p;
+ return (GCObject*)p;
}
/* Slow path */
mono_atomic_store_seq (p, vtable);
}
- return p;
+ return (GCObject*)p;
}
-void*
+GCObject*
sgen_try_alloc_obj_nolock (GCVTable vtable, size_t size)
{
void **p;
mono_atomic_store_seq (p, vtable);
- return p;
+ return (GCObject*)p;
}
-void*
+GCObject*
sgen_alloc_obj (GCVTable vtable, size_t size)
{
- void *res;
+ GCObject *res;
TLAB_ACCESS_INIT;
if (!SGEN_CAN_ALIGN_UP (size))
* To be used for interned strings and possibly MonoThread, reflection handles.
* We may want to explicitly free these objects.
*/
-void*
+GCObject*
sgen_alloc_obj_pinned (GCVTable vtable, size_t size)
{
- void **p;
+ GCObject *p;
if (!SGEN_CAN_ALIGN_UP (size))
return NULL;
return p;
}
-void*
+GCObject*
sgen_alloc_obj_mature (GCVTable vtable, size_t size)
{
- void *res;
+ GCObject *res;
if (!SGEN_CAN_ALIGN_UP (size))
return NULL;
gboolean has_references = SGEN_VTABLE_HAS_REFERENCES (vt);
mword objsize = SGEN_ALIGN_UP (sgen_client_par_object_get_size (vt, obj));
/* FIXME: Does this not mark the newly allocated object? */
- char *destination = COLLECTOR_SERIAL_ALLOC_FOR_PROMOTION (vt, obj, objsize, has_references);
+ void *destination = COLLECTOR_SERIAL_ALLOC_FOR_PROMOTION (vt, obj, objsize, has_references);
if (G_UNLIKELY (!destination)) {
/* FIXME: Is this path ever tested? */
sgen_nursery_allocator_prepare_for_pinning ();
while (start < end) {
- void *obj_to_pin = NULL;
+ GCObject *obj_to_pin = NULL;
size_t obj_to_pin_size = 0;
SgenDescriptor desc;
if (addr >= search_start && (char*)addr < (char*)search_start + obj_size) {
/* This is the object we're looking for. */
- obj_to_pin = search_start;
+ obj_to_pin = (GCObject*)search_start;
obj_to_pin_size = canarified_obj_size;
break;
}
* If this is a dummy array marking the beginning of a nursery
* fragment, we don't pin it.
*/
- if (sgen_client_object_is_array_fill ((GCObject*)obj_to_pin))
+ if (sgen_client_object_is_array_fill (obj_to_pin))
goto next_pin_queue_entry;
/*
* when we can't promote an object because we're out of memory.
*/
void
-sgen_pin_object (void *object, GrayQueue *queue)
+sgen_pin_object (GCObject *object, GrayQueue *queue)
{
/*
* All pinned objects are assumed to have been staged, so we need to stage as well.
size_t i;
for (i = 0; i < fin_queue->next_slot; ++i) {
- void *obj = fin_queue->data [i];
+ GCObject *obj = fin_queue->data [i];
if (!obj)
continue;
SGEN_LOG (5, "Scan of fin ready object: %p (%s)\n", obj, sgen_client_vtable_get_name (SGEN_LOAD_VTABLE (obj)));
* Return TRUE if @obj is ready to be finalized.
*/
static inline gboolean
-sgen_is_object_alive (void *object)
+sgen_is_object_alive (GCObject *object)
{
if (ptr_in_nursery (object))
return sgen_nursery_is_object_alive (object);
gboolean
-sgen_gc_is_object_ready_for_finalization (void *object)
+sgen_gc_is_object_ready_for_finalization (GCObject *object)
{
return !sgen_is_object_alive (object);
}
}
gboolean
-sgen_object_is_live (void *obj)
+sgen_object_is_live (GCObject *obj)
{
return sgen_is_object_alive_and_on_current_collection (obj);
}
/* FIXME: batch to reduce lock contention */
while (sgen_have_pending_finalizers ()) {
- void *obj;
+ GCObject *obj;
LOCK_GC;
typedef struct {
gboolean is_split;
- char* (*alloc_for_promotion) (GCVTable vtable, GCObject *obj, size_t objsize, gboolean has_references);
+ GCObject* (*alloc_for_promotion) (GCVTable vtable, GCObject *obj, size_t objsize, gboolean has_references);
SgenObjectOperations serial_ops;
#ifdef SGEN_CHECK_UPDATE_REFERENCE
gboolean sgen_thread_pool_is_thread_pool_thread (MonoNativeThreadId some_thread) MONO_INTERNAL;
static inline void
-sgen_update_reference (void **p, void *o, gboolean allow_null)
+sgen_update_reference (GCObject **p, GCObject *o, gboolean allow_null)
{
if (!allow_null)
SGEN_ASSERT (0, o, "Cannot update a reference with a NULL pointer");
*p = o;
}
-#define SGEN_UPDATE_REFERENCE_ALLOW_NULL(p,o) sgen_update_reference ((void**)(p), (void*)(o), TRUE)
-#define SGEN_UPDATE_REFERENCE(p,o) sgen_update_reference ((void**)(p), (void*)(o), FALSE)
+#define SGEN_UPDATE_REFERENCE_ALLOW_NULL(p,o) sgen_update_reference ((GCObject**)(p), (GCObject*)(o), TRUE)
+#define SGEN_UPDATE_REFERENCE(p,o) sgen_update_reference ((GCObject**)(p), (GCObject*)(o), FALSE)
#else
-#define SGEN_UPDATE_REFERENCE_ALLOW_NULL(p,o) (*(void**)(p) = (void*)(o))
+#define SGEN_UPDATE_REFERENCE_ALLOW_NULL(p,o) (*(GCObject**)(p) = (GCObject*)(o))
#define SGEN_UPDATE_REFERENCE(p,o) SGEN_UPDATE_REFERENCE_ALLOW_NULL ((p), (o))
#endif
void* (*alloc_heap) (mword nursery_size, mword nursery_align, int nursery_bits);
gboolean (*is_object_live) (GCObject *obj);
- void* (*alloc_small_pinned_obj) (GCVTable vtable, size_t size, gboolean has_references);
- void* (*alloc_degraded) (GCVTable vtable, size_t size);
+ GCObject* (*alloc_small_pinned_obj) (GCVTable vtable, size_t size, gboolean has_references);
+ GCObject* (*alloc_degraded) (GCVTable vtable, size_t size);
SgenObjectOperations major_ops_serial;
SgenObjectOperations major_ops_concurrent_start;
SgenObjectOperations major_ops_concurrent;
SgenObjectOperations major_ops_concurrent_finish;
- void* (*alloc_object) (GCVTable vtable, size_t size, gboolean has_references);
+ GCObject* (*alloc_object) (GCVTable vtable, size_t size, gboolean has_references);
void (*free_pinned_object) (GCObject *obj, size_t size);
/*
#include "metadata/sgen-client-mono.h"
#endif
-gboolean sgen_object_is_live (void *obj);
+gboolean sgen_object_is_live (GCObject *obj);
void sgen_init_fin_weak_hash (void);
void sgen_null_links_if (SgenObjectPredicateFunc predicate, void *data, int generation);
-gboolean sgen_gc_is_object_ready_for_finalization (void *object);
+gboolean sgen_gc_is_object_ready_for_finalization (GCObject *object);
void sgen_gc_lock (void);
void sgen_gc_unlock (void);
SPACE_LOS
};
-void sgen_pin_object (void *object, SgenGrayQueue *queue);
+void sgen_pin_object (GCObject *object, SgenGrayQueue *queue);
void sgen_set_pinned_from_failed_allocation (mword objsize);
void sgen_ensure_free_space (size_t size);
void sgen_nursery_alloc_prepare_for_minor (void);
void sgen_nursery_alloc_prepare_for_major (void);
-char* sgen_alloc_for_promotion (GCObject *obj, size_t objsize, gboolean has_references);
+GCObject* sgen_alloc_for_promotion (GCObject *obj, size_t objsize, gboolean has_references);
-void* sgen_alloc_obj_nolock (GCVTable vtable, size_t size);
-void* sgen_try_alloc_obj_nolock (GCVTable vtable, size_t size);
+GCObject* sgen_alloc_obj_nolock (GCVTable vtable, size_t size);
+GCObject* sgen_try_alloc_obj_nolock (GCVTable vtable, size_t size);
/* Threads */
void sgen_init_tlab_info (SgenThreadInfo* info);
void sgen_clear_tlabs (void);
-void* sgen_alloc_obj (GCVTable vtable, size_t size);
-void* sgen_alloc_obj_pinned (GCVTable vtable, size_t size);
-void* sgen_alloc_obj_mature (GCVTable vtable, size_t size);
+GCObject* sgen_alloc_obj (GCVTable vtable, size_t size);
+GCObject* sgen_alloc_obj_pinned (GCVTable vtable, size_t size);
+GCObject* sgen_alloc_obj_mature (GCVTable vtable, size_t size);
/* Debug support */
return obj;
}
-static void*
+static GCObject*
alloc_obj (GCVTable vtable, size_t size, gboolean pinned, gboolean has_references)
{
int size_index = MS_BLOCK_OBJ_SIZE_INDEX (size);
return obj;
}
-static void*
+static GCObject*
major_alloc_object (GCVTable vtable, size_t size, gboolean has_references)
{
return alloc_obj (vtable, size, FALSE, has_references);
}
/* size is a multiple of SGEN_ALLOC_ALIGN */
-static void*
+static GCObject*
major_alloc_small_pinned_obj (GCVTable vtable, size_t size, gboolean has_references)
{
void *res;
/*
* size is already rounded up and we hold the GC lock.
*/
-static void*
+static GCObject*
major_alloc_degraded (GCVTable vtable, size_t size)
{
- void *obj = alloc_obj (vtable, size, FALSE, SGEN_VTABLE_HAS_REFERENCES (vtable));
+ GCObject *obj = alloc_obj (vtable, size, FALSE, SGEN_VTABLE_HAS_REFERENCES (vtable));
if (G_LIKELY (obj)) {
HEAVY_STAT (++stat_objects_alloced_degraded);
HEAVY_STAT (stat_bytes_alloced_degraded += size);
#include "mono/sgen/sgen-layout-stats.h"
#include "mono/sgen/sgen-client.h"
-static inline char*
+static inline GCObject*
alloc_for_promotion (GCVTable vtable, GCObject *obj, size_t objsize, gboolean has_references)
{
return major_collector.alloc_object (vtable, objsize, has_references);
return p;
}
-static inline char*
+static inline GCObject*
alloc_for_promotion (GCVTable vtable, GCObject *obj, size_t objsize, gboolean has_references)
{
char *p = NULL;
/* FIXME: assumes object layout */
*(GCVTable*)p = vtable;
- return p;
+ return (GCObject*)p;
}
-static char*
+static GCObject*
minor_alloc_for_promotion (GCVTable vtable, GCObject *obj, size_t objsize, gboolean has_references)
{
/*