[Tizen] Add codes for Dali Windows Backend
[platform/core/uifw/dali-core.git] / dali / devel-api / threading / conditional-wait.h
1 #ifndef __DALI_CONDITIONAL_WAIT_H__
2 #define __DALI_CONDITIONAL_WAIT_H__
3
4 /*
5  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/common/dali-common.h>
23
24 namespace Dali
25 {
26
27 /**
28  * Helper class to allow conditional waiting and notifications between multiple threads.
29  */
30 class DALI_CORE_API ConditionalWait
31 {
32 public:
33
34   /**
35    * @brief Allows client code to synchronize updates to its own state with the
36    * internal state of a ConditionalWait object.
37    */
38   class DALI_CORE_API ScopedLock
39   {
40   public:
41     /**
42      * Constructor
43      * @brief Will acquire the internal mutex of the ConditionalWait object passed in.
44      * @param[in] wait The ConditionalWait object to lock.
45      */
46     ScopedLock( ConditionalWait& wait );
47
48     /**
49      * Destructor
50      * @brief Will release the internal mutex of the ConditionalWait object passed in.
51      */
52     ~ScopedLock();
53
54     /**
55      * Getter for the ConditionalWait locked for this instance's lifetime.
56      * @return the ConditionalWait object currently locked.
57      */
58     ConditionalWait& GetLockedWait() const;
59
60   public: // Data, public to allow nesting class to access
61
62     struct ScopedLockImpl;
63     ScopedLockImpl* mImpl;
64
65   private:
66
67     // Not implemented as ScopedLock cannot be copied:
68     ScopedLock( const ScopedLock& );
69     const ScopedLock& operator=( const ScopedLock& );
70   };
71
72   /**
73    * @brief Constructor, creates the internal synchronization objects
74    */
75   ConditionalWait();
76
77   /**
78    * @brief Destructor, non-virtual as this is not a base class
79    */
80   ~ConditionalWait();
81
82   /**
83    * @brief Notifies another thread to continue if it is blocked on a wait.
84    *
85    * Can be called from any thread.
86    * Does not block the current thread but may cause a rescheduling of threads.
87    */
88   void Notify();
89
90   /**
91    * @brief Notifies another thread to continue if it is blocked on a wait.
92    *
93    * Assumes that the ScopedLock object passed in has already locked the internal state of
94    * this object.
95    * Can be called from any thread.
96    * Does not block the current thread but may cause a rescheduling of threads.
97    *
98    * @param[in] scope A pre-existing lock on the internal state of this object.
99    */
100   void Notify( const ScopedLock& scope );
101
102   /**
103    * @brief Wait for another thread to notify us when the condition is true and we can continue
104    *
105    * Will always block current thread until Notify is called
106    */
107   void Wait();
108
109   /**
110    * @brief Wait for another thread to notify us when the condition is true and we can continue
111    *
112    * Will always block current thread until Notify is called.
113    * Assumes that the ScopedLock object passed in has already locked the internal state of
114    * this object. Releases the lock while waiting and re-acquires it when returning
115    * from the wait.
116    * @param[in] scope A pre-existing lock on the internal state of this object.
117    * @pre scope must have been passed this ConditionalWait during its construction.
118    */
119   void Wait( const ScopedLock& scope );
120
121   /**
122    * @brief Return the count of threads waiting for this conditional
123    * @return count of waits
124    */
125   unsigned int GetWaitCount() const;
126
127 private:
128
129   // Not implemented as ConditionalWait is not copyable
130   ConditionalWait( const ConditionalWait& );
131   const ConditionalWait& operator=( const ConditionalWait& );
132
133   struct ConditionalWaitImpl;
134   ConditionalWaitImpl* mImpl;
135
136 };
137
138 } // namespace Dali
139
140 #endif // __DALI_CONDITIONAL_WAIT_H__