diff options
Diffstat (limited to 'src/mongo/util/concurrency/task.h')
-rw-r--r-- | src/mongo/util/concurrency/task.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/mongo/util/concurrency/task.h b/src/mongo/util/concurrency/task.h new file mode 100644 index 00000000000..d7b45eeef24 --- /dev/null +++ b/src/mongo/util/concurrency/task.h @@ -0,0 +1,72 @@ +// @file task.h + +/** +* Copyright (C) 2008 10gen Inc. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License, version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful,b +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#pragma once + +#include "../background.h" + +namespace mongo { + + namespace task { + + /** abstraction around threads. simpler than BackgroundJob which is used behind the scenes. + allocate the Task dynamically. when the thread terminates, the Task object will delete itself. + */ + class Task : private BackgroundJob { + protected: + virtual void doWork() = 0; // implement the task here. + virtual string name() const = 0; // name the threada + public: + Task(); + + /** for a repeating task, stop after current invocation ends. can be called by other threads + as long as the Task is still in scope. + */ + void halt(); + private: + unsigned n, repeat; + friend void fork(Task* t); + friend void repeat(Task* t, unsigned millis); + virtual void run(); + //virtual void ending() { } + void begin(); + }; + + /** run once */ + void fork(Task *t); + + /** run doWork() over and over, with a pause between runs of millis */ + void repeat(Task *t, unsigned millis); + + /*** Example *** + inline void sample() { + class Sample : public Task { + public: + int result; + virtual void doWork() { result = 1234; } + Sample() : result(0) { } + }; + shared_ptr<Sample> q( new Sample() ); + fork(q); + cout << q->result << endl; // could print 1234 or 0. + } + */ + + } + +} |