DPL::WaitableEvent *m_synchronousEventFlag;
DPL::WaitableEvent *m_finishedFlag;
DPL::WaitableEvent *m_cancelStatusFlag;
+ bool m_cancelSignalAhead;
bool m_cancelled;
bool m_cancelAllowed;
m_synchronousEventFlag(NULL),
m_finishedFlag(NULL),
m_cancelStatusFlag(NULL),
+ m_cancelSignalAhead(false),
m_cancelled(false),
m_cancelAllowed(false)
{}
void signalCancelStatusFlag()
{
LogDebug("signaling cancel");
+ DPL::Mutex::ScopedLock lock(&m_stateMutex);
+ m_cancelSignalAhead = true;
if (m_cancelStatusFlag) {
m_cancelStatusFlag->Signal();
}
bool cancelRequest()
{
LogDebug("trying to cancel");
- assert(
- HANDLING_ASYNCHRONOUS == m_handlingType ||
- HANDLING_ASYNCHRONOUS_MANUAL_ANSWER == m_handlingType);
+ assert(HANDLING_ASYNCHRONOUS == m_handlingType ||
+ HANDLING_ASYNCHRONOUS_MANUAL_ANSWER == m_handlingType);
+ bool signaled = false;
{
DPL::Mutex::ScopedLock lock(&m_stateMutex);
if (m_cancelled) {
}
LogDebug("cancelling");
m_cancelled = true;
+ signaled = m_cancelSignalAhead;
+ if (!signaled) {
+ //create waitable handle
+ getCancelStatusFlag();
+ }
}
LogDebug("waiting for cancel flag");
-
-#if 0 // temporary fix for ApplicationLaunchAppControl eventhandling
- DPL::WaitForSingleHandle(getCancelStatusFlag().GetHandle());
-#endif
+ if (!signaled) {
+ DPL::WaitForSingleHandle(getCancelStatusFlag().GetHandle());
+ }
delete m_cancelStatusFlag;
m_cancelStatusFlag = NULL;
return m_cancelAllowed;