2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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
8 // http://www.apache.org/licenses/LICENSE-2.0
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.
18 * @file FBaseRt_EventManager.cpp
19 * @brief This is the implementation file for the _EventManager class.
26 #include <sys/eventfd.h>
30 #include <FBaseSysLog.h>
31 #include "FBaseRt_Event.h"
32 #include "FBaseRt_ThreadManager.h"
33 #include "FBaseRt_ThreadImpl.h"
34 #include "FBaseRt_EventManager.h"
37 using namespace Tizen::Base;
38 using namespace Tizen::Base::Collection;
39 using namespace Tizen::Base::Runtime;
41 namespace Tizen { namespace Base { namespace Runtime
44 _EventManager::_EventMessage::operator ==(const _EventMessage& rhs) const
55 _EventManager::_EventMessage::operator !=(const _EventMessage& rhs) const
65 _EventManager::_EventMessage&
66 _EventManager::_EventMessage::operator =(const _EventMessage& rhs)
73 arg = *const_cast< std::tr1::shared_ptr< IEventArg >* >(&rhs.arg);
74 listener = rhs.listener;
80 _EventManager::_EventManager(void)
84 , __pGmainContext(null)
91 _EventManager::~_EventManager(void)
93 GetEventManagerObjectManager().Unregister(__handle);
97 g_source_destroy(__pSource);
98 g_source_unref(__pSource);
103 g_io_channel_unref(__pChannel);
110 _EventManager::Construct(GMainContext* pGmainContext)
112 result r = E_SUCCESS;
113 GError* pGError = null;
114 GIOChannel* pChannel = null;
115 GSource* pSource = null;
116 Mutex* pMutex = null;
118 int eventFd = eventfd(0, 0);
119 SysTryReturnResult(NID_BASE_RT, eventFd != -1, E_SYSTEM, "Failed to open eventfd.");
121 pChannel = g_io_channel_unix_new(eventFd);
122 SysTryCatch(NID_BASE_RT, pChannel != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to create a channel for eventfd.");
124 g_io_channel_set_encoding(pChannel, null, &pGError);
125 g_io_channel_set_flags(pChannel, G_IO_FLAG_NONBLOCK, &pGError);
127 g_io_channel_set_close_on_unref(pChannel, TRUE);
130 pSource = g_io_create_watch(pChannel, G_IO_IN);
131 SysTryCatch(NID_BASE_RT, pSource != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to create a gsource for a channel.");
133 g_source_set_callback(pSource, (GSourceFunc) _EventManager::OnEventReceived, this, null);
134 g_source_attach(pSource, pGmainContext);
136 pMutex = new (std::nothrow) Mutex();
137 SysTryCatch(NID_BASE_RT, pMutex != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Not enough memory.");
139 r = pMutex->Create();
140 SysTryCatch(NID_BASE_RT, !IsFailed(r), , r, "[%s] Failed to create mutex.", GetErrorMessage(r));
142 __handle = GetEventManagerObjectManager().Register(*this);
144 __pChannel = pChannel;
147 __pGmainContext = pGmainContext;
149 __pActive = &__messages1;
150 __pReady = &__messages2;
159 g_source_destroy(pSource);
160 g_source_unref(pSource);
165 g_io_channel_unref(pChannel);
177 _EventManager::CallListenerAsync(const _HandleT< _Event >& event, std::tr1::shared_ptr< IEventArg > arg, const _HandleT< IEventListener >& listener)
179 SysTryReturn(NID_BASE_RT, __pGmainContext != null, E_INVALID_STATE, E_INVALID_STATE, "[E_INVALID_STATE] Not constructed.");
181 _EventMessage message;
183 message.type = MESSAGE_TYPE_CALL_LISTENER;
184 message.event = event;
186 message.listener = listener;
190 __pActive->Add(message);
195 gsize writtenSize = 0;
197 g_io_channel_write(__pChannel, (const gchar*) &count, sizeof(count), &writtenSize);
203 _EventManager::FireEventAsync(const _HandleT< _Event >& event, std::tr1::shared_ptr< IEventArg > arg)
205 SysTryReturnResult(NID_BASE_RT, __pGmainContext != null, E_INVALID_STATE, "Not constructed.");
207 _EventMessage message;
209 message.type = MESSAGE_TYPE_FIRE_EVENT;
210 message.event = event;
215 __pActive->Add(message);
220 gsize writtenSize = 0;
222 g_io_channel_write(__pChannel, (const gchar*) &count, sizeof(count), &writtenSize);
228 _EventManager::OnEventReceived(GIOChannel* pGIOChannel, GIOCondition condition, gpointer data)
230 _EventManager* pEventManager = (_EventManager*) data;
232 if (condition & G_IO_IN)
237 g_io_channel_read(pGIOChannel, (gchar*) &tmp, sizeof(tmp), &readSize);
244 pEventManager->__pMutex->Acquire();
246 ArrayListT< _EventMessage >* pMessages = pEventManager->__pActive;
248 pEventManager->__pActive = pEventManager->__pReady;
249 pEventManager->__pReady = pMessages;
251 pEventManager->__pMutex->Release();
253 IEnumeratorT< _EventMessage >* pEnum = pMessages->GetEnumeratorN();
254 _Event* pEvent = null;
255 IEventListener* pEventListener = null;
256 _EventMessage message;
258 while (pEnum->MoveNext() == E_SUCCESS)
260 pEnum->GetCurrent(message);
262 pEvent = GetEventObjectManager().GetObject(message.event);
266 if (message.type == MESSAGE_TYPE_FIRE_EVENT)
268 pEvent->Fire(message.arg);
272 pEventListener = GetEventListenerObjectManager().GetObject(message.listener);
273 if (pEventListener != null)
275 pEvent->FireImpl(*pEventListener, *message.arg);
282 pMessages->RemoveAll();
289 _EventManager::GetCurrentEventManager(void)
291 _ThreadImpl* pThreadImpl = _ThreadImpl::GetCurrentThreadImpl();
292 SysTryReturn(NID_BASE_RT, pThreadImpl != null, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] This is not OSP thread.");
294 ThreadType threadType = pThreadImpl->GetThreadType();
295 SysTryReturn(NID_BASE_RT, threadType != THREAD_TYPE_WORKER, null, E_INVALID_OPERATION,
296 "[E_INVALID_OPERATION] This is a worker thread.");
298 _EventManager* pEventManager = pThreadImpl->GetEventManager();
299 SysTryReturn(NID_BASE_RT, pEventManager != null, null, E_INVALID_STATE, "[E_INVALID_STATE] Event manager is not initialized.");
301 return pEventManager;
305 _EventManager::RegisterEvent(const _HandleT< _Event >& event)
307 SysTryReturnResult(NID_BASE_RT, __pGmainContext != null, E_INVALID_STATE, "Not constructed.");
309 result r = E_SUCCESS;
312 exist = __events.Contains(event);
313 SysTryReturnResult(NID_BASE_RT, !exist, E_OBJ_ALREADY_EXIST, "_Event already exist.");
315 r = __events.Add(event);
316 SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
322 _EventManager::UnregisterEvent(const _HandleT< _Event >& event)
324 SysTryReturnResult(NID_BASE_RT, __pGmainContext != null, E_INVALID_STATE, "Not constructed.");
326 result r = E_SUCCESS;
328 r = __events.Remove(event);
329 SysTryReturnResult(NID_BASE_RT, !IsFailed(r), E_OBJ_NOT_FOUND, "Listener not found.");
331 ClearAllPendingEventMessages(event);
337 _EventManager::ClearAllPendingEventMessages(const _HandleT< _Event >& event)
339 ArrayListT< _EventMessage > messages;
340 _EventMessage message;
344 IEnumeratorT< _EventMessage >* pEnum = __pActive->GetEnumeratorN();
345 while (pEnum->MoveNext() == E_SUCCESS)
347 pEnum->GetCurrent(message);
348 if (message.event != event)
350 messages.Add(message);
357 __pActive->RemoveAll();
358 __pActive->AddItems(messages);
359 messages.RemoveAll();
361 pEnum = __pReady->GetEnumeratorN();
362 while (pEnum->MoveNext() == E_SUCCESS)
364 pEnum->GetCurrent(message);
365 if (message.event != event)
367 messages.Add(message);
373 __pReady->RemoveAll();
374 __pReady->AddItems(messages);
375 messages.RemoveAll();
380 _HandleT< _EventManager >
381 _EventManager::GetHandle(void) const
387 _EventManager::GetEventManagerByHandle(const _HandleT< _EventManager >& handle)
389 _EventManager* pEventManager = GetEventManagerObjectManager().GetObject(handle);
390 SysTryReturn(NID_BASE_RT, pEventManager != null, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
392 return pEventManager;
395 _ObjectManagerT< _EventManager >&
396 _EventManager::GetEventManagerObjectManager(void)
398 static _ObjectManagerT< _EventManager > objectManager;
400 return objectManager;
403 _ObjectManagerT< _Event >&
404 _EventManager::GetEventObjectManager(void)
406 static _ObjectManagerT< _Event > objectManager;
408 return objectManager;
411 _ObjectManagerT< IEventListener >&
412 _EventManager::GetEventListenerObjectManager(void)
414 static _ObjectManagerT< IEventListener > objectManager;
416 return objectManager;
419 } } } // Tizen::Base::Runtime