X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=modules%2Fcore%2Fsrc%2Fthread.cpp;fp=modules_mobile%2Fcore%2Fsrc%2Fthread.cpp;h=5709545dc1ab8dd6d876454a1c1e4e12f4c16d87;hb=3a034abb4dca58ff0940687d8dd2b829ce2e226f;hp=0e7581060689000de3f52889b6b87b64f98dba49;hpb=58be0971049907f3166ce56a6ad509769565158f;p=framework%2Fweb%2Fwrt-commons.git diff --git a/modules_mobile/core/src/thread.cpp b/modules/core/src/thread.cpp old mode 100644 new mode 100755 similarity index 83% rename from modules_mobile/core/src/thread.cpp rename to modules/core/src/thread.cpp index 0e75810..5709545 --- a/modules_mobile/core/src/thread.cpp +++ b/modules/core/src/thread.cpp @@ -21,7 +21,7 @@ */ #include #include -#include +#include #include #include #include @@ -40,7 +40,7 @@ static const size_t NANOSECONDS_PER_MILISECOND = static const size_t NANOSECONDS_PER_MICROSECOND = static_cast(1000); -static const pthread_t g_mainThread = pthread_self(); +static const std::thread::id g_mainThread = std::this_thread::get_id(); class ThreadSpecific { @@ -67,7 +67,7 @@ namespace DPL { bool g_TLSforMainCreated = false; Thread::Thread() : - m_thread(0), + m_thread(), m_abandon(false), m_running(false), m_directInvoke(false) @@ -95,12 +95,12 @@ Thread::~Thread() bool Thread::IsMainThread() { - return (pthread_equal(pthread_self(), g_mainThread)); + return (std::this_thread::get_id() == g_mainThread); } Thread *Thread::GetCurrentThread() { - if (pthread_equal(pthread_self(), g_mainThread)) { + if (std::this_thread::get_id() == g_mainThread) { return NULL; } @@ -116,7 +116,9 @@ Thread *Thread::GetCurrentThread() void *Thread::StaticThreadEntry(void *param) { - LogPedantic("Entered static thread entry"); + char *errstr = NULL; + char errbuf[512] = {0,}; + WrtLogD("Entered static thread entry"); // Retrieve context Thread *This = static_cast(param); @@ -126,7 +128,13 @@ void *Thread::StaticThreadEntry(void *param) int result = pthread_setspecific(g_threadSpecific.threadSpecific, This); if (result != 0) { - LogError("Failed to set threadSpecific. Error: " << strerror(result)); +#ifdef _GNU_SOURCE + errstr = strerror_r(result, errbuf, sizeof(errbuf)); +#else + strerror_r(result, errbuf, sizeof(errbuf)); + errstr = errbuf; +#endif + WrtLogE("Failed to set threadSpecific. Error: %s", errstr); } // Enter thread proc @@ -140,16 +148,16 @@ void *Thread::StaticThreadEntry(void *param) // Critical section { // Leave running state - Mutex::ScopedLock lock(&This->m_stateMutex); + std::lock_guard lock(This->m_stateMutex); This->m_running = false; // Abandon thread if (This->m_abandon) { - LogPedantic("Thread was abandoned"); - pthread_detach(This->m_thread); + WrtLogD("Thread was abandoned"); + This->m_thread.detach(); } else { - LogPedantic("Thread is joinable"); + WrtLogD("Thread is joinable"); } } @@ -158,26 +166,26 @@ void *Thread::StaticThreadEntry(void *param) int Thread::ThreadEntry() { - LogPedantic("Entered default thread entry"); + WrtLogD("Entered default thread entry"); return Exec(); } void Thread::ProcessEvents() { - LogPedantic("Processing events"); + WrtLogD("Processing events"); // Steal current event list InternalEventList stolenEvents; // Enter event list critical section { - Mutex::ScopedLock lock(&m_eventMutex); + std::lock_guard lock(m_eventMutex); m_eventList.swap(stolenEvents); m_eventInvoker.Reset(); } // Process event list - LogPedantic("Stolen " << stolenEvents.size() << " internal events"); + WrtLogD("Stolen %u internal events", stolenEvents.size()); for (InternalEventList::iterator iterator = stolenEvents.begin(); iterator != stolenEvents.end(); @@ -195,15 +203,13 @@ void Thread::ProcessTimedEvents() { // Critical section on timed events mutex { - Mutex::ScopedLock lock(&m_timedEventMutex); + std::lock_guard lock(m_timedEventMutex); // Get current time unsigned long currentTimeMiliseconds = GetCurrentTimeMiliseconds(); // Info - LogPedantic( - "Processing timed events. Time now: " << currentTimeMiliseconds << - " ms"); + WrtLogD("Processing timed events. Time now: %lu ms", currentTimeMiliseconds); // All timed events are sorted chronologically // Emit timed out events @@ -213,12 +219,9 @@ void Thread::ProcessTimedEvents() m_timedEventVector.begin()->dueTimeMiliseconds) { // Info - LogPedantic( - "Transforming timed event into immediate event. Absolute due time: " - << - (m_timedEventVector.begin()->registerTimeMiliseconds + - m_timedEventVector.begin()->dueTimeMiliseconds) << - " ms"); + WrtLogD("Transforming timed event into immediate event. Absolute due time: %lu ms", + (m_timedEventVector.begin()->registerTimeMiliseconds + + m_timedEventVector.begin()->dueTimeMiliseconds)); // Emit immediate event PushEvent(m_timedEventVector.begin()->event, @@ -243,7 +246,7 @@ unsigned long Thread::GetCurrentTimeMiliseconds() const int Thread::Exec() { - LogPedantic("Executing thread event processing"); + WrtLogD("Executing thread event processing"); const std::size_t MIN_HANDLE_LIST_SIZE = 4; @@ -287,7 +290,7 @@ int Thread::Exec() // Critical section on timed events mutex { - Mutex::ScopedLock lock(&m_timedEventMutex); + std::lock_guard lock(m_timedEventMutex); if (!m_timedEventVector.empty()) { unsigned long currentTimeMiliseconds = @@ -309,8 +312,7 @@ int Thread::Exec() } // Info - LogPedantic( - "Thread loop minimum wait time: " << minimumWaitTime << " ms"); + WrtLogD("Thread loop minimum wait time: %lu ms", minimumWaitTime); // Do thread waiting WaitableHandleIndexList waitableHandleIndexList = @@ -318,7 +320,7 @@ int Thread::Exec() if (waitableHandleIndexList.empty()) { // Timeout occurred. Process timed events. - LogPedantic("Timed event list elapsed invoker"); + WrtLogD("Timed event list elapsed invoker"); ProcessTimedEvents(); continue; } @@ -331,7 +333,7 @@ int Thread::Exec() { size_t index = *waitableHandleIndexIterator; - LogPedantic("Event loop triggered with index: " << index); + WrtLogD("Event loop triggered with index: %u", index); switch (index) { case 0: @@ -347,7 +349,7 @@ int Thread::Exec() if (m_directInvoke) { m_directInvoke = false; - LogPedantic("Handling direct invoker"); + WrtLogD("Handling direct invoker"); // Update list while (handleList.size() > MIN_HANDLE_LIST_SIZE) { @@ -370,7 +372,7 @@ int Thread::Exec() case 2: // Timed event list changed - LogPedantic("Timed event list changed invoker"); + WrtLogD("Timed event list changed invoker"); ProcessTimedEvents(); // Reset timed event invoker @@ -381,7 +383,7 @@ int Thread::Exec() case 3: // Waitable handle watch support invoker - LogPedantic("Waitable handle watch invoker event occurred"); + WrtLogD("Waitable handle watch invoker event occurred"); // First, remove all previous handles while (handleList.size() > MIN_HANDLE_LIST_SIZE) { @@ -401,14 +403,14 @@ int Thread::Exec() // Handle invoker in waitable watch support WaitableHandleWatchSupport::InvokerFinished(); - LogPedantic("Waitable handle watch invoker event handled"); + WrtLogD("Waitable handle watch invoker event handled"); // Done break; default: // Waitable event watch list - LogPedantic("Waitable handle watch event occurred"); + WrtLogD("Waitable handle watch event occurred"); // Handle event in waitable handle watch { @@ -421,7 +423,7 @@ int Thread::Exec() if (m_directInvoke) { m_directInvoke = false; - LogPedantic("Handling direct invoker"); + WrtLogD("Handling direct invoker"); // Update list while (handleList.size() > MIN_HANDLE_LIST_SIZE) { @@ -439,7 +441,7 @@ int Thread::Exec() } } - LogPedantic("Waitable handle watch event handled"); + WrtLogD("Waitable handle watch event handled"); // Done break; @@ -447,24 +449,25 @@ int Thread::Exec() } } - LogPedantic("Leaving thread event processing"); + WrtLogD("Leaving thread event processing"); return 0; } void Thread::Run() { - LogPedantic("Running thread"); + WrtLogD("Running thread"); // Critical section { - Mutex::ScopedLock lock(&m_stateMutex); + std::lock_guard lock(m_stateMutex); if (m_running) { return; } - // Try to create new thread - if (pthread_create(&m_thread, NULL, &StaticThreadEntry, this) != 0) { + try{ + m_thread = std::thread(StaticThreadEntry,this); + }catch(std::system_error e){ Throw(Exception::RunFailed); } @@ -475,43 +478,36 @@ void Thread::Run() m_running = true; } - LogPedantic("Thread run"); + WrtLogD("Thread run"); } void Thread::Quit() { - pthread_t joinableThread; - // Critical section { - Mutex::ScopedLock lock(&m_stateMutex); + std::lock_guard lock(m_stateMutex); // Is thread running ? if (!m_running) { return; } - LogPedantic("Quitting thread..."); + WrtLogD("Quitting thread..."); // Do not abandon thread, we will join m_abandon = false; // Singal quit waitable event m_quitEvent.Signal(); - - // Copy joinable thread identifier, because - // we are leaving critical section - joinableThread = m_thread; } - // Wait for joinable thread - void *result; - - if (pthread_join(joinableThread, &result) != 0) { + try{ + m_thread.join(); + }catch(std::system_error e){ Throw(Exception::QuitFailed); } - LogPedantic("Thread quit"); + WrtLogD("Thread quit"); } void Thread::PushEvent(void *event, @@ -520,7 +516,7 @@ void Thread::PushEvent(void *event, void *userParam) { // Enter event list critical section - Mutex::ScopedLock lock(&m_eventMutex); + std::lock_guard lock(m_eventMutex); // Push new event m_eventList.push_back(InternalEvent(event, userParam, eventDispatchProc, @@ -529,7 +525,7 @@ void Thread::PushEvent(void *event, // Trigger invoker m_eventInvoker.Signal(); - LogPedantic("Event pushed and invoker signaled"); + WrtLogD("Event pushed and invoker signaled"); } void Thread::PushTimedEvent(void *event, @@ -542,7 +538,7 @@ void Thread::PushTimedEvent(void *event, Assert(dueTimeSeconds >= 0.0); // Enter timed event list critical section - Mutex::ScopedLock lock(&m_timedEventMutex); + std::lock_guard lock(m_timedEventMutex); // Get current time unsigned long currentTimeMiliseconds = GetCurrentTimeMiliseconds(); @@ -564,10 +560,9 @@ void Thread::PushTimedEvent(void *event, // Trigger invoker m_timedEventInvoker.Signal(); - LogPedantic( - "Timed event pushed and invoker signaled: due time: " << - dueTimeMiliseconds << " ms, absolute due time: " << - currentTimeMiliseconds + dueTimeMiliseconds << " ms"); + WrtLogD("Timed event pushed and invoker signaled: " + "due time: %lu ms, absolute due time: %lu ms", + dueTimeMiliseconds, currentTimeMiliseconds + dueTimeMiliseconds); } Thread *Thread::GetInvokerThread()