From: Behdad Esfahbod Date: Thu, 21 Apr 2011 20:16:21 +0000 (-0400) Subject: Cleanup hb_refrence_count_t X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3e8bdbf9414291da5cf61213d5f4275c1ae23ae5;p=platform%2Fupstream%2FlibHarfBuzzSharp.git Cleanup hb_refrence_count_t --- diff --git a/src/hb-object-private.hh b/src/hb-object-private.hh index 930f616..74bc3ad 100644 --- a/src/hb-object-private.hh +++ b/src/hb-object-private.hh @@ -38,18 +38,31 @@ HB_BEGIN_DECLS typedef struct { hb_atomic_int_t ref_count; +#define HB_REFERENCE_COUNT_INVALID_VALUE ((hb_atomic_int_t) -1) +#define HB_REFERENCE_COUNT_INVALID {HB_REFERENCE_COUNT_INVALID_VALUE} + inline void init (int v) { ref_count = v; /* non-atomic is fine */ } inline int inc (void) { return hb_atomic_int_fetch_and_add (ref_count, 1); } inline int dec (void) { return hb_atomic_int_fetch_and_add (ref_count, -1); } inline void set (int v) { return hb_atomic_int_set (ref_count, v); } + + /* XXX + * + * One thing I'm not sure. The following two methods should be declared + * const. However, that assumes that hb_atomic_int_get() is const. I have + * a vague memory hearing from Chris Wilson or Jeff Muizelaar that atomic get + * is implemented as a fetch_and_add(0). In which case it does write to the + * memory, and hence cannot be called on .rodata section. But that's how we + * use it. + * + * If that is indeed the case, then perhaps is_invalid() should do a + * non-protected read of the location. + */ inline int get (void) { return hb_atomic_int_get (ref_count); } + inline bool is_invalid (void) { return get () == HB_REFERENCE_COUNT_INVALID_VALUE; } } hb_reference_count_t; -#define HB_REFERENCE_COUNT_INVALID_VALUE ((hb_atomic_int_t) -1) -#define HB_REFERENCE_COUNT_INVALID {HB_REFERENCE_COUNT_INVALID_VALUE} - -#define HB_REFERENCE_COUNT_IS_INVALID(RC) ((RC).get () == HB_REFERENCE_COUNT_INVALID_VALUE) /* Debug */ @@ -77,7 +90,7 @@ _hb_trace_object (const void *obj, /* Object allocation and lifecycle manamgement macros */ #define HB_OBJECT_IS_INERT(obj) \ - (unlikely (HB_REFERENCE_COUNT_IS_INVALID ((obj)->ref_count))) + (unlikely ((obj)->ref_count.is_invalid ())) #define HB_OBJECT_DO_INIT_EXPR(obj) \ obj->ref_count.init (1) diff --git a/src/hb-private.hh b/src/hb-private.hh index d08a4d0..ae52889 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -212,7 +212,7 @@ typedef int (*hb_compare_func_t) (const void *, const void *); #include -typedef int hb_atomic_int_t; +typedef volatile int hb_atomic_int_t; #define hb_atomic_int_fetch_and_add(AI, V) g_atomic_int_exchange_and_add (&(AI), V) #define hb_atomic_int_get(AI) g_atomic_int_get (&(AI)) #define hb_atomic_int_set(AI, V) g_atomic_int_set (&(AI), V) @@ -235,12 +235,12 @@ typedef GStaticMutex hb_mutex_t; #warning "Could not find any system to define platform macros, library will NOT be thread-safe" #endif -typedef int hb_atomic_int_t; +typedef volatile int hb_atomic_int_t; #define hb_atomic_int_fetch_and_add(AI, V) ((AI) += (V), (AI) - (V)) #define hb_atomic_int_get(AI) (AI) #define hb_atomic_int_set(AI, V) HB_STMT_START { (AI) = (V); } HB_STMT_END -typedef int hb_mutex_t; +typedef volatile int hb_mutex_t; #define HB_MUTEX_INIT 0 #define hb_mutex_init(M) HB_STMT_START { (M) = 0; } HB_STMT_END #define hb_mutex_lock(M) HB_STMT_START { (M) = 1; } HB_STMT_END