2 * handle.h: Handle to object in native code
5 * - Ludovic Henry <ludovic@xamarin.com>
7 * Copyright 2015 Xamarin, Inc. (www.xamarin.com)
10 #ifndef __MONO_HANDLE_H__
11 #define __MONO_HANDLE_H__
16 #include <mono/metadata/object.h>
17 #include <mono/metadata/class.h>
22 * DO NOT ACCESS DIRECTLY
23 * USE mono_handle_obj BELOW TO ACCESS OBJ
25 * The field obj is not private as there is no way to do that
26 * in C, but using a C++ template would simplify that a lot
29 MonoObject *__private_obj;
32 typedef MonoHandleStorage* MonoHandle;
34 typedef struct _MonoHandleArena MonoHandleArena;
37 mono_handle_arena_size (void);
40 mono_handle_arena_new (MonoHandleArena *arena, MonoObject *obj);
43 mono_handle_arena_elevate (MonoHandleArena *arena, MonoHandle handle);
46 mono_handle_arena_stack_push (MonoHandleArena **arena_stack, MonoHandleArena *arena);
49 mono_handle_arena_stack_pop (MonoHandleArena **arena_stack, MonoHandleArena *arena);
52 mono_handle_arena_initialize (MonoHandleArena **arena_stack);
55 mono_handle_arena_deinitialize (MonoHandleArena **arena_stack);
58 mono_handle_arena_current (void);
61 mono_handle_arena_current_addr (void);
63 #define MONO_HANDLE_ARENA_PUSH() \
65 MonoHandleArena **__arena_stack = mono_handle_arena_current_addr (); \
66 MonoHandleArena *__arena = (MonoHandleArena*) g_alloca (mono_handle_arena_size ()); \
67 mono_handle_arena_stack_push (__arena_stack, __arena)
69 #define MONO_HANDLE_ARENA_POP \
70 mono_handle_arena_stack_pop (__arena_stack, __arena); \
73 #define MONO_HANDLE_ARENA_POP_RETURN_UNSAFE(handle,ret) \
74 (ret) = (handle)->__private_obj; \
75 mono_handle_arena_stack_pop (__arena_stack, __arena); \
78 #define MONO_HANDLE_ARENA_POP_RETURN(handle,ret_handle) \
79 *((MonoHandle**)(&(ret_handle))) = mono_handle_elevate ((MonoHandle*)(handle)); \
80 mono_handle_arena_stack_pop(__arena_stack, __arena); \
83 static inline MonoHandle
84 mono_handle_new (MonoObject *obj)
86 return mono_handle_arena_new (mono_handle_arena_current (), obj);
89 static inline MonoHandle
90 mono_handle_elevate (MonoHandle handle)
92 return mono_handle_arena_elevate (mono_handle_arena_current (), handle);
97 #define mono_handle_obj(handle) ((handle)->__private_obj)
99 #define mono_handle_assign(handle,rawptr) do { (handle)->__private_obj = (rawptr); } while(0)
104 mono_handle_check_in_critical_section ()
106 MONO_REQ_GC_UNSAFE_MODE;
109 #define mono_handle_obj(handle) (mono_handle_check_in_critical_section (), (handle)->__private_obj)
111 #define mono_handle_assign(handle,rawptr) do { mono_handle_check_in_critical_section (); (handle)->__private_obj = (rawptr); } while (0)
115 static inline MonoClass*
116 mono_handle_class (MonoHandle handle)
118 return mono_object_get_class (handle->__private_obj);
121 static inline MonoDomain*
122 mono_handle_domain (MonoHandle handle)
124 return mono_object_get_domain (handle->__private_obj);
127 #define mono_handle_obj_is_null(handle) ((handle)->__private_obj == NULL)
129 #define MONO_HANDLE_TYPE_DECL(type) typedef struct { type *__private_obj; } type ## HandleStorage ; \
130 typedef type ## HandleStorage * type ## Handle
131 #define MONO_HANDLE_TYPE(type) type ## Handle
132 #define MONO_HANDLE_NEW(type,obj) ((type ## Handle) mono_handle_new ((MonoObject*) (obj)))
133 #define MONO_HANDLE_ELEVATE(type,handle) ((type ## Handle) mono_handle_elevate ((MonoObject*) (handle)->__private_obj))
135 #define MONO_HANDLE_ASSIGN(handle,rawptr) \
137 mono_handle_assign ((handle), (rawptr)); \
140 #define MONO_HANDLE_SETREF(handle,fieldname,value) \
142 MonoHandle __value = (MonoHandle) (value); \
143 MONO_PREPARE_GC_CRITICAL_REGION; \
144 MONO_OBJECT_SETREF (mono_handle_obj ((handle)), fieldname, mono_handle_obj (__value)); \
145 MONO_FINISH_GC_CRITICAL_REGION; \
148 #define MONO_HANDLE_SET(handle,fieldname,value) \
150 MONO_PREPARE_GC_CRITICAL_REGION; \
151 mono_handle_obj ((handle))->fieldname = (value); \
152 MONO_FINISH_GC_CRITICAL_REGION; \
155 #define MONO_HANDLE_ARRAY_SETREF(handle,index,value) \
157 MonoHandle __value = (MonoHandle) (value); \
158 MONO_PREPARE_GC_CRITICAL_REGION; \
159 mono_array_setref (mono_handle_obj ((handle)), (index), mono_handle_obj (__value)); \
160 MONO_FINISH_GC_CRITICAL_REGION; \
163 #define MONO_HANDLE_ARRAY_SET(handle,type,index,value) \
165 MONO_PREPARE_GC_CRITICAL_REGION; \
166 mono_array_set (mono_handle_obj ((handle)), type, (index), (value)); \
167 MONO_FINISH_GC_CRITICAL_REGION; \
173 /* Some common handle types */
175 MONO_HANDLE_TYPE_DECL (MonoArray);
176 MONO_HANDLE_TYPE_DECL (MonoString);
180 #endif /* __MONO_HANDLE_H__ */