aboutsummaryrefslogtreecommitdiff
path: root/dep/g3dlite/include/G3D/ThreadSet.h
blob: 121f1415a1d331a29bc521c9a0bed5ea98b76bdf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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