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 1655169 : explicit WorkerTask(TaskTrigger *parent) 12 1655169 : : Task(parent->task_id_, parent->task_instance_), parent_(parent) { 13 1655122 : } 14 1846989 : bool Run() { 15 1846989 : if (parent_->disabled()) { 16 412 : parent_->Reset(); 17 411 : return true; 18 : } 19 1846537 : if (parent_->deferred()) { 20 190167 : return false; 21 : } 22 1656342 : bool done = (parent_->func_)(); 23 1656690 : if (done) { 24 1654580 : parent_->Reset(); 25 : } 26 1656841 : return done; 27 : } 28 0 : std::string Description() const { return "TaskTrigger::WorkerTask"; } 29 : 30 : private: 31 : TaskTrigger *parent_; 32 : }; 33 : 34 1764995 : TaskTrigger::TaskTrigger(const FunctionPtr& func, int task_id, int task_instance) 35 1764995 : : func_(func), task_id_(task_id), task_instance_(task_instance) { 36 1764508 : trigger_ = false; 37 1765288 : disabled_ = false; 38 1765299 : deferred_ = false; 39 1765190 : } 40 : 41 1765369 : TaskTrigger::~TaskTrigger() { 42 1765369 : assert(!trigger_); 43 1765369 : } 44 : 45 3882092 : void TaskTrigger::Set() { 46 3882092 : bool current = trigger_.exchange(true); 47 3882136 : if (!current) { 48 1655180 : WorkerTask *task = new WorkerTask(this); 49 1655119 : TaskScheduler *scheduler = TaskScheduler::GetInstance(); 50 1655113 : scheduler->Enqueue(task); 51 : } 52 3882140 : } 53 : 54 2682960 : void TaskTrigger::Reset() { 55 2682960 : trigger_ = false; 56 2683128 : }