1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
//
// Copyright (c) ZeroC, Inc. All rights reserved.
//
#include <IceUtil/IceUtil.h>
#include <AliveTest.h>
#include <TestHelper.h>
using namespace std;
using namespace IceUtil;
static const string createTestName("thread alive");
class CondVar : public IceUtil::Monitor<IceUtil::RecMutex>
{
public:
CondVar() :
_done(false)
{
}
void waitForSignal()
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock lock(*this);
while(!_done)
{
wait();
}
}
void signal()
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock lock(*this);
_done = true;
notify();
}
private:
bool _done;
};
class AliveTestThread : public Thread
{
public:
AliveTestThread(CondVar& childCreated, CondVar& parentReady) :
_childCreated(childCreated), _parentReady(parentReady)
{
}
virtual void run()
{
try
{
_childCreated.signal();
_parentReady.waitForSignal();
}
catch(const IceUtil::ThreadLockedException&)
{
}
}
private:
CondVar& _childCreated;
CondVar& _parentReady;
};
typedef Handle<AliveTestThread> AliveTestThreadPtr;
AliveTest::AliveTest() :
TestBase(createTestName)
{
}
void
AliveTest::run()
{
//
// Check that calling isAlive() returns the correct result for alive and
// and dead threads.
//
CondVar childCreated;
CondVar parentReady;
AliveTestThreadPtr t = new AliveTestThread(childCreated, parentReady);
IceUtil::ThreadControl c = t->start();
childCreated.waitForSignal();
test(t->isAlive());
parentReady.signal();
c.join();
test(!t->isAlive());
}
|