3 * Hazard pointer related code.
5 * (C) Copyright 2011 Novell, Inc
6 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
8 #ifndef __MONO_HAZARD_POINTER_H__
9 #define __MONO_HAZARD_POINTER_H__
12 #include <mono/utils/mono-compiler.h>
13 #include <mono/utils/mono-membar.h>
14 #include <mono/utils/mono-publib.h>
16 #define HAZARD_POINTER_COUNT 3
19 gpointer hazard_pointers
[HAZARD_POINTER_COUNT
];
20 } MonoThreadHazardPointers
;
22 typedef void (*MonoHazardousFreeFunc
) (gpointer p
);
24 MONO_API gboolean
mono_thread_hazardous_try_free (gpointer p
, MonoHazardousFreeFunc free_func
);
25 MONO_API
void mono_thread_hazardous_queue_free (gpointer p
, MonoHazardousFreeFunc free_func
);
27 MONO_API
void mono_thread_hazardous_try_free_all (void);
28 void mono_thread_hazardous_try_free_some (void);
29 MONO_API MonoThreadHazardPointers
* mono_hazard_pointer_get (void);
30 gpointer
mono_get_hazardous_pointer (gpointer
volatile *pp
, MonoThreadHazardPointers
*hp
, int hazard_index
);
32 #define mono_hazard_pointer_set(hp,i,v) \
33 do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \
34 (hp)->hazard_pointers [(i)] = (v); \
35 mono_memory_write_barrier (); \
38 #define mono_hazard_pointer_get_val(hp,i) \
39 ((hp)->hazard_pointers [(i)])
41 #define mono_hazard_pointer_clear(hp,i) \
42 do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \
43 mono_memory_write_barrier (); \
44 (hp)->hazard_pointers [(i)] = NULL; \
48 void mono_thread_small_id_free (int id
);
49 int mono_thread_small_id_alloc (void);
51 int mono_hazard_pointer_save_for_signal_handler (void);
52 void mono_hazard_pointer_restore_for_signal_handler (int small_id
);
54 typedef void (*MonoHazardFreeQueueSizeCallback
)(size_t size
);
55 void mono_hazard_pointer_install_free_queue_size_callback (MonoHazardFreeQueueSizeCallback cb
);
57 void mono_thread_smr_init (void);
58 void mono_thread_smr_cleanup (void);
59 #endif /*__MONO_HAZARD_POINTER_H__*/