1 #ifndef __DALI_CONDITIONAL_WAIT_H__
2 #define __DALI_CONDITIONAL_WAIT_H__
5 * Copyright (c) 2015 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>
28 * Helper class to allow conditional waiting and notifications between multiple threads.
30 class DALI_IMPORT_API ConditionalWait
35 * @brief Allows client code to synchronize updates to its own state with the
36 * internal state of a ConditionalWait object.
43 * @brief Will acquire the internal mutex of the ConditionalWait object passed in.
44 * @param[in] wait The ConditionalWait object to lock.
46 ScopedLock( ConditionalWait& wait );
50 * @brief Will release the internal mutex of the ConditionalWait object passed in.
55 * Getter for the ConditionalWait locked for this instance's lifetime.
56 * @return the ConditionalWait object currently locked.
58 ConditionalWait& GetLockedWait() const { return mWait; }
62 // Not implemented as ScopedLock cannot be copied:
63 ScopedLock( const ScopedLock& );
64 const ScopedLock& operator=( const ScopedLock& );
66 ConditionalWait& mWait;
70 * @brief Constructor, creates the internal synchronization objects
75 * @brief Destructor, non-virtual as this is not a base class
80 * @brief Notifies another thread to continue if it is blocked on a wait.
82 * Can be called from any thread.
83 * Does not block the current thread but may cause a rescheduling of threads.
88 * @brief Notifies another thread to continue if it is blocked on a wait.
90 * Assumes that the ScopedLock object passed in has already locked the internal state of
92 * Can be called from any thread.
93 * Does not block the current thread but may cause a rescheduling of threads.
95 * @param[in] scope A pre-existing lock on the internal state of this object.
97 void Notify( const ScopedLock& scope );
100 * @brief Wait for another thread to notify us when the condition is true and we can continue
102 * Will always block current thread until Notify is called
107 * @brief Wait for another thread to notify us when the condition is true and we can continue
109 * Will always block current thread until Notify is called.
110 * Assumes that the ScopedLock object passed in has already locked the internal state of
111 * this object. Releases the lock while waiting and re-acquires it when returning
113 * @param[in] scope A pre-existing lock on the internal state of this object.
114 * @pre scope must have been passed this ConditionalWait during its construction.
116 void Wait( const ScopedLock& scope );
119 * @brief Return the count of threads waiting for this conditional
120 * @return count of waits
122 unsigned int GetWaitCount() const;
126 // Not implemented as ConditionalWait is not copyable
127 ConditionalWait( const ConditionalWait& );
128 const ConditionalWait& operator=( const ConditionalWait& );
130 struct ConditionalWaitImpl;
131 ConditionalWaitImpl* mImpl;
137 #endif // __DALI_CONDITIONAL_WAIT_H__