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 95 96 97 98 99 100 101
|
//
// Copyright (c) ZeroC, Inc. All rights reserved.
//
#include <IceUtil/IceUtil.h>
#include <RecMutexTest.h>
#include <TestHelper.h>
using namespace std;
using namespace IceUtil;
static const string recMutexTestName("recursive mutex");
class RecMutexTestThread : public Thread
{
public:
RecMutexTestThread(RecMutex& m) :
_mutex(m),
_tryLock(false)
{
}
virtual void run()
{
RecMutex::TryLock tlock(_mutex);
test(!tlock.acquired());
{
Mutex::Lock lock(_tryLockMutex);
_tryLock = true;
}
_tryLockCond.signal();
RecMutex::Lock lock(_mutex);
}
void
waitTryLock()
{
Mutex::Lock lock(_tryLockMutex);
while(!_tryLock)
{
_tryLockCond.wait(lock);
}
}
private:
RecMutex& _mutex;
bool _tryLock;
//
// Use native Condition variable here, not Monitor.
//
Cond _tryLockCond;
Mutex _tryLockMutex;
};
typedef Handle<RecMutexTestThread> RecMutexTestThreadPtr;
RecMutexTest::RecMutexTest() :
TestBase(recMutexTestName)
{
}
void
RecMutexTest::run()
{
RecMutex mutex;
RecMutexTestThreadPtr t;
ThreadControl control;
{
RecMutex::Lock lock(mutex);
// TEST: lock twice
RecMutex::Lock lock2(mutex);
// TEST: TryLock
RecMutex::TryLock lock3(mutex);
test(lock3.acquired());
// TEST: Start thread, try to acquire the mutex.
t = new RecMutexTestThread(mutex);
control = t->start();
// TEST: Wait until the tryLock has been tested.
t->waitTryLock();
}
//
// TEST: Once the recursive mutex has been released, the thread
// should acquire the mutex and then terminate.
//
control.join();
}
|