[ 
https://issues.apache.org/jira/browse/AMQCPP-559?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Francois Godin updated AMQCPP-559:
----------------------------------
    Comment: was deleted

(was: Here is the file used to reproduce the problem.

The URI string should be changed to correspond to a valid ActiveMq server. 
If the line "#define THREAD" is removed, there is no problem.

The program started at 20m and finished at > 100m.)

> Deadlock in concurrent condition
> --------------------------------
>
>                 Key: AMQCPP-559
>                 URL: https://issues.apache.org/jira/browse/AMQCPP-559
>             Project: ActiveMQ C++ Client
>          Issue Type: Bug
>         Environment: CentOS release 6.4 (Final)
>            Reporter: eagle518
>            Assignee: Timothy Bish
>         Attachments: repro.cpp
>
>
> run a moment and deadlock at await().
> code:
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> #include <activemq/util/Config.h>
> #include <activemq/library/ActiveMQCPP.h>
> #include <decaf/lang/Runtime.h>
> #include <decaf/lang/Integer.h>
> #include <decaf/util/ArrayList.h>
> #include <decaf/lang/String.h>
> #include <decaf/lang/System.h>
> #include <decaf/lang/Integer.h>
> #include <decaf/lang/exceptions/RuntimeException.h>
> #include <decaf/util/concurrent/locks/Lock.h>
> #include <decaf/util/concurrent/locks/Condition.h>
> #include <decaf/util/concurrent/locks/ReentrantLock.h>
> #include <decaf/util/LinkedList.h>
> using namespace std;
> using namespace decaf;
> using namespace decaf::lang;
> using namespace decaf::lang::exceptions;
> using namespace decaf::util;
> using namespace decaf::util::concurrent;
> using namespace decaf::util::concurrent::locks;
> class LockConditionTest {
> public:
>       LockConditionTest();
>       virtual ~LockConditionTest();
>       void put();
>       String* take();
> private:
>       Condition* fullCondition;
>       Condition* emptyCondition;
>       decaf::util::concurrent::locks::Lock* lock;
>       int maxSize;
>       LinkedList<String*> *bag;
> };
> class Producer: public Runnable {
> public:
>       Producer(LockConditionTest *test) {
>               m_parent = test;
>       }
>       virtual ~Producer() {
>       }
>       void run() {
>               try {
>                       do {
>                               m_parent->put();
>                       } while (1);
>               } catch (Exception& e) {
>                       e.printStackTrace();
>                       throw e;
>               }
>       }
> private:
>       LockConditionTest *m_parent;
> };
> class Customer: public Runnable {
> public:
>       Customer(LockConditionTest *test) {
>               m_parent = test;
>       }
>       virtual ~Customer() {
>       }
>       void run() {
>               do {
>                       String* s = m_parent->take();
>                       delete s;
>               } while (1);
>       }
> private:
>       LockConditionTest *m_parent;
> };
> LockConditionTest::LockConditionTest() {
>       lock = new ReentrantLock();
>       fullCondition = lock->newCondition();
>       emptyCondition = lock->newCondition();
>       maxSize = 10;
>       bag = new LinkedList<String*>();
> }
> LockConditionTest::~LockConditionTest() {
>       delete bag;
>       delete fullCondition;
>       delete emptyCondition;
>       delete lock;
> }
> void LockConditionTest::put() {
>       int n = 0;
>       lock->lock();
>       try {
>               while (bag->size() >= maxSize)
>                       fullCondition->await();
>               bag->push(new String(Integer::toString(n++)));
>               printf("push: %d\n", bag->size());
>               emptyCondition->signal();
>       } catch (Exception& ex) {
>               ex.printStackTrace();
>       }
>       lock->unlock();
> }
> String* LockConditionTest::take() {
>       String* result = NULL;
>       lock->lock();
>       try {
>               while (bag->size() == 0)
>                       emptyCondition->await();
>               result = dynamic_cast<String*>(bag->pop());
>               printf("pop: %d\n", bag->size());
>               fullCondition->signal();
>       } catch (Exception& e) {
>               e.printStackTrace();
>       }
>       lock->unlock();
>       return result;
> }
> static void test_condition()
> {
>       ArrayList<Thread*> arr;
>       ArrayList<Runnable*> arr1;
>       LockConditionTest *tct = new LockConditionTest();
>       Runnable *r1 = new Producer(tct);
>       Thread *t1 = new Thread(r1);
>       t1->start();
>       arr.add(t1);
>       arr1.add(r1);
>       Runnable *c1 = new Customer(tct);
>       Thread *t2 = new Thread(c1);
>       t2->start();
>       arr.add(t2);
>       arr1.add(c1);
>       Runnable *r2 = new Producer(tct);
>       Thread *t3 = new Thread(r2);
>       t3->start();
>       arr.add(t3);
>       arr1.add(r2);
>       Runnable *c2 = new Customer(tct);
>       Thread *t4 = new Thread(c2);
>       t4->start();
>       arr.add(t4);
>       arr1.add(c2);
>       Runnable *r3 = new Producer(tct);
>       Thread *t5 = new Thread(r3);
>       t5->start();
>       arr.add(t5);
>       arr1.add(r3);
>       Runnable *c3 = new Customer(tct);
>       Thread *t6 = new Thread(c3);
>       t6->start();
>       arr.add(t1);
>       arr1.add(c3);
>       for (int i = 0; i < arr.size(); i++) {
>               arr.get(i)->join();
>       }
>       delete tct;
>       printf("end of test_condition.\n");
> }
> int main(int argc, const char** argv)
> {
>       activemq::library::ActiveMQCPP::initializeLibrary();
>       test_condition();
>       return 0;
> }



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to