This is an automated email from the ASF dual-hosted git repository.

amc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new de8a4ad  Fix dicarding active lock in CPPAPI Async Timer.
de8a4ad is described below

commit de8a4ad76f090d0d44c1b6648337b3f30731bb7b
Author: Alan M. Carroll <a...@apache.org>
AuthorDate: Thu May 24 14:25:36 2018 -0500

    Fix dicarding active lock in CPPAPI Async Timer.
---
 lib/cppapi/AsyncTimer.cc | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/lib/cppapi/AsyncTimer.cc b/lib/cppapi/AsyncTimer.cc
index 556d032..cc44699 100644
--- a/lib/cppapi/AsyncTimer.cc
+++ b/lib/cppapi/AsyncTimer.cc
@@ -93,11 +93,17 @@ AsyncTimer::run()
 void
 AsyncTimer::cancel()
 {
-  if (!state_->cont_) {
+  // Assume this object is locked and the state isn't being updated elsewhere.
+  // Note that is not the same as the contained continuation being locked.
+  TSCont contp{state_->cont_}; // save this
+  if (!contp) {
     LOG_DEBUG("Already canceled");
     return;
   }
-  TSMutexLock(TSContMutexGet(state_->cont_)); // mutex will be unlocked in 
destroy
+
+  auto mutex{TSContMutexGet(contp)};
+  TSMutexLock(mutex); // prevent event dispatch for the continuation during 
this cancel.
+
   if (state_->initial_timer_action_) {
     LOG_DEBUG("Canceling initial timer action");
     TSActionCancel(state_->initial_timer_action_);
@@ -106,9 +112,12 @@ AsyncTimer::cancel()
     LOG_DEBUG("Canceling periodic timer action");
     TSActionCancel(state_->periodic_timer_action_);
   }
-  LOG_DEBUG("Destroying cont");
-  TSContDestroy(state_->cont_);
   state_->cont_ = nullptr;
+
+  TSMutexUnlock(mutex);
+
+  LOG_DEBUG("Destroying cont");
+  TSContDestroy(contp);
 }
 
 AsyncTimer::~AsyncTimer()

-- 
To stop receiving notification emails like this one, please contact
a...@apache.org.

Reply via email to