You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2007/07/24 15:51:27 UTC

svn commit: r559051 - in /activemq/activemq-cpp/trunk/src/decaf/src/main/decaf: lang/Thread.cpp lang/Thread.h util/concurrent/Mutex.h

Author: tabish
Date: Tue Jul 24 06:51:25 2007
New Revision: 559051

URL: http://svn.apache.org/viewvc?view=rev&rev=559051
Log:
http://issues.apache.org/activemq/browse/AMQCPP-103

APRified Thread Class, and mutex cleanups

Modified:
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.cpp
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.h
    activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/util/concurrent/Mutex.h

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.cpp?view=diff&rev=559051&r1=559050&r2=559051
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.cpp (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.cpp Tue Jul 24 06:51:25 2007
@@ -17,11 +17,8 @@
 
 #include "Thread.h"
 
-#ifdef HAVE_PTHREAD_H
-    #include <errno.h>
-#else
-    #include <process.h> // _endthreadex
-#endif
+#include <apr_time.h>
+#include <apr_portable.h>
 
 #include <decaf/lang/Exception.h>
 #include <decaf/lang/exceptions/RuntimeException.h>
@@ -31,60 +28,53 @@
 using namespace decaf::lang::exceptions;
 
 ////////////////////////////////////////////////////////////////////////////////
-Thread::Thread()
-{
-    task = this;
-    started = false;
-    joined = false;
+Thread::Thread() {
+    this->task = this;
+    this->started = false;
+    this->joined = false;
+    this->pool = NULL;
+    this->threadHandle = NULL;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-Thread::Thread( Runnable* task )
-{
+Thread::Thread( Runnable* task ) {
     this->task = task;
-    started = false;
-    joined = false;
+    this->started = false;
+    this->joined = false;
+    this->pool = NULL;
+    this->threadHandle = NULL;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-Thread::~Thread()
-{
+Thread::~Thread(){
+    if( pool != NULL ) {
+        apr_pool_destroy( pool );
+    }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 void Thread::start() throw ( Exception )
 {
-    if (this->started) {
-        throw Exception( __FILE__, __LINE__,
-            "Thread already started");
+    if( this->started ) {
+        throw Exception(
+            __FILE__, __LINE__,
+            "Thread::start - Thread already started");
     }
 
-#ifdef HAVE_PTHREAD_H
-
-    ::pthread_attr_init (&attributes);
-    ::pthread_attr_setdetachstate (&attributes, PTHREAD_CREATE_JOINABLE);
-    int err = ::pthread_create (
+    apr_pool_create( &pool, NULL );
+    apr_status_t err = apr_thread_create(
         &this->threadHandle,
-        &attributes,
+        NULL,
         runCallback,
-        this);
-    if (err != 0) {
-        throw Exception( __FILE__, __LINE__,
-            "Coud not start thread");
-    }
-
-#else
+        this,
+        pool );
 
-    unsigned int threadId = 0;
-    this->threadHandle =
-        (HANDLE)::_beginthreadex(NULL, 0, runCallback, this, 0, &threadId);
-    if (this->threadHandle == NULL) {
-        throw Exception( __FILE__, __LINE__,
-            "Coud not start thread");
+    if( err != APR_SUCCESS ) {
+        throw Exception(
+            __FILE__, __LINE__,
+            "Thread::start - Coud not start thread");
     }
 
-#endif
-
     // Mark the thread as started.
     started = true;
 }
@@ -92,58 +82,34 @@
 ////////////////////////////////////////////////////////////////////////////////
 void Thread::join() throw( Exception )
 {
-    if (!this->started) {
+    if( !this->started ) {
         throw Exception( __FILE__, __LINE__,
             "Thread::join() called without having called Thread::start()");
     }
-    if (!this->joined) {
-
-#ifdef HAVE_PTHREAD_H
-        ::pthread_join(this->threadHandle, NULL);
-#else
-        ::WaitForSingleObject (this->threadHandle, INFINITE);
-#endif
 
+    if( !this->joined ) {
+        apr_status_t threadReturn;
+        if( apr_thread_join( &threadReturn, this->threadHandle ) != APR_SUCCESS ) {
+            throw Exception( __FILE__, __LINE__,
+                "Thread::join() - Failed to Join the Thread");
+        }
     }
     this->joined = true;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-void Thread::sleep( int millisecs )
-{
-#ifdef HAVE_PTHREAD_H
-    struct timespec rec, rem;
-    rec.tv_sec = millisecs / 1000;
-    rec.tv_nsec = (millisecs % 1000) * 1000000;
-    while( nanosleep( &rec, &rem ) == -1 ){
-        if( errno != EINTR ){
-            break;
-        }
-    }
-
-#else
-    ::Sleep (millisecs);
-#endif
+void Thread::sleep( int millisecs ) {
+    apr_sleep( (apr_interval_time_t)(millisecs * 1000) );
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-unsigned long Thread::getId(void)
-{
-   #ifdef HAVE_PTHREAD_H
-      return (long)(pthread_self());
-   #else
-      return GetCurrentThreadId();
-   #endif
+unsigned long Thread::getId() {
+    return (long)( apr_os_thread_current() );
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-#ifdef HAVE_PTHREAD_H
-    void*
-#else
-    unsigned int WINAPI
-#endif
-Thread::runCallback( void* param )
-{
+void* APR_THREAD_FUNC Thread::runCallback( apr_thread_t* self, void* param ) {
+
     // Get the instance.
     Thread* thread = (Thread*)param;
 
@@ -151,22 +117,13 @@
     try{
         thread->task->run();
     } catch( ... ){
-        RuntimeException ex(__FILE__, __LINE__, "unhandled exception bubbled up to Thread::run");
+        RuntimeException ex(
+            __FILE__, __LINE__,
+            "unhandled exception bubbled up to Thread::run");
         ex.printStackTrace();
     }
 
-#ifdef HAVE_PTHREAD_H
-    ::pthread_attr_destroy( &thread->attributes );
+    // Indicate we are done.
+    apr_thread_exit( self, APR_SUCCESS );
     return NULL;
-#else
-
-    // Needed when using threads and CRT in Windows. Otherwise memleak can appear.
-    ::_endthreadex(0);
-
-    // _endthreadex (unlike _endthread) does not automatically close the thread handle
-    // so we need to do this manually.
-    ::CloseHandle(thread->threadHandle);
-
-    return 0;
-#endif
 }

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.h?view=diff&rev=559051&r1=559050&r2=559051
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.h (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/lang/Thread.h Tue Jul 24 06:51:25 2007
@@ -23,11 +23,8 @@
 #include <stdexcept>
 #include <assert.h>
 
-#ifdef HAVE_PTHREAD_H
-    #include <pthread.h>
-#else
-    #include <windows.h>
-#endif
+#include <apr_pools.h>
+#include <apr_thread_proc.h>
 
 namespace decaf{
 namespace lang{
@@ -47,12 +44,15 @@
          */
         Runnable* task;
 
-        #ifdef HAVE_PTHREAD_H
-            pthread_attr_t attributes;
-            pthread_t threadHandle;
-        #else
-            HANDLE threadHandle;
-        #endif
+        /**
+         * APR Pool to allocate thread from
+         */
+        apr_pool_t* pool;
+
+        /**
+         * APR Thread Handle
+         */
+        apr_thread_t* threadHandle;
 
         /**
          * Started state of this thread.
@@ -116,16 +116,12 @@
          * Obtains the Thread Id of the current thread
          * @return Thread Id
          */
-        static unsigned long getId(void);
+        static unsigned long getId();
 
     private:
 
         // Internal thread handling
-        #ifdef HAVE_PTHREAD_H
-            static void* runCallback (void* param);
-        #else
-            static unsigned int WINAPI runCallback (void* param);
-        #endif
+        static void* APR_THREAD_FUNC runCallback( apr_thread_t* self, void* param );
 
     };
 

Modified: activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/util/concurrent/Mutex.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/util/concurrent/Mutex.h?view=diff&rev=559051&r1=559050&r2=559051
==============================================================================
--- activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/util/concurrent/Mutex.h (original)
+++ activemq/activemq-cpp/trunk/src/decaf/src/main/decaf/util/concurrent/Mutex.h Tue Jul 24 06:51:25 2007
@@ -18,21 +18,16 @@
 #ifndef _DECAF_CONCURRENT_MUTEX_H_
 #define _DECAF_CONCURRENT_MUTEX_H_
 
-// Includes.
 #include <decaf/util/concurrent/Synchronizable.h>
 #include <decaf/util/concurrent/Concurrent.h>
 #include <decaf/lang/Thread.h>
 #include <decaf/util/Config.h>
-#include <list>
 
 #include <apr_pools.h>
 #include <apr_thread_mutex.h>
 #include <apr_thread_cond.h>
 
-#ifdef HAVE_SYS_TIME_H
-    #include <sys/time.h>
-#endif
-
+#include <list>
 #include <assert.h>
 
 namespace decaf{