Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
1f88a3d
[handle] Rename handle-private.h to handle-arena.h
luhenry Jan 6, 2016
cc309fd
[handle] Implement mono_handle_(new|elevate) functions
luhenry Jan 6, 2016
ea53116
[handle] Fix typo
luhenry Jan 6, 2016
81de6b2
[handle] Remove SGen dependency
luhenry Jan 6, 2016
783a13d
[handle] Make handle.h use exclusively public headers and MONO_API fu…
luhenry Jan 6, 2016
11b8401
[handle] Add macro to push/pop arena
luhenry Jan 6, 2016
aadbf4a
[handle] Add GC alloc function
luhenry Jan 6, 2016
5ad6caa
[handle] Add String and Array alloc function
luhenry Jan 6, 2016
5c80c80
[handle] Add Object alloc function
luhenry Jan 8, 2016
5115814
[handle] Add mono_handle_obj_is_null utility function
luhenry Jan 6, 2016
fefb2c6
[handle] Rename MonoHandleStorage->obj to MonoHandleStorage->__privat…
luhenry Jan 6, 2016
f9b0187
[handle] Add _SETREF_NULL macros for MonoObjectHandle and MonoArrayHa…
lambdageek Jan 7, 2016
670f9ce
[coop] store MonoHandleArena pointer in MonoThreadInfo
lambdageek Dec 28, 2015
fc7ff95
[checked] Nest MONO_{PREPARE,FINISH}_GC_CRITICAL_REGION
lambdageek Jan 4, 2016
a61a721
[checked-build] Add in GC critical region assertion
luhenry Jan 11, 2016
7757891
[handle] Move System.Globalization icalls
luhenry Jan 6, 2016
75af549
[handle] Move ves_icall_System_Array_(Set|Get)Value(Impl) icall
luhenry Jan 8, 2016
999d6a9
[sgen] Remove DISABLE_CRITICAL_REGION as it's never defined
luhenry Jan 11, 2016
b22fde1
fixup! [handle] Add GC alloc function
luhenry Jan 12, 2016
52eb444
[handle] Implement mono_handle_array_nullable_init ()
lambdageek Jan 12, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mono/metadata/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ common_sources = \
seq-points-data.c \
handle.c \
handle.h \
handle-private.h
handle-arena.h


# These source files have compile time dependencies on GC code
Expand Down
30 changes: 30 additions & 0 deletions mono/metadata/boehm-gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1868,4 +1868,34 @@ mono_gchandle_free_domain (MonoDomain *domain)

}

/* Handle API specifics */

MONO_HANDLE_TYPE (MonoObject)
mono_handle_gc_alloc_obj (MonoVTable *vtable, size_t size, MonoError *error)
{
/* FIXME: in case of OOM, an exception will be thown and we will unwind the native stack */
g_error ("not implemented");
}

MONO_HANDLE_TYPE (MonoArray)
mono_handle_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length, MonoError *error)
{
/* FIXME: in case of OOM, an exception will be thown and we will unwind the native stack */
g_error ("not implemented");
}

MONO_HANDLE_TYPE (MonoArray)
mono_handle_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uintptr_t bounds_size, MonoError *error)
{
/* FIXME: in case of OOM, an exception will be thown and we will unwind the native stack */
g_error ("not implemented");
}

MONO_HANDLE_TYPE (MonoString)
mono_handle_gc_alloc_string (MonoVTable *vtable, size_t size, gint32 len, MonoError *error)
{
/* FIXME: in case of OOM, an exception will be thown and we will unwind the native stack */
g_error ("not implemented");
}

#endif /* no Boehm GC */
6 changes: 6 additions & 0 deletions mono/metadata/gc-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,12 @@ void* mono_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length
void* mono_gc_alloc_string (MonoVTable *vtable, size_t size, gint32 len);
MonoGCDescriptor mono_gc_make_descr_for_string (gsize *bitmap, int numbits);

