1 /** 2 * \file 3 * Hazard pointer related code. 4 * 5 * (C) Copyright 2011 Novell, Inc 6 * Licensed under the MIT license. See LICENSE file in the project root for full license information. 7 */ 8 #ifndef __MONO_HAZARD_POINTER_H__ 9 #define __MONO_HAZARD_POINTER_H__ 10 11 #include <glib.h> 12 #include <mono/utils/mono-compiler.h> 13 #include <mono/utils/mono-membar.h> 14 #include <mono/utils/mono-publib.h> 15 16 #define HAZARD_POINTER_COUNT 3 17 18 typedef struct { 19 gpointer hazard_pointers [HAZARD_POINTER_COUNT]; 20 } MonoThreadHazardPointers; 21 22 typedef void (*MonoHazardousFreeFunc) (gpointer p); 23 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); 26 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); 31 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 (); \ 36 } while (0) 37 38 #define mono_hazard_pointer_get_val(hp,i) \ 39 ((hp)->hazard_pointers [(i)]) 40 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; \ 45 } while (0) 46 47 48 void mono_thread_small_id_free (int id); 49 int mono_thread_small_id_alloc (void); 50 51 int mono_hazard_pointer_save_for_signal_handler (void); 52 void mono_hazard_pointer_restore_for_signal_handler (int small_id); 53 54 typedef void (*MonoHazardFreeQueueSizeCallback)(size_t size); 55 void mono_hazard_pointer_install_free_queue_size_callback (MonoHazardFreeQueueSizeCallback cb); 56 57 void mono_thread_smr_init (void); 58 void mono_thread_smr_cleanup (void); 59 #endif /*__MONO_HAZARD_POINTER_H__*/ 60