xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-mutex.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
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