2002-07-11 03:31:07 +00:00
|
|
|
#include <ThreadedTestCase.h>
|
2002-07-12 20:30:45 +00:00
|
|
|
#include <Autolock.h>
|
|
|
|
|
#include <stdio.h>
|
2002-07-11 03:31:07 +00:00
|
|
|
|
|
|
|
|
BThreadedTestCase::BThreadedTestCase(std::string name, std::string progressSeparator)
|
|
|
|
|
: BTestCase(name)
|
|
|
|
|
, fProgressSeparator(progressSeparator)
|
2002-07-12 20:30:45 +00:00
|
|
|
, fUpdateLock(new BLocker())
|
2002-07-11 03:31:07 +00:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BThreadedTestCase::~BThreadedTestCase() {
|
|
|
|
|
// Kill our locker
|
2002-07-12 20:30:45 +00:00
|
|
|
delete fUpdateLock;
|
2002-07-11 03:31:07 +00:00
|
|
|
|
|
|
|
|
// Clean up
|
|
|
|
|
for (std::map<thread_id, ThreadSubTestInfo*>::iterator i = fNumberMap.begin();
|
|
|
|
|
i != fNumberMap.end();
|
|
|
|
|
i++)
|
|
|
|
|
{
|
|
|
|
|
delete i->second;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
BThreadedTestCase::NextSubTest() {
|
|
|
|
|
// Find out what thread we're in
|
|
|
|
|
thread_id id = find_thread(NULL);
|
|
|
|
|
|
|
|
|
|
{
|
2002-07-12 20:30:45 +00:00
|
|
|
// Acquire the update lock
|
|
|
|
|
BAutolock lock(fUpdateLock);
|
2002-07-11 03:31:07 +00:00
|
|
|
std::map<thread_id, ThreadSubTestInfo*>::iterator i = fNumberMap.find(id);
|
|
|
|
|
if (i != fNumberMap.end() && i->second) {
|
|
|
|
|
// Handle multi-threaded case
|
|
|
|
|
ThreadSubTestInfo *info = i->second;
|
2002-07-12 20:30:45 +00:00
|
|
|
char num[32];
|
|
|
|
|
sprintf(num, "%ld", info->subTestNum++);
|
|
|
|
|
std::string str = std::string("[") + info->name + fProgressSeparator + num + "]";
|
|
|
|
|
fUpdateList.push_back(str);
|
2002-07-11 03:31:07 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Handle single-threaded case
|
|
|
|
|
BTestCase::NextSubTest();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
BThreadedTestCase::InitThreadInfo(thread_id id, std::string threadName) {
|
2002-07-12 20:30:45 +00:00
|
|
|
BAutolock lock(fUpdateLock); // Lock the number map
|
2002-07-11 03:31:07 +00:00
|
|
|
std::map<thread_id, ThreadSubTestInfo*>::iterator i = fNumberMap.find(id);
|
|
|
|
|
if (i != fNumberMap.end() && i->second) {
|
|
|
|
|
i->second->name = threadName;
|
|
|
|
|
i->second->subTestNum = 0;
|
|
|
|
|
} else {
|
|
|
|
|
// New addition
|
|
|
|
|
ThreadSubTestInfo *info = new ThreadSubTestInfo();
|
|
|
|
|
info->name = threadName;
|
|
|
|
|
info->subTestNum = 0;
|
|
|
|
|
fNumberMap[id] = info;
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-07-12 20:30:45 +00:00
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
BThreadedTestCase::RegisterForUse() {
|
|
|
|
|
if (!fInUse) {
|
|
|
|
|
fInUse = true;
|
|
|
|
|
return true;
|
|
|
|
|
} else
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
BThreadedTestCase::UnregisterForUse() {
|
|
|
|
|
fInUse = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<std::string>&
|
|
|
|
|
BThreadedTestCase::AcquireUpdateList() {
|
|
|
|
|
fUpdateLock->Lock();
|
|
|
|
|
return fUpdateList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
BThreadedTestCase::ReleaseUpdateList() {
|
|
|
|
|
fUpdateLock->Unlock();
|
|
|
|
|
}
|