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 1658242 : explicit WorkerTask(TaskTrigger *parent) 12 1658242 : : Task(parent->task_id_, parent->task_instance_), parent_(parent) { 13 1658212 : } 14 1873736 : bool Run() { 15 1873736 : if (parent_->disabled()) { 16 415 : parent_->Reset(); 17 415 : return true; 18 : } 19 1873288 : if (parent_->deferred()) { 20 213679 : return false; 21 : } 22 1659598 : bool done = (parent_->func_)(); 23 1659842 : if (done) { 24 1657732 : parent_->Reset(); 25 : } 26 1659929 : return done; 27 : } 28 0 : std::string Description() const { return "TaskTrigger::WorkerTask"; } 29 : 30 : private: 31 : TaskTrigger *parent_; 32 : }; 33 : 34 1765148 : TaskTrigger::TaskTrigger(const FunctionPtr& func, int task_id, int task_instance) 35 1765148 : : func_(func), task_id_(task_id), task_instance_(task_instance) { 36 1764980 : trigger_ = false; 37 1765315 : disabled_ = false; 38 1765305 : deferred_ = false; 39 1765251 : } 40 : 41 1765288 : TaskTrigger::~TaskTrigger() { 42 1765288 : assert(!trigger_); 43 1765288 : } 44 : 45 3881552 : void TaskTrigger::Set() { 46 3881552 : bool current = trigger_.exchange(true); 47 3881570 : if (!current) { 48 1658246 : WorkerTask *task = new WorkerTask(this); 49 1658209 : TaskScheduler *scheduler = TaskScheduler::GetInstance(); 50 1658203 : scheduler->Enqueue(task); 51 : } 52 3881573 : } 53 : 54 2686091 : void TaskTrigger::Reset() { 55 2686091 : trigger_ = false; 56 2686180 : }