aboutsummaryrefslogtreecommitdiff
path: root/dep/g3dlite/G3D/ThreadSet.h
diff options
context:
space:
mode:
Diffstat (limited to 'dep/g3dlite/G3D/ThreadSet.h')
-rw-r--r--dep/g3dlite/G3D/ThreadSet.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/dep/g3dlite/G3D/ThreadSet.h b/dep/g3dlite/G3D/ThreadSet.h
new file mode 100644
index 00000000000..121f1415a1d
--- /dev/null
+++ b/dep/g3dlite/G3D/ThreadSet.h
@@ -0,0 +1,87 @@
+#ifndef G3D_THREADSET_H
+#define G3D_THREADSET_H
+
+#include "G3D/platform.h"
+#include "G3D/Array.h"
+#include "G3D/ReferenceCount.h"
+#include "G3D/GThread.h"
+#include "G3D/GMutex.h"
+
+namespace G3D {
+
+/** Manages a set of threads. All methods are threadsafe except for
+ the iterator begin/end.
+
+ @beta*/
+class ThreadSet : public ReferenceCountedObject {
+public:
+ /** Intended to allow future use with a template parameter.*/
+ typedef GThread Thread;
+
+ typedef ReferenceCountedPointer<Thread> ThreadRef;
+ typedef ReferenceCountedPointer<ThreadSet> Ref;
+ typedef Array<ThreadRef>::Iterator Iterator;
+ typedef Array<ThreadRef>::ConstIterator ConstIterator;
+
+private:
+
+ /** Protects m_thread */
+ GMutex m_lock;
+
+ /** Threads in the set */
+ Array<ThreadRef> m_thread;
+
+public:
+
+ /** Total number of threads (some of which may be completed). */
+ int size() const;
+
+ /** Number of threads that have been started */
+ int numStarted() const;
+
+ /** Start all threads that are not currently started.
+
+ @param lastThreadBehavior If USE_CURRENT_THREAD, takes the last unstarted thread and executes it manually on
+ the current thread. This helps to take full advantage of the machine when
+ running a large number of jobs and avoids the overhead of a thread start for single-thread groups.
+ Note that this forces start() to block until
+ that thread is complete.
+ */
+ void start(GThread::SpawnBehavior lastThreadBehavior = GThread::USE_NEW_THREAD) const;
+
+ /** Terminate all threads that are currently started */
+ void terminate() const;
+
+ /** Waits until all started threads have completed. */
+ void waitForCompletion() const;
+
+ /** Remove all (not stopping them) */
+ void clear();
+
+ /** Removes completed threads and returns the new size.*/
+ int removeCompleted();
+
+ /** Inserts a new thread, if it is not already present, and
+ returns the new number of threads.*/
+ int insert(const ThreadRef& t);
+
+ /** Removes a thread. Returns true if the thread was present and
+ removed. */
+ bool remove(const ThreadRef& t);
+
+ bool contains(const ThreadRef& t) const;
+
+ /** It is an error to mutate the ThreadSet while iterating through it. */
+ Iterator begin();
+
+ Iterator end();
+
+ ConstIterator begin() const;
+
+ ConstIterator end() const;
+};
+
+
+} // namespace G3D
+
+#endif