LightWrap++
AC++wrapperfortheLightWave3DSDK
threads.h
Go to the documentation of this file.
1 
5 #ifndef LWPP_THREADS_H
6 #define LWPP_THREADS_H
7 
8 #include "lwmtutil.h"
9 #include "lwpp/global.h"
10 
11 namespace lwpp
12 {
13 
16 
18  class MTUtilBase : public GlobalBase<LWMTUtilFuncs>
19  {
20  public:
21  MTUtilBase(void) { ; }
22  virtual ~MTUtilBase() {;}
23  virtual int Lock (const MutexID mutex) const = 0;
24  virtual int UnLock (const MutexID mutex) const = 0;
25  };
26 
27  class LWMTUtil_Pre9 : public MTUtilBase
28  {
29  private:
30  LWMTUtilID id;
31  public:
32  LWMTUtil_Pre9(void) : id(0)
33  {
34  id = globPtr->create();
35  }
36  virtual ~LWMTUtil_Pre9()
37  {
38  if (id) globPtr->destroy(id);
39  }
40  virtual int Lock (const MutexID mutex) const
41  {
42  return globPtr->lock(id, mutex);
43  }
44  virtual int UnLock (const MutexID mutex) const
45  {
46  return globPtr->unlock(id, mutex);
47  }
48  };
49 
51  class LWMTUtil9 : public MTUtilBase
52  {
53  private:
54  LWMTGroupID mtgroup;
55  public:
56  LWMTUtil9(void) : mtgroup(0)
57  {
58  mtgroup = globPtr->groupCreate(1);
59  }
60  virtual ~LWMTUtil9()
61  {
62  if (mtgroup) globPtr->groupDestroy(mtgroup);
63  }
64  virtual int Lock (const MutexID mutex) const
65  {
66  return globPtr->groupLockMutex(mtgroup, mutex);
67  }
68  virtual int UnLock (const MutexID mutex) const
69  {
70  return globPtr->groupUnlockMutex(mtgroup, mutex);
71  }
72  };
73 
76  class LWMTUtil
77  {
78  private:
79  MTUtilBase *MTUtil;
80  public:
81  LWMTUtil() : MTUtil(0)
82  {
83  if (lwpp::LightWave::Major() > 8)
84  MTUtil = new LWMTUtil9;
85  else
86  MTUtil = new LWMTUtil_Pre9;
87  }
88  virtual ~LWMTUtil()
89  {
90  if (MTUtil) delete MTUtil;
91  }
92  virtual int Lock (const MutexID mutex) const
93  {
94  return MTUtil->Lock(mutex);
95  }
96  virtual int UnLock (const MutexID mutex) const
97  {
98  return MTUtil->UnLock(mutex);
99  }
100  };
101 
104  class AutoMutex {
105  MutexID id;
106  LWMTUtil *mt_util;
107  public:
109 
113  AutoMutex(LWMTUtil *u, const MutexID m) :
114  mt_util(u),
115  id(m)
116  {
117  mt_util->Lock(id);
118  }
119  AutoMutex(LWMTUtil *u, int m) :
120  mt_util(u),
121  id((MutexID)m)
122  {
123  mt_util->Lock(id);
124  }
126  virtual ~AutoMutex()
127  {
128  mt_util->UnLock(id);
129  }
130  };
131 
132  //typedef int (*LWMTThreadFunc)(void *arg);
134  class ThreadUtils : public GlobalBase<LWMTUtilFuncs>
135  {
136  public:
137  LWMTThreadID getID()
138  {
139  return globPtr->threadGetID();
140  }
141 
142  void setData(void* ptr)
143  {
144  globPtr->threadSetData(ptr);
145  }
146 
147  void* getData()
148  {
149  return globPtr->threadGetData();
150  }
151 
152  void* getArg()
153  {
154  return globPtr->threadGetArg();
155  }
156 
157  void* getArgByID(LWMTThreadID thrdid)
158  {
159  return globPtr->threadGetArgByID(thrdid);
160  }
161 
162  int getIndex()
163  {
164  return globPtr->threadGetIndex();
165  }
166 
167  int getIndexByID(LWMTThreadID thrdid)
168  {
169  return globPtr->threadGetIndexByID(thrdid);
170  }
171 
172  int getThreadCount(LWMTThreadID thrdid)
173  {
174  return globPtr->threadGetThreadCount(thrdid);
175  }
176 
177  LWMTGroupID getGroupID(LWMTThreadID thrdid)
178  {
179  return globPtr->threadGetGroupID(thrdid);
180  }
181 
182  int checkAbort(void)
183  {
184  return globPtr->threadCheckAbort();
185  }
186 
187  int checkAbortByID(LWMTThreadID thrdid)
188  {
189  return globPtr->threadCheckAbortByID(thrdid);
190  }
191 
192  void sleep(int delay)
193  {
194  globPtr->threadSleep(delay);
195  }
196  void setArg(void* ptr)
197  {
198  globPtr->threadSetArg(ptr);
199  }
200  void setIndex(int in_index)
201  {
202  globPtr->threadSetIndex(in_index);
203  }
204  };
205 
207 
215  class Thread : public GlobalBase<LWMTUtilFuncs>
216  {
217  protected:
219  LWMTThreadID getID()
220  {
221  return globPtr->threadGetID();
222  }
224  void setData(void* ptr)
225  {
226  globPtr->threadSetData(ptr);
227  }
229  void* getData()
230  {
231  return globPtr->threadGetData();
232  }
234  int getIndex()
235  {
236  return globPtr->threadGetIndex();
237  }
239  LWMTGroupID getGroupID()
240  {
241  return globPtr->threadGetGroupID(getID());
242  }
243 
245 
249  bool checkAbort(void)
250  {
251  return (globPtr->threadCheckAbort() != 0);
252  }
254 
257  void sleep(int delay)
258  {
259  globPtr->threadSleep(delay);
260  }
262  virtual int Run() = 0;
263  public:
264  static int LWMTThreadFunc(void *arg)
265  {
266  Thread *func = static_cast<Thread *>(arg);
267  return func->Run();
268  }
269  };
270 
286  class ThreadGroup : public GlobalBase<LWMTUtilFuncs>
287  {
288  LWMTGroupID mtgrpid;
289  public:
294  ThreadGroup(int _count)
295  : mtgrpid(0)
296  {
297  mtgrpid = globPtr->groupCreate(_count);
298  }
299 
301 
305  {
306  if (mtgrpid)
307  globPtr->groupDestroy(mtgrpid);
308  mtgrpid = 0;
309  }
311 
315  int lockMutex(int mutexID)
316  {
317  if (mtgrpid)
318  return globPtr->groupLockMutex(mtgrpid, mutexID);
319  return 0;
320  }
322  int unlockMutex(int mutexID)
323  {
324  if (mtgrpid)
325  return globPtr->groupUnlockMutex(mtgrpid, mutexID);
326  return 0;
327  }
329 
342  LWMTThreadID addThread(LWMTThreadFunc func, int size, void *arg)
343  {
344  if (mtgrpid)
345  {
346  return globPtr->groupAddThread(mtgrpid, func, size, arg);
347  }
348  return 0;
349  }
350  LWMTThreadID addThread(Thread *func)
351  {
352  return addThread(Thread::LWMTThreadFunc, 0, func);
353  }
355  LWMTThreadID getThreadID(int in_index)
356  {
357  if (mtgrpid)
358  {
359  return globPtr->groupGetThreadID(mtgrpid,in_index);
360  }
361  return 0;
362  }
365  {
366  if (mtgrpid)
367  {
368  return globPtr->groupGetThreadCount(mtgrpid);
369  }
370  return 0;
371  }
373 
377  bool run()
378  {
379  if (mtgrpid)
380  {
381  return (globPtr->groupRun(mtgrpid) != 0);
382  }
383  return false;
384  }
386 
390  bool begin()
391  {
392  if (mtgrpid)
393  {
394  return (globPtr->groupBegin(mtgrpid) != 0);
395  }
396  return false;
397  }
399 
402  void sync()
403  {
404  if (mtgrpid)
405  {
406  globPtr->groupSync(mtgrpid);
407  }
408  }
410 
413  void abort()
414  {
415  if (mtgrpid)
416  {
417  globPtr->groupAbort(mtgrpid);
418  }
419  }
421 
424  void kill()
425  {
426  if (mtgrpid)
427  {
428  globPtr->groupKill(mtgrpid);
429  }
430  }
431 
433  bool isDone()
434  {
435  if (mtgrpid)
436  {
437  return (globPtr->groupIsDone(mtgrpid) != 0);
438  }
439  return true;
440  }
441 
443  bool isAborted()
444  {
445  if (mtgrpid)
446  {
447  return (globPtr->groupIsAborted(mtgrpid) != 0);
448  }
449  return true;
450  }
451 
453  int threadResult(int in_index)
454  {
455  if (mtgrpid)
456  {
457  return globPtr->groupThreadResult(mtgrpid, in_index);
458  }
459  return 0;
460  }
461  };
462 }
463 
464 #endif // LWPP_THREADS_H