MONO_HANDLE_TYPE (MonoObject) mono_handle_gc_alloc_pinned_obj (MonoVTable *vtable, size_t size, MonoError *error);
MONO_HANDLE_TYPE (MonoObject) mono_handle_gc_alloc_obj (MonoVTable *vtable, size_t size, MonoError *error);
MONO_HANDLE_TYPE (MonoArray) mono_handle_gc_alloc_vector (MonoVTable *vtable, size_t size, uintptr_t max_length, MonoError *error);
MONO_HANDLE_TYPE (MonoArray) mono_handle_gc_alloc_array (MonoVTable *vtable, size_t size, uintptr_t max_length, uintptr_t bounds_size, MonoError *error);
MONO_HANDLE_TYPE (MonoString) mono_handle_gc_alloc_string (MonoVTable *vtable, size_t size, gint32 len, MonoError *error);

void mono_gc_register_for_finalization (MonoObject *obj, void *user_data);
void mono_gc_add_memory_pressure (gint64 value);
MONO_API int mono_gc_register_root (char *start, size_t size, MonoGCDescriptor descr, MonoGCRootSource source, const char *msg);
Expand Down
55 changes: 55 additions & 0 deletions mono/metadata/handle-arena.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#ifndef __MONO_HANDLE_PRIVATE_H__
#define __MONO_HANDLE_PRIVATE_H__

#include <mono/metadata/handle.h>

typedef struct _MonoHandleArena MonoHandleArena;

gsize
mono_handle_arena_size (void);

MonoHandle
mono_handle_arena_new (MonoHandleArena *arena, MonoObject *obj);

MonoHandle
mono_handle_arena_elevate (MonoHandleArena *arena, MonoHandle handle);

void
mono_handle_arena_stack_push (MonoHandleArena **arena_stack, MonoHandleArena *arena);

void
mono_handle_arena_stack_pop (MonoHandleArena **arena_stack, MonoHandleArena *arena);

void
mono_handle_arena_initialize (MonoHandleArena **arena_stack);

void
mono_handle_arena_deinitialize (MonoHandleArena **arena_stack);

MonoHandleArena*
mono_handle_arena_current (void);

MonoHandleArena**
mono_handle_arena_current_addr (void);

#define MONO_HANDLE_ARENA_PUSH() \
do { \
MonoHandleArena **__arena_stack = mono_handle_arena_current_addr (); \
MonoHandleArena *__arena = (MonoHandleArena*) g_alloca (mono_handle_arena_size ()); \
mono_handle_arena_stack_push (__arena_stack, __arena)

#define MONO_HANDLE_ARENA_POP \
mono_handle_arena_stack_pop (__arena_stack, __arena); \
} while (0)

#define MONO_HANDLE_ARENA_POP_RETURN_UNSAFE(handle,ret) \
(ret) = (handle)->__private_obj; \
mono_handle_arena_stack_pop (__arena_stack, __arena); \
} while (0)

#define MONO_HANDLE_ARENA_POP_RETURN(handle,ret_handle) \
*((MonoHandle**)(&(ret_handle))) = mono_handle_elevate ((MonoHandle*)(handle)); \
mono_handle_arena_stack_pop(__arena_stack, __arena); \
} while (0)

#endif/*__MONO_HANDLE_PRIVATE_H__*/
29 changes: 0 additions & 29 deletions mono/metadata/handle-private.h

This file was deleted.

52 changes: 18 additions & 34 deletions mono/metadata/handle.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@
#include <glib.h>

#include <mono/metadata/handle.h>
#include <mono/metadata/handle-private.h>
#include <mono/metadata/handle-arena.h>
#include <mono/metadata/object-internals.h>
#include <mono/metadata/gc-internals.h>
#include <mono/utils/atomic.h>
#include <mono/utils/mono-lazy-init.h>
#include <mono/utils/mono-threads.h>

#define HANDLES_PER_CHUNK (16 - 2)

