TS-2652: Providing a true cancel() in AsyncTimer

Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/521b6e11
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/521b6e11
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/521b6e11

Branch: refs/heads/master
Commit: 521b6e11d4357ccaae348c4714b1084b39a199d0
Parents: af12e77
Author: Manjesh Nilange <[email protected]>
Authored: Wed Mar 26 11:22:23 2014 -0700
Committer: Manjesh Nilange <[email protected]>
Committed: Wed Mar 26 11:22:23 2014 -0700

----------------------------------------------------------------------
 lib/atscppapi/examples/async_timer/AsyncTimer.cc | 17 ++++++++++++++---
 lib/atscppapi/src/AsyncTimer.cc                  |  8 ++++++--
 lib/atscppapi/src/include/atscppapi/AsyncTimer.h |  2 ++
 3 files changed, 22 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/521b6e11/lib/atscppapi/examples/async_timer/AsyncTimer.cc
----------------------------------------------------------------------
diff --git a/lib/atscppapi/examples/async_timer/AsyncTimer.cc 
b/lib/atscppapi/examples/async_timer/AsyncTimer.cc
index 738a536..c802462 100644
--- a/lib/atscppapi/examples/async_timer/AsyncTimer.cc
+++ b/lib/atscppapi/examples/async_timer/AsyncTimer.cc
@@ -28,8 +28,9 @@ using std::string;
 
 class TimerEventReceiver : public AsyncReceiver<AsyncTimer> {
 public:
-  TimerEventReceiver(AsyncTimer::Type type, int period_in_ms, int 
initial_period_in_ms = 0, int max_instances = 0)
-    : max_instances_(max_instances), instance_count_(0), type_(type) {
+  TimerEventReceiver(AsyncTimer::Type type, int period_in_ms, int 
initial_period_in_ms = 0, int max_instances = 0,
+                     bool cancel = false)
+    : max_instances_(max_instances), instance_count_(0), type_(type), 
cancel_(cancel) {
     timer_ = new AsyncTimer(type, period_in_ms, initial_period_in_ms);
     Async::execute<AsyncTimer>(this, timer_, shared_ptr<Mutex>()); // letting 
the system create the mutex
   }
@@ -38,7 +39,7 @@ public:
     TS_DEBUG(TAG, "Got timer event in object %p!", this);
     if ((type_ == AsyncTimer::TYPE_ONE_OFF) || (max_instances_ && 
(++instance_count_ == max_instances_))) {
       TS_DEBUG(TAG, "Stopping timer in object %p!", this);
-      delete this;
+      cancel_ ? timer_->cancel() : delete this;
     }
   }
 
@@ -51,6 +52,7 @@ private:
   int instance_count_;
   AsyncTimer::Type type_;
   AsyncTimer *timer_;
+  bool cancel_;
 };
 
 void TSPluginInit(int argc ATSCPPAPI_UNUSED, const char *argv[] 
ATSCPPAPI_UNUSED) {
@@ -58,11 +60,13 @@ void TSPluginInit(int argc ATSCPPAPI_UNUSED, const char 
*argv[] ATSCPPAPI_UNUSED
   TimerEventReceiver *timer1 = new 
TimerEventReceiver(AsyncTimer::TYPE_PERIODIC, period_in_ms);
   TS_DEBUG(TAG, "Created periodic timer %p with initial period 0, regular 
period %d and max instances 0", timer1,
            period_in_ms);
+
   int initial_period_in_ms = 100;
   TimerEventReceiver *timer2 = new 
TimerEventReceiver(AsyncTimer::TYPE_PERIODIC, period_in_ms,
                                                       initial_period_in_ms);
   TS_DEBUG(TAG, "Created periodic timer %p with initial period %d, regular 
period %d and max instances 0", timer2,
            initial_period_in_ms, period_in_ms);
+
   initial_period_in_ms = 200;
   int max_instances = 10;
   TimerEventReceiver *timer3 = new 
TimerEventReceiver(AsyncTimer::TYPE_PERIODIC, period_in_ms, 
initial_period_in_ms,
@@ -72,4 +76,11 @@ void TSPluginInit(int argc ATSCPPAPI_UNUSED, const char 
*argv[] ATSCPPAPI_UNUSED
 
   TimerEventReceiver *timer4 = new 
TimerEventReceiver(AsyncTimer::TYPE_ONE_OFF, period_in_ms);
   TS_DEBUG(TAG, "Created one-off timer %p with period %d", timer4, 
period_in_ms);
+
+  initial_period_in_ms = 0;
+  max_instances = 5;
+  TimerEventReceiver *timer5 = new 
TimerEventReceiver(AsyncTimer::TYPE_PERIODIC, period_in_ms, 
initial_period_in_ms,
+                                                      max_instances, true /* 
cancel */);
+  TS_DEBUG(TAG, "Created canceling timer %p with initial period %d, regular 
period %d and max instances %d", timer5,
+           initial_period_in_ms, period_in_ms, max_instances);
 }

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/521b6e11/lib/atscppapi/src/AsyncTimer.cc
----------------------------------------------------------------------
diff --git a/lib/atscppapi/src/AsyncTimer.cc b/lib/atscppapi/src/AsyncTimer.cc
index c7548ce..d07b617 100644
--- a/lib/atscppapi/src/AsyncTimer.cc
+++ b/lib/atscppapi/src/AsyncTimer.cc
@@ -90,8 +90,8 @@ void AsyncTimer::run() {
   }
 }
 
-AsyncTimer::~AsyncTimer() {
-  TSMutexLock(TSContMutexGet(state_->cont_));
+void AsyncTimer::cancel() {
+  TSMutexLock(TSContMutexGet(state_->cont_)); // mutex will be unlocked in 
destroy
   if (state_->initial_timer_action_) {
     LOG_DEBUG("Canceling initial timer action");
     TSActionCancel(state_->initial_timer_action_);
@@ -102,5 +102,9 @@ AsyncTimer::~AsyncTimer() {
   }
   LOG_DEBUG("Destroying cont");
   TSContDestroy(state_->cont_);
+}
+
+AsyncTimer::~AsyncTimer() {
+  cancel();
   delete state_;
 }

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/521b6e11/lib/atscppapi/src/include/atscppapi/AsyncTimer.h
----------------------------------------------------------------------
diff --git a/lib/atscppapi/src/include/atscppapi/AsyncTimer.h 
b/lib/atscppapi/src/include/atscppapi/AsyncTimer.h
index 5e61e1d..5b5f6d5 100644
--- a/lib/atscppapi/src/include/atscppapi/AsyncTimer.h
+++ b/lib/atscppapi/src/include/atscppapi/AsyncTimer.h
@@ -69,6 +69,8 @@ public:
    */  
   void run();
 
+  void cancel();
+
 private:
   AsyncTimerState *state_;
 };

Reply via email to