1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2007 Chris Wilson 3*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2009,2010 Red Hat, Inc. 4*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2011,2012 Google, Inc. 5*2d1272b8SAndroid Build Coastguard Worker * 6*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library. 7*2d1272b8SAndroid Build Coastguard Worker * 8*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without 9*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this 10*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the 11*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in 12*2d1272b8SAndroid Build Coastguard Worker * all copies of this software. 13*2d1272b8SAndroid Build Coastguard Worker * 14*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 15*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 16*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 17*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 18*2d1272b8SAndroid Build Coastguard Worker * DAMAGE. 19*2d1272b8SAndroid Build Coastguard Worker * 20*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 21*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 22*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 23*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 24*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 25*2d1272b8SAndroid Build Coastguard Worker * 26*2d1272b8SAndroid Build Coastguard Worker * Contributor(s): 27*2d1272b8SAndroid Build Coastguard Worker * Chris Wilson <[email protected]> 28*2d1272b8SAndroid Build Coastguard Worker * Red Hat Author(s): Behdad Esfahbod 29*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod 30*2d1272b8SAndroid Build Coastguard Worker */ 31*2d1272b8SAndroid Build Coastguard Worker 32*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_MUTEX_HH 33*2d1272b8SAndroid Build Coastguard Worker #define HB_MUTEX_HH 34*2d1272b8SAndroid Build Coastguard Worker 35*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh" 36*2d1272b8SAndroid Build Coastguard Worker 37*2d1272b8SAndroid Build Coastguard Worker 38*2d1272b8SAndroid Build Coastguard Worker /* mutex */ 39*2d1272b8SAndroid Build Coastguard Worker 40*2d1272b8SAndroid Build Coastguard Worker /* We need external help for these */ 41*2d1272b8SAndroid Build Coastguard Worker 42*2d1272b8SAndroid Build Coastguard Worker #if defined(hb_mutex_impl_init) \ 43*2d1272b8SAndroid Build Coastguard Worker && defined(hb_mutex_impl_lock) \ 44*2d1272b8SAndroid Build Coastguard Worker && defined(hb_mutex_impl_unlock) \ 45*2d1272b8SAndroid Build Coastguard Worker && defined(hb_mutex_impl_finish) 46*2d1272b8SAndroid Build Coastguard Worker 47*2d1272b8SAndroid Build Coastguard Worker /* Defined externally, i.e. in config.h; must have typedef'ed hb_mutex_impl_t as well. */ 48*2d1272b8SAndroid Build Coastguard Worker 49*2d1272b8SAndroid Build Coastguard Worker 50*2d1272b8SAndroid Build Coastguard Worker #elif !defined(HB_NO_MT) && !defined(HB_MUTEX_IMPL_STD_MUTEX) && (defined(HAVE_PTHREAD) || defined(__APPLE__)) 51*2d1272b8SAndroid Build Coastguard Worker 52*2d1272b8SAndroid Build Coastguard Worker #include <pthread.h> 53*2d1272b8SAndroid Build Coastguard Worker typedef pthread_mutex_t hb_mutex_impl_t; 54*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_init(M) pthread_mutex_init (M, nullptr) 55*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_lock(M) pthread_mutex_lock (M) 56*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_unlock(M) pthread_mutex_unlock (M) 57*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_finish(M) pthread_mutex_destroy (M) 58*2d1272b8SAndroid Build Coastguard Worker 59*2d1272b8SAndroid Build Coastguard Worker 60*2d1272b8SAndroid Build Coastguard Worker #elif !defined(HB_NO_MT) && !defined(HB_MUTEX_IMPL_STD_MUTEX) && defined(_WIN32) 61*2d1272b8SAndroid Build Coastguard Worker 62*2d1272b8SAndroid Build Coastguard Worker typedef CRITICAL_SECTION hb_mutex_impl_t; 63*2d1272b8SAndroid Build Coastguard Worker #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) 64*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_init(M) InitializeCriticalSectionEx (M, 0, 0) 65*2d1272b8SAndroid Build Coastguard Worker #else 66*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_init(M) InitializeCriticalSection (M) 67*2d1272b8SAndroid Build Coastguard Worker #endif 68*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_lock(M) EnterCriticalSection (M) 69*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_unlock(M) LeaveCriticalSection (M) 70*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_finish(M) DeleteCriticalSection (M) 71*2d1272b8SAndroid Build Coastguard Worker 72*2d1272b8SAndroid Build Coastguard Worker 73*2d1272b8SAndroid Build Coastguard Worker #elif !defined(HB_NO_MT) 74*2d1272b8SAndroid Build Coastguard Worker 75*2d1272b8SAndroid Build Coastguard Worker #include <mutex> 76*2d1272b8SAndroid Build Coastguard Worker typedef std::mutex hb_mutex_impl_t; 77*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_init(M) HB_STMT_START { new (M) hb_mutex_impl_t; } HB_STMT_END 78*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_lock(M) (M)->lock () 79*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_unlock(M) (M)->unlock () 80*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_finish(M) HB_STMT_START { (M)->~hb_mutex_impl_t(); } HB_STMT_END 81*2d1272b8SAndroid Build Coastguard Worker 82*2d1272b8SAndroid Build Coastguard Worker 83*2d1272b8SAndroid Build Coastguard Worker #else /* defined(HB_NO_MT) */ 84*2d1272b8SAndroid Build Coastguard Worker 85*2d1272b8SAndroid Build Coastguard Worker typedef int hb_mutex_impl_t; 86*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_init(M) HB_STMT_START {} HB_STMT_END 87*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_lock(M) HB_STMT_START {} HB_STMT_END 88*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_unlock(M) HB_STMT_START {} HB_STMT_END 89*2d1272b8SAndroid Build Coastguard Worker #define hb_mutex_impl_finish(M) HB_STMT_START {} HB_STMT_END 90*2d1272b8SAndroid Build Coastguard Worker 91*2d1272b8SAndroid Build Coastguard Worker 92*2d1272b8SAndroid Build Coastguard Worker #endif 93*2d1272b8SAndroid Build Coastguard Worker 94*2d1272b8SAndroid Build Coastguard Worker 95*2d1272b8SAndroid Build Coastguard Worker struct hb_mutex_t 96*2d1272b8SAndroid Build Coastguard Worker { 97*2d1272b8SAndroid Build Coastguard Worker /* Create space for, but do not initialize m. */ 98*2d1272b8SAndroid Build Coastguard Worker alignas(hb_mutex_impl_t) char m[sizeof (hb_mutex_impl_t)]; 99*2d1272b8SAndroid Build Coastguard Worker hb_mutex_thb_mutex_t100*2d1272b8SAndroid Build Coastguard Worker hb_mutex_t () { init (); } ~hb_mutex_thb_mutex_t101*2d1272b8SAndroid Build Coastguard Worker ~hb_mutex_t () { fini (); } 102*2d1272b8SAndroid Build Coastguard Worker 103*2d1272b8SAndroid Build Coastguard Worker #pragma GCC diagnostic push 104*2d1272b8SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wcast-align" inithb_mutex_t105*2d1272b8SAndroid Build Coastguard Worker void init () { hb_mutex_impl_init ((hb_mutex_impl_t *) m); } lockhb_mutex_t106*2d1272b8SAndroid Build Coastguard Worker void lock () { hb_mutex_impl_lock ((hb_mutex_impl_t *) m); } unlockhb_mutex_t107*2d1272b8SAndroid Build Coastguard Worker void unlock () { hb_mutex_impl_unlock ((hb_mutex_impl_t *) m); } finihb_mutex_t108*2d1272b8SAndroid Build Coastguard Worker void fini () { hb_mutex_impl_finish ((hb_mutex_impl_t *) m); } 109*2d1272b8SAndroid Build Coastguard Worker #pragma GCC diagnostic pop 110*2d1272b8SAndroid Build Coastguard Worker }; 111*2d1272b8SAndroid Build Coastguard Worker 112*2d1272b8SAndroid Build Coastguard Worker struct hb_lock_t 113*2d1272b8SAndroid Build Coastguard Worker { hb_lock_thb_lock_t114*2d1272b8SAndroid Build Coastguard Worker hb_lock_t (hb_mutex_t &mutex_) : mutex (&mutex_) { mutex->lock (); } hb_lock_thb_lock_t115*2d1272b8SAndroid Build Coastguard Worker hb_lock_t (hb_mutex_t *mutex_) : mutex (mutex_) { if (mutex) mutex->lock (); } ~hb_lock_thb_lock_t116*2d1272b8SAndroid Build Coastguard Worker ~hb_lock_t () { if (mutex) mutex->unlock (); } 117*2d1272b8SAndroid Build Coastguard Worker private: 118*2d1272b8SAndroid Build Coastguard Worker hb_mutex_t *mutex; 119*2d1272b8SAndroid Build Coastguard Worker }; 120*2d1272b8SAndroid Build Coastguard Worker 121*2d1272b8SAndroid Build Coastguard Worker 122*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_MUTEX_HH */ 123