xref: /aosp_15_r20/external/fastrpc/inc/mutex.h (revision 418b791d679beb2078b579a3b6936cf330c41799)
1*418b791dSBob Badour #ifndef MUTEX_H
2*418b791dSBob Badour #define MUTEX_H
3*418b791dSBob Badour 
4*418b791dSBob Badour /**
5*418b791dSBob Badour  * Copyright (c) 2019, The Linux Foundation. All rights reserved.
6*418b791dSBob Badour  *
7*418b791dSBob Badour  * Redistribution and use in source and binary forms, with or without
8*418b791dSBob Badour  * modification, are permitted provided that the following conditions are
9*418b791dSBob Badour  * met:
10*418b791dSBob Badour  *    * Redistributions of source code must retain the above copyright
11*418b791dSBob Badour  *      notice, this list of conditions and the following disclaimer.
12*418b791dSBob Badour  *    * Redistributions in binary form must reproduce the above
13*418b791dSBob Badour  *      copyright notice, this list of conditions and the following
14*418b791dSBob Badour  *      disclaimer in the documentation and/or other materials provided
15*418b791dSBob Badour  *      with the distribution.
16*418b791dSBob Badour  *    * Neither the name of The Linux Foundation nor the names of its
17*418b791dSBob Badour  *      contributors may be used to endorse or promote products derived
18*418b791dSBob Badour  *      from this software without specific prior written permission.
19*418b791dSBob Badour  *
20*418b791dSBob Badour  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
21*418b791dSBob Badour  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22*418b791dSBob Badour  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
23*418b791dSBob Badour  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
24*418b791dSBob Badour  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25*418b791dSBob Badour  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26*418b791dSBob Badour  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
27*418b791dSBob Badour  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*418b791dSBob Badour  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29*418b791dSBob Badour  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
30*418b791dSBob Badour  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*418b791dSBob Badour  */
32*418b791dSBob Badour 
33*418b791dSBob Badour #if (defined __qdsp6__) || (defined __hexagon__)
34*418b791dSBob Badour #include "qurt_mutex.h"
35*418b791dSBob Badour 
36*418b791dSBob Badour #define RW_MUTEX_T                  qurt_mutex_t
37*418b791dSBob Badour #define RW_MUTEX_CTOR(mut)          qurt_mutex_init(& (mut))
38*418b791dSBob Badour #define RW_MUTEX_LOCK_READ(mut)     qurt_mutex_lock(& (mut))
39*418b791dSBob Badour #define RW_MUTEX_UNLOCK_READ(mut)   qurt_mutex_unlock(& (mut))
40*418b791dSBob Badour #define RW_MUTEX_LOCK_WRITE(mut)    qurt_mutex_lock(& (mut))
41*418b791dSBob Badour #define RW_MUTEX_UNLOCK_WRITE(mut)  qurt_mutex_unlock(& (mut))
42*418b791dSBob Badour #define RW_MUTEX_DTOR(mut)          qurt_mutex_destroy(& (mut))
43*418b791dSBob Badour 
44*418b791dSBob Badour #elif (1 == __linux) || (1 == __linux__) || (1 == __gnu_linux__) || (1 == linux)
45*418b791dSBob Badour 
46*418b791dSBob Badour #include <pthread.h>
47*418b791dSBob Badour #include <stdlib.h>
48*418b791dSBob Badour #include <stdio.h>
49*418b791dSBob Badour 
50*418b791dSBob Badour /* asserts may be compiled out, this should always be present */
51*418b791dSBob Badour #define ABORT_FAIL( ff ) \
52*418b791dSBob Badour    do {\
53*418b791dSBob Badour       if(! (ff) ) {\
54*418b791dSBob Badour          fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", #ff, __FILE__, __LINE__);\
55*418b791dSBob Badour          abort();\
56*418b791dSBob Badour       }\
57*418b791dSBob Badour    } while(0)
58*418b791dSBob Badour 
59*418b791dSBob Badour #define RW_MUTEX_T                  pthread_rwlock_t
60*418b791dSBob Badour #define RW_MUTEX_CTOR(mut)          ABORT_FAIL(0 == pthread_rwlock_init( & (mut), 0))
61*418b791dSBob Badour #define RW_MUTEX_LOCK_READ(mut)     ABORT_FAIL(0 == pthread_rwlock_rdlock( & (mut)))
62*418b791dSBob Badour #define RW_MUTEX_UNLOCK_READ(mut)   ABORT_FAIL(0 == pthread_rwlock_unlock( & (mut)))
63*418b791dSBob Badour #define RW_MUTEX_LOCK_WRITE(mut)    ABORT_FAIL(0 == pthread_rwlock_wrlock( & (mut)))
64*418b791dSBob Badour #define RW_MUTEX_UNLOCK_WRITE(mut)  ABORT_FAIL(0 == pthread_rwlock_unlock( & (mut)))
65*418b791dSBob Badour #define RW_MUTEX_DTOR(mut)          ABORT_FAIL(0 == pthread_rwlock_destroy( & (mut)))
66*418b791dSBob Badour 
67*418b791dSBob Badour 
68*418b791dSBob Badour #else
69*418b791dSBob Badour 
70*418b791dSBob Badour #include "AEEstd.h"
71*418b791dSBob Badour 
72*418b791dSBob Badour #define RW_MUTEX_T uint32
73*418b791dSBob Badour #define RW_MUTEX_CTOR(mut) mut = 0
74*418b791dSBob Badour #define RW_MUTEX_LOCK_READ(mut) \
75*418b791dSBob Badour    do {\
76*418b791dSBob Badour       assert(STD_BIT_TEST(&mut, 1) == 0); \
77*418b791dSBob Badour       assert(STD_BIT_TEST(&mut, 2) == 0); \
78*418b791dSBob Badour       STD_BIT_SET(&mut, 1); \
79*418b791dSBob Badour    } while (0)
80*418b791dSBob Badour 
81*418b791dSBob Badour #define RW_MUTEX_UNLOCK_READ(mut) \
82*418b791dSBob Badour    do {\
83*418b791dSBob Badour       assert(STD_BIT_TEST(&mut, 1)); \
84*418b791dSBob Badour       assert(STD_BIT_TEST(&mut, 2) == 0); \
85*418b791dSBob Badour       STD_BIT_CLEAR(&mut, 1); \
86*418b791dSBob Badour    } while (0)
87*418b791dSBob Badour 
88*418b791dSBob Badour #define RW_MUTEX_LOCK_WRITE(mut) \
89*418b791dSBob Badour    do {\
90*418b791dSBob Badour       assert(STD_BIT_TEST(&mut, 1) == 0); \
91*418b791dSBob Badour       assert(STD_BIT_TEST(&mut, 2) == 0); \
92*418b791dSBob Badour       STD_BIT_SET(&mut, 2); \
93*418b791dSBob Badour    } while (0)
94*418b791dSBob Badour 
95*418b791dSBob Badour #define RW_MUTEX_UNLOCK_WRITE(mut) \
96*418b791dSBob Badour    do {\
97*418b791dSBob Badour       assert(STD_BIT_TEST(&mut, 1) == 0); \
98*418b791dSBob Badour       assert(STD_BIT_TEST(&mut, 2)); \
99*418b791dSBob Badour       STD_BIT_CLEAR(&mut, 2); \
100*418b791dSBob Badour    } while (0)
101*418b791dSBob Badour 
102*418b791dSBob Badour #define RW_MUTEX_DTOR(mut) mut = 0
103*418b791dSBob Badour 
104*418b791dSBob Badour #endif
105*418b791dSBob Badour #endif //MUTEX_H
106