MPQC  2.3.1
thread.h
1 //
2 // thread.h
3 //
4 // Copyright (C) 1997 Limit Point Systems, Inc.
5 //
6 // Author: Edward Seidl <seidl@janed.com>
7 // Maintainer: LPS
8 //
9 // This file is part of the SC Toolkit.
10 //
11 // The SC Toolkit is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU Library General Public License as published by
13 // the Free Software Foundation; either version 2, or (at your option)
14 // any later version.
15 //
16 // The SC Toolkit is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU Library General Public License for more details.
20 //
21 // You should have received a copy of the GNU Library General Public License
22 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
23 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24 //
25 // The U.S. Government is granted a limited license as per AL 91-7.
26 //
27 
28 #ifndef _util_group_thread_h
29 #define _util_group_thread_h
30 
31 #ifdef __GNUC__
32 #pragma interface
33 #endif
34 
35 #include <util/class/class.h>
36 
37 namespace sc {
38 
44 class ThreadLock : public RefCount {
45  public:
46  ThreadLock();
47  virtual ~ThreadLock();
48 
50  virtual void lock() =0;
52  virtual void unlock() =0;
53 };
54 
55 
61  Ref<ThreadLock> lock_;
62  bool locked_;
63  public:
65  ThreadLockHolder(const Ref<ThreadLock> &l): lock_(l) {
66  lock_->lock();
67  locked_ = true;
68  }
70  void unlock() { if (locked_) { lock_->unlock(); locked_ = false; } }
72  void lock() { if (!locked_) { lock_->lock(); locked_ = true; } }
75 };
76 
79 class Thread {
80  public:
81  Thread();
82  virtual ~Thread();
83 
84  static void *run_Thread_run(void*thread);
85 
87  virtual void run() =0;
88 };
89 
92 class ThreadGrp: public DescribedClass {
93  protected:
94  Thread** threads_;
95  int nthread_;
96 
97  public:
98  ThreadGrp();
99  ThreadGrp(const Ref<KeyVal>&);
100  ThreadGrp(const ThreadGrp&, int nthread = -1);
101  virtual ~ThreadGrp();
102 
105  virtual void add_thread(int threadnum, Thread* thread);
109  virtual void add_thread(int threadnum, Thread* thread, int priority);
111  int nthread() const { return nthread_; }
112 
113  void delete_threads();
114 
117  virtual int start_threads() =0;
120  virtual int wait_threads() =0;
122  virtual Ref<ThreadLock> new_lock() =0;
123 
128  virtual ThreadGrp* clone(int nthread = -1);
129 
130  static void set_default_threadgrp(const Ref<ThreadGrp>&);
131  static ThreadGrp * get_default_threadgrp();
132  static ThreadGrp * initial_threadgrp(int &argc, char ** argv);
133 };
134 
135 
139 class ProcThreadGrp: public ThreadGrp {
140  public:
141  ProcThreadGrp();
142  ProcThreadGrp(const Ref<KeyVal>&);
143  ~ProcThreadGrp();
144 
145  int start_threads();
146  int wait_threads();
147 
149 
150  ThreadGrp* clone(int nthread = -1);
151 };
152 
153 }
154 
155 extern "C" {
156  // a C linkage interface to run_Thread_run
157  void *Thread__run_Thread_run(void*thread);
158 }
159 
160 #endif
161 
162 // Local Variables:
163 // mode: c++
164 // c-file-style: "ETS"
165 // End:

Generated at Wed Sep 25 2013 06:53:58 for MPQC 2.3.1 using the documentation package Doxygen 1.8.3.1.