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 2013/08/13 21:19:54 UTC

svn commit: r1513619 - in /activemq/activemq-cpp/trunk/activemq-cpp/src: main/decaf/lang/Thread.cpp main/decaf/lang/Thread.h test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.cpp test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.h

Author: tabish
Date: Tue Aug 13 19:19:54 2013
New Revision: 1513619

URL: http://svn.apache.org/r1513619
Log:
test for: https://issues.apache.org/jira/browse/AMQCPP-506

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

Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp?rev=1513619&r1=1513618&r2=1513619&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.cpp Tue Aug 13 19:19:54 2013
@@ -46,8 +46,8 @@ using namespace decaf::util;
 using namespace decaf::util::concurrent;
 
 ////////////////////////////////////////////////////////////////////////////////
-namespace decaf{
-namespace lang{
+namespace decaf {
+namespace lang {
 
     class ThreadProperties {
     private:
@@ -147,18 +147,18 @@ void Thread::start() {
 
     try {
 
-        if( Threading::getThreadState(this->properties->handle) > Thread::NEW ) {
+        if (Threading::getThreadState(this->properties->handle) > Thread::NEW) {
             throw IllegalThreadStateException(
                 __FILE__, __LINE__,
                 "Thread::start - Thread already started");
         }
 
         Threading::start(this->properties->handle);
-     }
-     DECAF_CATCH_RETHROW( IllegalThreadStateException )
-     DECAF_CATCH_RETHROW( RuntimeException )
-     DECAF_CATCH_EXCEPTION_CONVERT( NullPointerException, RuntimeException )
-     DECAF_CATCHALL_THROW( RuntimeException )
+    }
+    DECAF_CATCH_RETHROW(IllegalThreadStateException)
+    DECAF_CATCH_RETHROW(RuntimeException)
+    DECAF_CATCH_EXCEPTION_CONVERT(NullPointerException, RuntimeException)
+    DECAF_CATCHALL_THROW(RuntimeException)
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -169,7 +169,7 @@ void Thread::join() {
 ////////////////////////////////////////////////////////////////////////////////
 void Thread::join(long long millisecs) {
 
-    if( millisecs < 0 ) {
+    if (millisecs < 0) {
         throw IllegalArgumentException(
             __FILE__, __LINE__,
             "Thread::join( millisecs ) - Value given {%d} is less than 0", millisecs );
@@ -181,13 +181,13 @@ void Thread::join(long long millisecs) {
 ////////////////////////////////////////////////////////////////////////////////
 void Thread::join(long long millisecs, int nanos) {
 
-    if( millisecs < 0 ) {
+    if (millisecs < 0) {
         throw IllegalArgumentException(
             __FILE__, __LINE__,
             "Thread::join( millisecs, nanos ) - Value given {%d} is less than 0", millisecs );
     }
 
-    if( nanos < 0 || nanos > 999999 ) {
+    if (nanos < 0 || nanos > 999999) {
         throw IllegalArgumentException(
             __FILE__, __LINE__,
             "Thread::join( millisecs, nanos ) - Nanoseconds must be in range [0...999999]" );
@@ -204,13 +204,13 @@ void Thread::sleep(long long millisecs) 
 ////////////////////////////////////////////////////////////////////////////////
 void Thread::sleep(long long millisecs, int nanos) {
 
-    if( millisecs < 0 ) {
+    if (millisecs < 0) {
         throw IllegalArgumentException(
             __FILE__, __LINE__,
             "Thread::sleep( millisecs, nanos ) - Value given {%d} is less than 0", millisecs );
     }
 
-    if( nanos < 0 || nanos > 999999 ) {
+    if (nanos < 0 || nanos > 999999) {
         throw IllegalArgumentException(
             __FILE__, __LINE__,
             "Thread::sleep( millisecs, nanos ) - Nanoseconds must be in range [0...999999]" );
@@ -279,7 +279,6 @@ void Thread::setDefaultUncaughtException
 
 ////////////////////////////////////////////////////////////////////////////////
 std::string Thread::toString() const {
-
     return std::string(Threading::getThreadName(this->properties->handle)) + ": Priority=" +
            Integer::toString(Threading::getThreadPriority(this->properties->handle)) +
            ", ThreadID=" + Long::toString( Threading::getThreadId(this->properties->handle));

Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h?rev=1513619&r1=1513618&r2=1513619&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/lang/Thread.h Tue Aug 13 19:19:54 2013
@@ -25,15 +25,15 @@
 #include <decaf/lang/Runnable.h>
 #include <decaf/util/Config.h>
 
-namespace decaf{
-namespace internal{
-namespace util{
-namespace concurrent{
+namespace decaf {
+namespace internal {
+namespace util {
+namespace concurrent {
     class Threading;
     struct ThreadHandle;
 }}}
-namespace lang
-{
+namespace lang {
+
     class ThreadGroup;
     class ThreadProperties;
 
@@ -81,7 +81,7 @@ namespace lang
         static const int MAX_PRIORITY = 10;
 
         /** Represents the various states that the Thread can be in during its lifetime. */
-        enum State{
+        enum State {
 
             /** Before a Thread is started it exists in this State. */
             NEW = 0,

Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.cpp?rev=1513619&r1=1513618&r2=1513619&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.cpp Tue Aug 13 19:19:54 2013
@@ -2280,3 +2280,61 @@ void ReentrantReadWriteLockTest::testWri
     std::string ls = lock.writeLock().toString();
     CPPUNIT_ASSERT(ls.find_first_of("Locked") != std::string::npos);
 }
+
+////////////////////////////////////////////////////////////////////////////////
+namespace {
+
+    const int MAX_ITERATION = 5000;
+
+    class TestMultipleReaderThreadsRunnable : public Runnable {
+    private:
+
+        ReentrantReadWriteLockTest* test;
+        ReentrantReadWriteLock* lock;
+
+    private:
+
+        TestMultipleReaderThreadsRunnable(const TestMultipleReaderThreadsRunnable&);
+        TestMultipleReaderThreadsRunnable operator= (const TestMultipleReaderThreadsRunnable&);
+
+    public:
+
+        TestMultipleReaderThreadsRunnable(ReentrantReadWriteLockTest* test, ReentrantReadWriteLock* lock) :
+            Runnable(), test(test), lock(lock) {}
+        virtual ~TestMultipleReaderThreadsRunnable() {}
+
+        virtual void run() {
+            try {
+                for (int i = 0; i < MAX_ITERATION; ++i) {
+                    test->threadAssertTrue(lock->readLock().tryLock());
+                    lock->readLock().unlock();
+                }
+            } catch (Exception& ex) {
+                test->threadUnexpectedException();
+            }
+        }
+    };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void ReentrantReadWriteLockTest::testMultipleReaderThreads() {
+    const int THREAD_QTY = 50;
+
+    ReentrantReadWriteLock lock;
+    TestMultipleReaderThreadsRunnable runnable(this, &lock);
+
+    std::vector<Thread*> threads;
+    for (int i = 0; i < THREAD_QTY; ++i) {
+        threads.push_back(new Thread(&runnable));
+    }
+
+    for (int i = 0; i < THREAD_QTY; ++i) {
+        threads[i]->start();
+    }
+
+    for (int i = 0; i < THREAD_QTY; ++i) {
+        threads[i]->join();
+        delete threads[i];
+    }
+}
+

Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.h?rev=1513619&r1=1513618&r2=1513619&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.h (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/test/decaf/util/concurrent/locks/ReentrantReadWriteLockTest.h Tue Aug 13 19:19:54 2013
@@ -90,6 +90,7 @@ namespace locks {
         CPPUNIT_TEST( testHasWaiters );
         CPPUNIT_TEST( testGetWaitQueueLength );
         CPPUNIT_TEST( testGetWaitingThreads );
+        CPPUNIT_TEST( testMultipleReaderThreads );
         CPPUNIT_TEST_SUITE_END();
 
     public:
@@ -158,6 +159,7 @@ namespace locks {
         void testHasWaiters();
         void testGetWaitQueueLength();
         void testGetWaitingThreads();
+        void testMultipleReaderThreads();
 
     };