2 * hazard-pointer.h: Hazard pointer related code.
4 * (C) Copyright 2011 Novell, Inc
6 #ifndef __MONO_HAZARD_POINTER_H__
7 #define __MONO_HAZARD_POINTER_H__
10 #include <mono/utils/mono-compiler.h>
11 #include <mono/utils/mono-membar.h>
13 #define HAZARD_POINTER_COUNT 3
16 gpointer hazard_pointers [HAZARD_POINTER_COUNT];
17 } MonoThreadHazardPointers;
19 typedef void (*MonoHazardousFreeFunc) (gpointer p);
28 HAZARD_FREE_ASYNC_CTX,
31 void mono_thread_hazardous_free_or_queue (gpointer p, MonoHazardousFreeFunc free_func,
32 HazardFreeLocking locking, HazardFreeContext context);
33 void mono_thread_hazardous_try_free_all (void);
34 void mono_thread_hazardous_try_free_some (void);
35 MonoThreadHazardPointers* mono_hazard_pointer_get (void);
36 gpointer get_hazardous_pointer (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index);
38 #define mono_hazard_pointer_set(hp,i,v) \
39 do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \
40 (hp)->hazard_pointers [(i)] = (v); \
41 mono_memory_write_barrier (); \
44 #define mono_hazard_pointer_get_val(hp,i) \
45 ((hp)->hazard_pointers [(i)])
47 #define mono_hazard_pointer_clear(hp,i) \
48 do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \
49 mono_memory_write_barrier (); \
50 (hp)->hazard_pointers [(i)] = NULL; \
54 void mono_thread_small_id_free (int id);
55 int mono_thread_small_id_alloc (void);
57 int mono_hazard_pointer_save_for_signal_handler (void);
58 void mono_hazard_pointer_restore_for_signal_handler (int small_id);
60 void mono_thread_smr_init (void);
61 void mono_thread_smr_cleanup (void);
62 #endif /*__MONO_HAZARD_POINTER_H__*/