Expand All @@ -34,9 +35,7 @@ struct _MonoHandleArena {

static mono_lazy_init_t arena_status = MONO_LAZY_INIT_STATUS_NOT_INITIALIZED;

#ifdef HAVE_SGEN_GC
static MonoGCDescriptor arena_desc = MONO_GC_DESCRIPTOR_NULL;
#endif

static MonoHandleArenaChunk *chunk_free_list = NULL;

Expand Down Expand Up @@ -82,15 +81,15 @@ handle_new (MonoHandleArena *arena, MonoObject *obj)
chunk = arena->chunk_last;

if (chunk->handles_size < HANDLES_PER_CHUNK) {
chunk->handles [chunk->handles_size].obj = obj;
chunk->handles [chunk->handles_size].__private_obj = obj;
chunk->handles_size += 1;

return &chunk->handles [chunk->handles_size - 1];
}

chunk = chunk->next = chunk_alloc ();

chunk->handles [0].obj = obj;
chunk->handles [0].__private_obj = obj;
chunk->handles_size = 1;

arena->chunk_last = chunk;
Expand All @@ -105,16 +104,6 @@ mono_handle_arena_new (MonoHandleArena *arena, MonoObject *obj)
return handle_new (arena, obj);
}

MonoHandle
mono_handle_new (MonoObject *obj)
{
/* TODO: finish implementation by placing an arena somewhere
* in the current thread */
g_assert_not_reached ();
MonoHandleArena *arena = NULL;
return mono_handle_arena_new (arena, obj);
}

/*
* Elevate the handle to the parent arena
*/
Expand All @@ -125,17 +114,7 @@ mono_handle_arena_elevate (MonoHandleArena *arena, MonoHandle handle)
g_assert (arena);
g_assert (arena->prev);

return handle_new (arena->prev, handle->obj);
}

MonoHandle
mono_handle_elevate (MonoHandle handle)
{
/* TODO: finish implementation by placing an arena somewhere
* in the current thread */
g_assert_not_reached ();
MonoHandleArena *arena = NULL;
return mono_handle_arena_elevate (arena, handle);
return handle_new (arena->prev, handle->__private_obj);
}

gsize
Expand Down Expand Up @@ -190,8 +169,8 @@ arena_scan (gpointer addr, MonoGCMarkFunc mark_func, gpointer gc_data)
for (arena = *(MonoHandleArena**) addr; arena; arena = arena->prev) {
for (chunk = arena->chunk; chunk; chunk = chunk->next) {
for (i = 0; i < chunk->handles_size; ++i) {
if (chunk->handles [i].obj != NULL)
mark_func (&chunk->handles [i].obj, gc_data);
if (chunk->handles [i].__private_obj != NULL)
mark_func (&chunk->handles [i].__private_obj, gc_data);
}
}
}
Expand All @@ -200,25 +179,30 @@ arena_scan (gpointer addr, MonoGCMarkFunc mark_func, gpointer gc_data)
static void
initialize (void)
{
#ifdef HAVE_SGEN_GC
arena_desc = mono_gc_make_root_descr_user (arena_scan);
#endif
}

void
mono_handle_arena_initialize (MonoHandleArena **arena_stack)
{
#ifdef HAVE_SGEN_GC
mono_lazy_initialize (&arena_status, initialize);
mono_gc_register_root ((char*) arena_stack, sizeof (MonoHandleArena*), arena_desc, MONO_ROOT_SOURCE_HANDLE, "runtime threads handle arena");
#endif
}

void
mono_handle_arena_deinitialize (MonoHandleArena **arena_stack)
{
#ifdef HAVE_SGEN_GC
mono_gc_deregister_root ((char*) arena_stack);
#endif
}

MonoHandleArena*
mono_handle_arena_current (void)
{
return (MonoHandleArena*) mono_thread_info_current ()->handle_arena;
}

MonoHandleArena**
mono_handle_arena_current_addr (void)
{
return (MonoHandleArena**) &mono_thread_info_current ()->handle_arena;
}
Loading