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 1656949 : explicit WorkerTask(TaskTrigger *parent) 12 1656949 : : Task(parent->task_id_, parent->task_instance_), parent_(parent) { 13 1656926 : } 14 1875994 : bool Run() { 15 1875994 : if (parent_->disabled()) { 16 416 : parent_->Reset(); 17 416 : return true; 18 : } 19 1875549 : if (parent_->deferred()) { 20 217255 : return false; 21 : } 22 1658276 : bool done = (parent_->func_)(); 23 1658502 : if (done) { 24 1656410 : parent_->Reset(); 25 : } 26 1658633 : return done; 27 : } 28 0 : std::string Description() const { return "TaskTrigger::WorkerTask"; } 29 : 30 : private: 31 : TaskTrigger *parent_; 32 : }; 33 : 34 1765260 : TaskTrigger::TaskTrigger(const FunctionPtr& func, int task_id, int task_instance) 35 1765260 : : func_(func), task_id_(task_id), task_instance_(task_instance) { 36 1764966 : trigger_ = false; 37 1765318 : disabled_ = false; 38 1765353 : deferred_ = false; 39 1765167 : } 40 : 41 1765363 : TaskTrigger::~TaskTrigger() { 42 1765363 : assert(!trigger_); 43 1765363 : } 44 : 45 3880590 : void TaskTrigger::Set() { 46 3880590 : bool current = trigger_.exchange(true); 47 3880610 : if (!current) { 48 1656953 : WorkerTask *task = new WorkerTask(this); 49 1656922 : TaskScheduler *scheduler = TaskScheduler::GetInstance(); 50 1656918 : scheduler->Enqueue(task); 51 : } 52 3880609 : } 53 : 54 2684787 : void TaskTrigger::Reset() { 55 2684787 : trigger_ = false; 56 2684912 : }