[
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)