[SRUK] Initial copy from Tizen 2.2 version
[platform/core/uifw/dali-core.git] / dali / internal / event / common / notification-manager.cpp
1 //
2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 // CLASS HEADER
18 #include <dali/internal/event/common/notification-manager.h>
19
20 // EXTERNAL INCLUDES
21 #include <boost/thread/mutex.hpp>
22
23 // INTERNAL INCLUDES
24 #include <dali/public-api/common/dali-common.h>
25 #include <dali/internal/event/common/property-notification-impl.h>
26 #include <dali/internal/common/message-container.h>
27
28 using namespace std;
29
30 namespace Dali
31 {
32
33 namespace Internal
34 {
35
36 typedef boost::mutex MessageQueueMutex;
37
38 struct NotificationManager::Impl
39 {
40   Impl()
41   : notificationCount(0)
42   {
43   }
44
45   ~Impl()
46   {
47   }
48
49   // Used to skip duplicate operations during Notify()
50   unsigned int notificationCount;
51
52   // queueMutex must be locked whilst accessing queue
53   MessageQueueMutex queueMutex;
54   MessageContainer updateQueue;
55   MessageContainer eventQueue;
56 };
57
58 NotificationManager::NotificationManager()
59 {
60   mImpl = new Impl();
61 }
62
63 NotificationManager::~NotificationManager()
64 {
65   delete mImpl;
66 }
67
68 void NotificationManager::QueueMessage( MessageBase* message )
69 {
70   DALI_ASSERT_DEBUG( NULL != message );
71
72   // queueMutex must be locked whilst accessing queue
73   MessageQueueMutex::scoped_lock lock( mImpl->queueMutex );
74
75   mImpl->updateQueue.PushBack( message );
76 }
77
78 bool NotificationManager::MessagesToProcess()
79 {
80   // queueMutex must be locked whilst accessing queue
81   MessageQueueMutex::scoped_lock lock( mImpl->queueMutex );
82
83   return ( false == mImpl->updateQueue.IsEmpty() );
84 }
85
86 void NotificationManager::ProcessMessages()
87 {
88   // Done before messages are processed, for notification count comparisons
89   ++mImpl->notificationCount;
90
91   // queueMutex must be locked whilst accessing queue
92   {
93     MessageQueueMutex::scoped_lock lock( mImpl->queueMutex );
94
95     // Swap the queue, original queue ends up empty, then release the lock
96     mImpl->updateQueue.Swap( mImpl->eventQueue );
97   }
98   // end of scope, lock is released
99
100   MessageContainer::Iterator iter = mImpl->eventQueue.Begin();
101   MessageContainer::Iterator end = mImpl->eventQueue.End();
102   for( ; iter != end; ++iter )
103   {
104     (*iter)->Process( 0u/*ignored*/ );
105   }
106
107   // release the processed messages from event side queue
108   mImpl->eventQueue.Clear();
109 }
110
111 unsigned int NotificationManager::GetNotificationCount() const
112 {
113   return mImpl->notificationCount;
114 }
115
116 } // namespace Internal
117
118 } // namespace Dali