Merge pull request #2810 from kumpera/fix_hazard_free
[mono.git] / mono / utils / hazard-pointer.h
1 /*
2  * hazard-pointer.h: Hazard pointer related code.
3  *
4  * (C) Copyright 2011 Novell, Inc
5  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
6  */
7 #ifndef __MONO_HAZARD_POINTER_H__
8 #define __MONO_HAZARD_POINTER_H__
9
10 #include <glib.h>
11 #include <mono/utils/mono-compiler.h>
12 #include <mono/utils/mono-membar.h>
13
14 #define HAZARD_POINTER_COUNT 3
15
16 typedef struct {
17         gpointer hazard_pointers [HAZARD_POINTER_COUNT];
18 } MonoThreadHazardPointers;
19
20 typedef void (*MonoHazardousFreeFunc) (gpointer p);
21
22 typedef enum {
23         HAZARD_FREE_MAY_LOCK,
24         HAZARD_FREE_NO_LOCK,
25 } HazardFreeLocking;
26
27 typedef enum {
28         HAZARD_FREE_SAFE_CTX,
29         HAZARD_FREE_ASYNC_CTX,
30 } HazardFreeContext;
31
32 gboolean mono_thread_hazardous_try_free (gpointer p, MonoHazardousFreeFunc free_func);
33 void mono_thread_hazardous_queue_free (gpointer p, MonoHazardousFreeFunc free_func);
34
35 void mono_thread_hazardous_try_free_all (void);
36 void mono_thread_hazardous_try_free_some (void);
37 MonoThreadHazardPointers* mono_hazard_pointer_get (void);
38 gpointer get_hazardous_pointer (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index);
39
40 #define mono_hazard_pointer_set(hp,i,v) \
41         do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \
42                 (hp)->hazard_pointers [(i)] = (v); \
43                 mono_memory_write_barrier (); \
44         } while (0)
45
46 #define mono_hazard_pointer_get_val(hp,i)       \
47         ((hp)->hazard_pointers [(i)])
48
49 #define mono_hazard_pointer_clear(hp,i) \
50         do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \
51                 mono_memory_write_barrier (); \
52                 (hp)->hazard_pointers [(i)] = NULL; \
53         } while (0)
54
55
56 void mono_thread_small_id_free (int id);
57 int mono_thread_small_id_alloc (void);
58
59 int mono_hazard_pointer_save_for_signal_handler (void);
60 void mono_hazard_pointer_restore_for_signal_handler (int small_id);
61
62 typedef void (*MonoHazardFreeQueueSizeCallback)(size_t size);
63 void mono_hazard_pointer_install_free_queue_size_callback (MonoHazardFreeQueueSizeCallback cb);
64
65 void mono_thread_smr_init (void);
66 void mono_thread_smr_cleanup (void);
67 #endif /*__MONO_HAZARD_POINTER_H__*/