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 1649356 : explicit WorkerTask(TaskTrigger *parent) 12 1649356 : : Task(parent->task_id_, parent->task_instance_), parent_(parent) { 13 1649318 : } 14 1805891 : bool Run() { 15 1805891 : if (parent_->disabled()) { 16 415 : parent_->Reset(); 17 415 : return true; 18 : } 19 1805451 : if (parent_->deferred()) { 20 154916 : return false; 21 : } 22 1650515 : bool done = (parent_->func_)(); 23 1650883 : if (done) { 24 1648773 : parent_->Reset(); 25 : } 26 1651033 : return done; 27 : } 28 0 : std::string Description() const { return "TaskTrigger::WorkerTask"; } 29 : 30 : private: 31 : TaskTrigger *parent_; 32 : }; 33 : 34 1764675 : TaskTrigger::TaskTrigger(const FunctionPtr& func, int task_id, int task_instance) 35 1764675 : : func_(func), task_id_(task_id), task_instance_(task_instance) { 36 1764265 : trigger_ = false; 37 1764855 : disabled_ = false; 38 1764856 : deferred_ = false; 39 1764790 : } 40 : 41 1764927 : TaskTrigger::~TaskTrigger() { 42 1764927 : assert(!trigger_); 43 1764927 : } 44 : 45 3867571 : void TaskTrigger::Set() { 46 3867571 : bool current = trigger_.exchange(true); 47 3867629 : if (!current) { 48 1649369 : WorkerTask *task = new WorkerTask(this); 49 1649312 : TaskScheduler *scheduler = TaskScheduler::GetInstance(); 50 1649302 : scheduler->Enqueue(task); 51 : } 52 3867636 : } 53 : 54 2677117 : void TaskTrigger::Reset() { 55 2677117 : trigger_ = false; 56 2677283 : }