tizen 2.4 release
[framework/web/wrt-commons.git] / modules / core / src / thread.cpp
old mode 100644 (file)
new mode 100755 (executable)
similarity index 83%
rename from modules_mobile/core/src/thread.cpp
rename to modules/core/src/thread.cpp
index 0e75810..5709545
@@ -21,7 +21,7 @@
  */
 #include <stddef.h>
 #include <dpl/thread.h>
-#include <dpl/log/log.h>
+#include <dpl/log/wrt_log.h>
 #include <sys/time.h>
 #include <algorithm>
 #include <dpl/assert.h>
@@ -40,7 +40,7 @@ static const size_t NANOSECONDS_PER_MILISECOND =
 static const size_t NANOSECONDS_PER_MICROSECOND =
     static_cast<uint64_t>(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<Thread *>(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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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()