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.