Merge pull request #941 from upsilon/fix-layoutsettings-setter
[mono.git] / mono / utils / hazard-pointer.h
1 /*
2  * hazard-pointer.h: Hazard pointer related code.
3  *
4  * (C) Copyright 2011 Novell, Inc
5  */
6 #ifndef __MONO_HAZARD_POINTER_H__
7 #define __MONO_HAZARD_POINTER_H__
8
9 #include <glib.h>
10 #include <mono/utils/mono-compiler.h>
11 #include <mono/utils/mono-membar.h>
12
13 #define HAZARD_POINTER_COUNT 3
14
15 typedef struct {
16         gpointer hazard_pointers [HAZARD_POINTER_COUNT];
17 } MonoThreadHazardPointers;
18
19 typedef void (*MonoHazardousFreeFunc) (gpointer p);
20
21 void mono_thread_hazardous_free_or_queue (gpointer p, MonoHazardousFreeFunc free_func,
22                 gboolean free_func_might_lock, gboolean lock_free_context) MONO_INTERNAL;
23 void mono_thread_hazardous_try_free_all (void) MONO_INTERNAL;
24 void mono_thread_hazardous_try_free_some (void) MONO_INTERNAL;
25 MonoThreadHazardPointers* mono_hazard_pointer_get (void) MONO_INTERNAL;
26 gpointer get_hazardous_pointer (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index) MONO_INTERNAL;
27
28 #define mono_hazard_pointer_set(hp,i,v) \
29         do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \
30                 (hp)->hazard_pointers [(i)] = (v); \
31                 mono_memory_write_barrier (); \
32         } while (0)
33
34 #define mono_hazard_pointer_get_val(hp,i)       \
35         ((hp)->hazard_pointers [(i)])
36
37 #define mono_hazard_pointer_clear(hp,i) \
38         do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \
39                 (hp)->hazard_pointers [(i)] = NULL; \
40         } while (0)
41
42
43 void mono_thread_small_id_free (int id) MONO_INTERNAL;
44 int mono_thread_small_id_alloc (void) MONO_INTERNAL;
45
46 int mono_hazard_pointer_save_for_signal_handler (void) MONO_INTERNAL;
47 void mono_hazard_pointer_restore_for_signal_handler (int small_id) MONO_INTERNAL;
48
49 void mono_thread_smr_init (void) MONO_INTERNAL;
50 void mono_thread_smr_cleanup (void) MONO_INTERNAL;
51 #endif /*__MONO_HAZARD_POINTER_H__*/