1 #ifndef DALI_CONDITIONAL_WAIT_H
2 #define DALI_CONDITIONAL_WAIT_H
5 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/common/dali-common.h>
27 * Helper class to allow conditional waiting and notifications between multiple threads.
29 class DALI_CORE_API ConditionalWait
33 * @brief Allows client code to synchronize updates to its own state with the
34 * internal state of a ConditionalWait object.
36 class DALI_CORE_API ScopedLock
41 * @brief Will acquire the internal mutex of the ConditionalWait object passed in.
42 * @param[in] wait The ConditionalWait object to lock.
44 ScopedLock(ConditionalWait& wait);
48 * @brief Will release the internal mutex of the ConditionalWait object passed in.
53 * Getter for the ConditionalWait locked for this instance's lifetime.
54 * @return the ConditionalWait object currently locked.
56 ConditionalWait& GetLockedWait() const;
58 public: // Data, public to allow nesting class to access
59 struct ScopedLockImpl;
60 ScopedLockImpl* mImpl;
63 // Not implemented as ScopedLock cannot be copied:
64 ScopedLock(const ScopedLock&);
65 const ScopedLock& operator=(const ScopedLock&);
69 * @brief Constructor, creates the internal synchronization objects
74 * @brief Destructor, non-virtual as this is not a base class
79 * @brief Notifies another thread to continue if it is blocked on a wait.
81 * Can be called from any thread.
82 * Does not block the current thread but may cause a rescheduling of threads.
87 * @brief Notifies another thread to continue if it is blocked on a wait.
89 * Assumes that the ScopedLock object passed in has already locked the internal state of
91 * Can be called from any thread.
92 * Does not block the current thread but may cause a rescheduling of threads.
94 * @param[in] scope A pre-existing lock on the internal state of this object.
96 void Notify(const ScopedLock& scope);
99 * @brief Wait for another thread to notify us when the condition is true and we can continue
101 * Will always block current thread until Notify is called
106 * @brief Wait for another thread to notify us when the condition is true and we can continue
108 * Will always block current thread until Notify is called.
109 * Assumes that the ScopedLock object passed in has already locked the internal state of
110 * this object. Releases the lock while waiting and re-acquires it when returning
112 * @param[in] scope A pre-existing lock on the internal state of this object.
113 * @pre scope must have been passed this ConditionalWait during its construction.
115 void Wait(const ScopedLock& scope);
118 * @brief Return the count of threads waiting for this conditional
119 * @return count of waits
121 unsigned int GetWaitCount() const;
124 // Not implemented as ConditionalWait is not copyable
125 ConditionalWait(const ConditionalWait&);
126 const ConditionalWait& operator=(const ConditionalWait&);
128 struct ConditionalWaitImpl;
129 ConditionalWaitImpl* mImpl;
134 #endif // DALI_CONDITIONAL_WAIT_H