diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libstrongswan/threading/windows/thread.c | 17 |
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); } |