some async-robustness additions and tests for Statement

This commit is contained in:
Aleksandar Fabijanic
2007-09-30 16:42:17 +00:00
parent 6e380b6b13
commit d9364e8f51
7 changed files with 128 additions and 29 deletions

View File

@@ -70,9 +70,6 @@ Statement::Statement(const Statement& stmt):
_pResult(stmt._pResult),
_asyncExec(_ptr, &StatementImpl::execute)
{
// if executing asynchronously, wait
if (stmt._pResult)
stmt._pResult->wait();
}
@@ -100,35 +97,44 @@ void Statement::swap(Statement& other)
Statement::ResultType Statement::execute()
{
if (!isAsync())
Mutex::ScopedLock lock(_mutex);
bool isDone = done();
if (initialized() || paused() || isDone)
{
if (done()) _ptr->reset();
return _ptr->execute();
}
else
{
executeAsync();
return 0;
}
if (!isAsync())
{
if (isDone) _ptr->reset();
return _ptr->execute();
}
else
{
doAsyncExec();
return 0;
}
} else
throw InvalidAccessException("Statement still executing.");
}
const Statement::Result& Statement::executeAsync()
{
FastMutex::ScopedLock lock(_mutex);
bool isDone = done();
if (initialized() || isDone)
{
if (isDone) _ptr->reset();
_pResult = new Result(_asyncExec());
poco_check_ptr (_pResult);
return *_pResult;
}
Mutex::ScopedLock lock(_mutex);
if (initialized() || paused() || done())
return doAsyncExec();
else
throw InvalidAccessException("Statement still executing.");
}
const Statement::Result& Statement::doAsyncExec()
{
if (done()) _ptr->reset();
_pResult = new Result(_asyncExec());
poco_check_ptr (_pResult);
return *_pResult;
}
Statement::ResultType Statement::wait(long milliseconds)
{
if (!_pResult) return 0;