xref: /aosp_15_r20/system/chre/chpp/platform/linux/notifier.c (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker #include "chpp/platform/platform_notifier.h"
18*84e33947SAndroid Build Coastguard Worker 
19*84e33947SAndroid Build Coastguard Worker #include <pthread.h>
20*84e33947SAndroid Build Coastguard Worker #include <stddef.h>
21*84e33947SAndroid Build Coastguard Worker #include <stdint.h>
22*84e33947SAndroid Build Coastguard Worker 
23*84e33947SAndroid Build Coastguard Worker #include "chpp/macros.h"
24*84e33947SAndroid Build Coastguard Worker #include "chpp/mutex.h"
25*84e33947SAndroid Build Coastguard Worker #include "chpp/platform/platform_time.h"
26*84e33947SAndroid Build Coastguard Worker #include "chpp/transport.h"
27*84e33947SAndroid Build Coastguard Worker #include "chpp/transport_signals.h"
28*84e33947SAndroid Build Coastguard Worker #include "time.h"
29*84e33947SAndroid Build Coastguard Worker 
30*84e33947SAndroid Build Coastguard Worker /************************************************
31*84e33947SAndroid Build Coastguard Worker  *  Public Functions
32*84e33947SAndroid Build Coastguard Worker  ***********************************************/
33*84e33947SAndroid Build Coastguard Worker 
chppPlatformNotifierInit(struct ChppNotifier * notifier)34*84e33947SAndroid Build Coastguard Worker void chppPlatformNotifierInit(struct ChppNotifier *notifier) {
35*84e33947SAndroid Build Coastguard Worker   chppMutexInit(&notifier->mutex);
36*84e33947SAndroid Build Coastguard Worker   pthread_cond_init(&notifier->cond, NULL);
37*84e33947SAndroid Build Coastguard Worker }
38*84e33947SAndroid Build Coastguard Worker 
chppPlatformNotifierDeinit(struct ChppNotifier * notifier)39*84e33947SAndroid Build Coastguard Worker void chppPlatformNotifierDeinit(struct ChppNotifier *notifier) {
40*84e33947SAndroid Build Coastguard Worker   pthread_cond_destroy(&notifier->cond);
41*84e33947SAndroid Build Coastguard Worker   chppMutexDeinit(&notifier->mutex);
42*84e33947SAndroid Build Coastguard Worker }
43*84e33947SAndroid Build Coastguard Worker 
chppPlatformNotifierGetSignal(struct ChppNotifier * notifier)44*84e33947SAndroid Build Coastguard Worker uint32_t chppPlatformNotifierGetSignal(struct ChppNotifier *notifier) {
45*84e33947SAndroid Build Coastguard Worker   chppMutexLock(&notifier->mutex);
46*84e33947SAndroid Build Coastguard Worker 
47*84e33947SAndroid Build Coastguard Worker   uint32_t signal = notifier->signal;
48*84e33947SAndroid Build Coastguard Worker   notifier->signal = 0;
49*84e33947SAndroid Build Coastguard Worker 
50*84e33947SAndroid Build Coastguard Worker   chppMutexUnlock(&notifier->mutex);
51*84e33947SAndroid Build Coastguard Worker   return signal;
52*84e33947SAndroid Build Coastguard Worker }
53*84e33947SAndroid Build Coastguard Worker 
chppPlatformNotifierWait(struct ChppNotifier * notifier)54*84e33947SAndroid Build Coastguard Worker uint32_t chppPlatformNotifierWait(struct ChppNotifier *notifier) {
55*84e33947SAndroid Build Coastguard Worker   chppMutexLock(&notifier->mutex);
56*84e33947SAndroid Build Coastguard Worker 
57*84e33947SAndroid Build Coastguard Worker   while (notifier->signal == 0) {
58*84e33947SAndroid Build Coastguard Worker     pthread_cond_wait(&notifier->cond, &notifier->mutex.lock);
59*84e33947SAndroid Build Coastguard Worker   }
60*84e33947SAndroid Build Coastguard Worker   uint32_t signal = notifier->signal;
61*84e33947SAndroid Build Coastguard Worker   notifier->signal = 0;
62*84e33947SAndroid Build Coastguard Worker 
63*84e33947SAndroid Build Coastguard Worker   chppMutexUnlock(&notifier->mutex);
64*84e33947SAndroid Build Coastguard Worker   return signal;
65*84e33947SAndroid Build Coastguard Worker }
chppPlatformNotifierTimedWait(struct ChppNotifier * notifier,uint64_t timeoutNs)66*84e33947SAndroid Build Coastguard Worker uint32_t chppPlatformNotifierTimedWait(struct ChppNotifier *notifier,
67*84e33947SAndroid Build Coastguard Worker                                        uint64_t timeoutNs) {
68*84e33947SAndroid Build Coastguard Worker   if (timeoutNs == CHPP_TRANSPORT_TIMEOUT_INFINITE) {
69*84e33947SAndroid Build Coastguard Worker     return chppPlatformNotifierWait(notifier);
70*84e33947SAndroid Build Coastguard Worker 
71*84e33947SAndroid Build Coastguard Worker   } else {
72*84e33947SAndroid Build Coastguard Worker     struct timespec timeout;
73*84e33947SAndroid Build Coastguard Worker     struct timespec absTime;
74*84e33947SAndroid Build Coastguard Worker     uint64_t timeoutS = timeoutNs / CHPP_NSEC_PER_SEC;
75*84e33947SAndroid Build Coastguard Worker     timeoutNs = timeoutNs % CHPP_NSEC_PER_SEC;
76*84e33947SAndroid Build Coastguard Worker 
77*84e33947SAndroid Build Coastguard Worker     chppMutexLock(&notifier->mutex);
78*84e33947SAndroid Build Coastguard Worker 
79*84e33947SAndroid Build Coastguard Worker     clock_gettime(CLOCK_REALTIME, &absTime);
80*84e33947SAndroid Build Coastguard Worker     timeout = absTime;
81*84e33947SAndroid Build Coastguard Worker     timeout.tv_sec += timeoutS;
82*84e33947SAndroid Build Coastguard Worker     timeout.tv_nsec += timeoutNs;
83*84e33947SAndroid Build Coastguard Worker 
84*84e33947SAndroid Build Coastguard Worker     while ((notifier->signal == 0) &&
85*84e33947SAndroid Build Coastguard Worker            (CHPP_TIMESPEC_TO_NS(absTime) < CHPP_TIMESPEC_TO_NS(timeout))) {
86*84e33947SAndroid Build Coastguard Worker       pthread_cond_timedwait(&notifier->cond, &notifier->mutex.lock, &absTime);
87*84e33947SAndroid Build Coastguard Worker       clock_gettime(CLOCK_REALTIME, &absTime);
88*84e33947SAndroid Build Coastguard Worker     }
89*84e33947SAndroid Build Coastguard Worker     uint32_t signal = notifier->signal;
90*84e33947SAndroid Build Coastguard Worker     notifier->signal = 0;
91*84e33947SAndroid Build Coastguard Worker 
92*84e33947SAndroid Build Coastguard Worker     chppMutexUnlock(&notifier->mutex);
93*84e33947SAndroid Build Coastguard Worker     return signal;
94*84e33947SAndroid Build Coastguard Worker   }
95*84e33947SAndroid Build Coastguard Worker }
96*84e33947SAndroid Build Coastguard Worker 
chppPlatformNotifierSignal(struct ChppNotifier * notifier,uint32_t signal)97*84e33947SAndroid Build Coastguard Worker void chppPlatformNotifierSignal(struct ChppNotifier *notifier,
98*84e33947SAndroid Build Coastguard Worker                                 uint32_t signal) {
99*84e33947SAndroid Build Coastguard Worker   chppMutexLock(&notifier->mutex);
100*84e33947SAndroid Build Coastguard Worker 
101*84e33947SAndroid Build Coastguard Worker   notifier->signal |= signal;
102*84e33947SAndroid Build Coastguard Worker   pthread_cond_signal(&notifier->cond);
103*84e33947SAndroid Build Coastguard Worker 
104*84e33947SAndroid Build Coastguard Worker   chppMutexUnlock(&notifier->mutex);
105*84e33947SAndroid Build Coastguard Worker }
106