Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : * Copyright Contributors to the OpenSDN project 4 : */ 5 : #include <iostream> 6 : #include "base/task_trigger.h" 7 : 8 : #include "base/task.h" 9 : 10 : class TaskTrigger::WorkerTask : public Task { 11 : public: 12 1671139 : explicit WorkerTask(TaskTrigger *parent) 13 1671139 : : Task(parent->task_id_, parent->task_instance_), parent_(parent) { 14 1671119 : } 15 1867667 : bool Run() { 16 1867667 : if (parent_->disabled()) { 17 415 : parent_->Reset(); 18 415 : return true; 19 : } 20 1867232 : if (parent_->deferred()) { 21 194767 : return false; 22 : } 23 1672448 : bool done = (parent_->func_)(); 24 1672709 : if (done) { 25 1670597 : parent_->Reset(); 26 : } 27 1672834 : return done; 28 : } 29 0 : std::string Description() const { return "TaskTrigger::WorkerTask"; } 30 : 31 : private: 32 : TaskTrigger *parent_; 33 : }; 34 : 35 1765599 : TaskTrigger::TaskTrigger(const FunctionPtr& func, int task_id, int task_instance) 36 1765599 : : func_(func), task_id_(task_id), task_instance_(task_instance) { 37 1765298 : trigger_ = false; 38 1765732 : disabled_ = false; 39 1765723 : deferred_ = false; 40 1765655 : } 41 : 42 1765727 : TaskTrigger::~TaskTrigger() { 43 1765727 : assert(!trigger_); 44 1765727 : } 45 : 46 3910814 : void TaskTrigger::Set() { 47 3910814 : bool current = trigger_.exchange(true); 48 3910834 : if (!current) { 49 1671146 : WorkerTask *task = new WorkerTask(this); 50 1671116 : TaskScheduler *scheduler = TaskScheduler::GetInstance(); 51 1671111 : scheduler->Enqueue(task); 52 : } 53 3910838 : } 54 : 55 2699059 : void TaskTrigger::Reset() { 56 2699059 : trigger_ = false; 57 2699192 : }