X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fhazard-pointer.h;h=fa70e71bb40d1853f0269b95ada6d32f1262eda7;hb=ff49850dfc18f5991246a203184fa1e0b8a7c7ab;hp=08d2244c4c9597cfdcd1276de3043b1532d5c8d6;hpb=6ba40a65cc3c0be7fc25b15a66696286b3c167b1;p=mono.git diff --git a/mono/utils/hazard-pointer.h b/mono/utils/hazard-pointer.h index 08d2244c4c9..fa70e71bb40 100644 --- a/mono/utils/hazard-pointer.h +++ b/mono/utils/hazard-pointer.h @@ -7,22 +7,36 @@ #define __MONO_HAZARD_POINTER_H__ #include -#include #include +#include + +#define HAZARD_POINTER_COUNT 3 typedef struct { - gpointer hazard_pointers [2]; + gpointer hazard_pointers [HAZARD_POINTER_COUNT]; } MonoThreadHazardPointers; typedef void (*MonoHazardousFreeFunc) (gpointer p); -void mono_thread_hazardous_free_or_queue (gpointer p, MonoHazardousFreeFunc free_func) MONO_INTERNAL; -void mono_thread_hazardous_try_free_all (void) MONO_INTERNAL; -MonoThreadHazardPointers* mono_hazard_pointer_get (void) MONO_INTERNAL; -gpointer get_hazardous_pointer (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index) MONO_INTERNAL; +typedef enum { + HAZARD_FREE_MAY_LOCK, + HAZARD_FREE_NO_LOCK, +} HazardFreeLocking; + +typedef enum { + HAZARD_FREE_SAFE_CTX, + HAZARD_FREE_ASYNC_CTX, +} HazardFreeContext; + +void mono_thread_hazardous_free_or_queue (gpointer p, MonoHazardousFreeFunc free_func, + HazardFreeLocking locking, HazardFreeContext context); +void mono_thread_hazardous_try_free_all (void); +void mono_thread_hazardous_try_free_some (void); +MonoThreadHazardPointers* mono_hazard_pointer_get (void); +gpointer get_hazardous_pointer (gpointer volatile *pp, MonoThreadHazardPointers *hp, int hazard_index); #define mono_hazard_pointer_set(hp,i,v) \ - do { g_assert ((i) == 0 || (i) == 1); \ + do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \ (hp)->hazard_pointers [(i)] = (v); \ mono_memory_write_barrier (); \ } while (0) @@ -31,14 +45,18 @@ gpointer get_hazardous_pointer (gpointer volatile *pp, MonoThreadHazardPointers ((hp)->hazard_pointers [(i)]) #define mono_hazard_pointer_clear(hp,i) \ - do { g_assert ((i) == 0 || (i) == 1); \ + do { g_assert ((i) >= 0 && (i) < HAZARD_POINTER_COUNT); \ + mono_memory_write_barrier (); \ (hp)->hazard_pointers [(i)] = NULL; \ } while (0) -void mono_thread_small_id_free (int id) MONO_INTERNAL; -int mono_thread_small_id_alloc (MonoInternalThread *thread) MONO_INTERNAL; +void mono_thread_small_id_free (int id); +int mono_thread_small_id_alloc (void); + +int mono_hazard_pointer_save_for_signal_handler (void); +void mono_hazard_pointer_restore_for_signal_handler (int small_id); -void mono_thread_smr_init (void) MONO_INTERNAL; -void mono_thread_smr_cleanup (void) MONO_INTERNAL; +void mono_thread_smr_init (void); +void mono_thread_smr_cleanup (void); #endif /*__MONO_HAZARD_POINTER_H__*/