aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libstrongswan/threading/windows/thread.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/libstrongswan/threading/windows/thread.c b/src/libstrongswan/threading/windows/thread.c
index 71e56528e..5fa68bb91 100644
--- a/src/libstrongswan/threading/windows/thread.c
+++ b/src/libstrongswan/threading/windows/thread.c
@@ -88,11 +88,16 @@ struct private_thread_t {
bool cancelability;
/**
- * Has the thread been cancelled
+ * Has the thread been cancelled by thread->cancel()?
*/
bool canceled;
/**
+ * Did we schedule an APC to docancel()?
+ */
+ bool cancel_pending;
+
+ /**
* Active condition variable thread is waiting in, if any
*/
CONDITION_VARIABLE *condvar;
@@ -357,10 +362,14 @@ METHOD(thread_t, cancel, void,
if (this->cancelability)
{
threads_lock->lock(threads_lock);
- QueueUserAPC((void*)docancel, this->handle, (uintptr_t)this);
- if (this->condvar)
+ if (!this->cancel_pending)
{
- WakeAllConditionVariable(this->condvar);
+ this->cancel_pending = TRUE;
+ QueueUserAPC((void*)docancel, this->handle, (uintptr_t)this);
+ if (this->condvar)
+ {
+ WakeAllConditionVariable(this->condvar);
+ }
}
threads_lock->unlock(threads_lock);
}