1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef CHRE_PLATFORM_CONDITION_VARIABLE_H_
18 #define CHRE_PLATFORM_CONDITION_VARIABLE_H_
19 
20 #include "chre/platform/mutex.h"
21 #include "chre/target_platform/condition_variable_base.h"
22 #include "chre/util/non_copyable.h"
23 #include "chre/util/time.h"
24 
25 namespace chre {
26 
27 /**
28  * Provides an implementation of a Condition Variable. The public API is
29  * similar to std::condition_variable. ConditionVariableBase is subclassed here
30  * to allow platforms to inject their own storage for their implementation.
31  */
32 class ConditionVariable : public ConditionVariableBase,
33                           public NonCopyable {
34  public:
35   /**
36    * Allows the platform to do any condition variable initialization at
37    * construction time.
38    */
39   ConditionVariable();
40 
41   /**
42    * Allows the platform to do any condition variable deinitialization at
43    * destruction time.
44    */
45   ~ConditionVariable();
46 
47   /**
48    * Unblock one thread that is waiting on this condition variable.
49    */
50   void notify_one();
51 
52   /**
53    * Causes the current thread to block until the condition variable is
54    * notified. The provided mutex will be unlocked and the thread will be
55    * blocked until the condition variable has notified. The mutex is relocked
56    * prior to this function returning.
57    *
58    * @param The currently locked mutex.
59    */
60   void wait(Mutex& mutex);
61 
62    /**
63    * Same behavior as the wait function, but with a timeout to unblock the
64    * calling thread if not notified within the timeout period.
65    *
66    * @param mutex The currently locked mutex.
67    * @param timeout The timeout duration in nanoseconds.
68    *
69    * @return false if timed out, true if notified.
70    */
71   bool wait_for(Mutex& mutex, Nanoseconds timeout);
72 };
73 
74 }  // namespace chre
75 
76 #include "chre/target_platform/condition_variable_impl.h"
77 
78 #endif  // CHRE_PLATFORM_CONDITION_VARIABLE_H_
79