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 if (threadType == THREAD_TYPE_WORKER)
297 pThreadImpl = _ThreadImpl::GetMainThreadImpl();
298 SysTryReturn(NID_BASE_RT, pThreadImpl != null, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND] This is not OSP thread.");
301 _EventManager* pEventManager = pThreadImpl->GetEventManager();
302 SysTryReturn(NID_BASE_RT, pEventManager != null, null, E_INVALID_STATE, "[E_INVALID_STATE] Event manager is not initialized.");
304 return pEventManager;
308 _EventManager::RegisterEvent(const _HandleT< _Event >& event)
310 SysTryReturnResult(NID_BASE_RT, __pGmainContext != null, E_INVALID_STATE, "Not constructed.");
312 result r = E_SUCCESS;
315 exist = __events.Contains(event);
316 SysTryReturnResult(NID_BASE_RT, !exist, E_OBJ_ALREADY_EXIST, "_Event already exist.");
318 r = __events.Add(event);
319 SysTryReturn(NID_BASE_RT, !IsFailed(r), r, r, "[%s] Propagating.", GetErrorMessage(r));
325 _EventManager::UnregisterEvent(const _HandleT< _Event >& event)
327 SysTryReturnResult(NID_BASE_RT, __pGmainContext != null, E_INVALID_STATE, "Not constructed.");
329 result r = E_SUCCESS;
331 r = __events.Remove(event);
332 SysTryReturnResult(NID_BASE_RT, !IsFailed(r), E_OBJ_NOT_FOUND, "Listener not found.");
334 ClearAllPendingEventMessages(event);
340 _EventManager::ClearAllPendingEventMessages(const _HandleT< _Event >& event)
342 ArrayListT< _EventMessage > messages;
343 _EventMessage message;
347 IEnumeratorT< _EventMessage >* pEnum = __pActive->GetEnumeratorN();
348 while (pEnum->MoveNext() == E_SUCCESS)
350 pEnum->GetCurrent(message);
351 if (message.event != event)
353 messages.Add(message);
360 __pActive->RemoveAll();
361 __pActive->AddItems(messages);
362 messages.RemoveAll();
364 pEnum = __pReady->GetEnumeratorN();
365 while (pEnum->MoveNext() == E_SUCCESS)
367 pEnum->GetCurrent(message);
368 if (message.event != event)
370 messages.Add(message);
376 __pReady->RemoveAll();
377 __pReady->AddItems(messages);
378 messages.RemoveAll();
383 _HandleT< _EventManager >
384 _EventManager::GetHandle(void) const
390 _EventManager::GetEventManagerByHandle(const _HandleT< _EventManager >& handle)
392 _EventManager* pEventManager = GetEventManagerObjectManager().GetObject(handle);
393 SysTryReturn(NID_BASE_RT, pEventManager != null, null, E_OBJ_NOT_FOUND, "[E_OBJ_NOT_FOUND]");
395 return pEventManager;
398 _ObjectManagerT< _EventManager >&
399 _EventManager::GetEventManagerObjectManager(void)
401 static _ObjectManagerT< _EventManager > objectManager;
403 return objectManager;
406 _ObjectManagerT< _Event >&
407 _EventManager::GetEventObjectManager(void)
409 static _ObjectManagerT< _Event > objectManager;
411 return objectManager;
414 _ObjectManagerT< IEventListener >&
415 _EventManager::GetEventListenerObjectManager(void)
417 static _ObjectManagerT< IEventListener > objectManager;
419 return objectManager;
422 } } } // Tizen::Base::Runtime