Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : #include <iostream> 5 : #include "base/task_trigger.h" 6 : 7 : #include "base/task.h" 8 : 9 : class TaskTrigger::WorkerTask : public Task { 10 : public: 11 1641725 : explicit WorkerTask(TaskTrigger *parent) 12 1641725 : : Task(parent->task_id_, parent->task_instance_), parent_(parent) { 13 1641684 : } 14 1829950 : bool Run() { 15 1829950 : if (parent_->disabled()) { 16 415 : parent_->Reset(); 17 414 : return true; 18 : } 19 1829513 : if (parent_->deferred()) { 20 186533 : return false; 21 : } 22 1642958 : bool done = (parent_->func_)(); 23 1643232 : if (done) { 24 1641121 : parent_->Reset(); 25 : } 26 1643411 : return done; 27 : } 28 0 : std::string Description() const { return "TaskTrigger::WorkerTask"; } 29 : 30 : private: 31 : TaskTrigger *parent_; 32 : }; 33 : 34 1764987 : TaskTrigger::TaskTrigger(const FunctionPtr& func, int task_id, int task_instance) 35 1764987 : : func_(func), task_id_(task_id), task_instance_(task_instance) { 36 1764595 : trigger_ = false; 37 1765262 : disabled_ = false; 38 1765233 : deferred_ = false; 39 1765183 : } 40 : 41 1765306 : TaskTrigger::~TaskTrigger() { 42 1765306 : assert(!trigger_); 43 1765306 : } 44 : 45 3861793 : void TaskTrigger::Set() { 46 3861793 : bool current = trigger_.exchange(true); 47 3861831 : if (!current) { 48 1641728 : WorkerTask *task = new WorkerTask(this); 49 1641678 : TaskScheduler *scheduler = TaskScheduler::GetInstance(); 50 1641670 : scheduler->Enqueue(task); 51 : } 52 3861833 : } 53 : 54 2669551 : void TaskTrigger::Reset() { 55 2669551 : trigger_ = false; 56 2669741 : }