00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __UT_ThreadedAlgorithm__
00020 #define __UT_ThreadedAlgorithm__
00021
00022 #include "UT_API.h"
00023
00024 class UT_JobInfo;
00025
00026 #include "UT_Thread.h"
00027 #include "UT_Lock.h"
00028 #include "UT_Functor.h"
00029
00030 #if !defined(GAMEOS)
00031 #include <boost/tuple/tuple.hpp>
00032 #endif
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 class UT_API UT_ThreadedAlgorithm
00063 {
00064 public:
00065 UT_ThreadedAlgorithm(int maxthreads = -1);
00066 ~UT_ThreadedAlgorithm();
00067
00068
00069
00070
00071 void run(void (*threadfunc)(void *, int, int, UT_Lock &),
00072 void *userdata,
00073 UT_Lock *lock = 0);
00074
00075
00076
00077
00078
00079
00080 void run(UT_Functor1<int, const UT_JobInfo &> functor,
00081 UT_Lock *lock = 0);
00082
00083
00084
00085
00086
00087
00088 static UT_ThreadedAlgorithm *lockThreadedAlgorithm();
00089 static void releaseThreadedAlgorithm(UT_ThreadedAlgorithm *alg);
00090
00091 private:
00092 static void * algorithmStart(void *data);
00093
00094 UT_Lock *myLock;
00095 int myThreadCount;
00096 UT_Thread **myThreads;
00097
00098 static UT_ThreadedAlgorithm *ourThreadedAlgorithm;
00099 static bool ourThreadedAlgorithmInUse;
00100 static UT_Lock ourThreadedAlgorithmLock;
00101 };
00102
00103
00104
00105
00106
00107 class UT_API UT_JobInfo
00108 {
00109 public:
00110 UT_JobInfo(int jobidx, int numjobs, UT_Lock *lock)
00111 {
00112 myJob = jobidx;
00113 myNumJobs = numjobs;
00114 myLock = lock;
00115 }
00116
00117 int job() const { return myJob; }
00118 int numJobs() const { return myNumJobs; }
00119
00120
00121
00122
00123
00124 void divideWork(int units, int &start, int &end) const;
00125
00126 void lock() const
00127 {
00128 if (myLock)
00129 myLock->lockLW();
00130 }
00131 void unlock() const
00132 {
00133 if (myLock)
00134 myLock->unlock();
00135 }
00136
00137 protected:
00138 int myJob, myNumJobs;
00139 UT_Lock *myLock;
00140 };
00141
00142 class UT_API UT_AutoJobInfoLock
00143 {
00144 public:
00145 UT_AutoJobInfoLock(const UT_JobInfo &lock)
00146 : myLock(lock)
00147 { lock.lock(); }
00148
00149 ~UT_AutoJobInfoLock() { myLock.unlock(); }
00150
00151 private:
00152 const UT_JobInfo &myLock;
00153 };
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 #if defined(IA64) || defined(GAMEOS)
00221
00222 #define THREADED_METHOD_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD) \
00223 void METHOD() ISCONST \
00224 { \
00225 METHOD ## NoThread(); \
00226 } \
00227 \
00228 void METHOD ## NoThread() ISCONST \
00229 { \
00230 METHOD ## Partial(UT_JobInfo(0, 1, 0)); \
00231 }
00232
00233 #define THREADED_METHOD1_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1) \
00234 void METHOD(PARMTYPE1 PARMNAME1) ISCONST \
00235 { \
00236 METHOD ## NoThread(PARMNAME1); \
00237 } \
00238 \
00239 void METHOD ## NoThread(PARMTYPE1 PARMNAME1) ISCONST \
00240 { \
00241 METHOD ## Partial(PARMNAME1, UT_JobInfo(0, 1, 0)); \
00242 }
00243
00244 #define THREADED_METHOD2_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2) \
00245 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2) ISCONST \
00246 { \
00247 METHOD ## NoThread(PARMNAME1, PARMNAME2); \
00248 } \
00249 \
00250 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2) ISCONST \
00251 { \
00252 METHOD ## Partial(PARMNAME1, PARMNAME2, UT_JobInfo(0, 1, 0)); \
00253 }
00254
00255 #define THREADED_METHOD3_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3) \
00256 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3) ISCONST \
00257 { \
00258 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3); \
00259 } \
00260 \
00261 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3) ISCONST \
00262 { \
00263 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, UT_JobInfo(0, 1, 0)); \
00264 }
00265
00266 #define THREADED_METHOD4_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4) \
00267 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4) ISCONST \
00268 { \
00269 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4); \
00270 } \
00271 \
00272 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4) ISCONST \
00273 { \
00274 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, UT_JobInfo(0, 1, 0)); \
00275 }
00276
00277 #define THREADED_METHOD5_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5) \
00278 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5) ISCONST \
00279 { \
00280 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5); \
00281 } \
00282 \
00283 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5) ISCONST \
00284 { \
00285 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, UT_JobInfo(0, 1, 0)); \
00286 }
00287
00288 #define THREADED_METHOD6_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6) \
00289 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6) ISCONST \
00290 { \
00291 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6); \
00292 } \
00293 \
00294 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6) ISCONST \
00295 { \
00296 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, UT_JobInfo(0, 1, 0)); \
00297 }
00298
00299 #define THREADED_METHOD7_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7) \
00300 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6, PARMTYPE7 PARMNAME7) ISCONST \
00301 { \
00302 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7); \
00303 } \
00304 \
00305 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6, PARMTYPE7 PARMNAME7) ISCONST \
00306 { \
00307 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7, UT_JobInfo(0, 1, 0)); \
00308 }
00309
00310 #define THREADED_METHOD8_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8) \
00311 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6, PARMTYPE7 PARMNAME7, PARMTYPE8 PARMNAME8) ISCONST \
00312 { \
00313 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7, PARMNAME8); \
00314 } \
00315 \
00316 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6, PARMTYPE7 PARMNAME7, PARMTYPE8 PARMNAME8) ISCONST \
00317 { \
00318 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7, PARMNAME8, UT_JobInfo(0, 1, 0)); \
00319 }
00320
00321 #else
00322
00323 #define THREADED_METHOD_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD) \
00324 void METHOD() ISCONST \
00325 { \
00326 if (!(DOMULTI)) \
00327 { \
00328 METHOD ## NoThread(); \
00329 return; \
00330 } \
00331 \
00332 UT_Functor1<int, const UT_JobInfo &> functor( \
00333 this, &CLASSNAME::METHOD ## InvokePartial); \
00334 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00335 \
00336 alg ->run(functor); \
00337 \
00338 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00339 } \
00340 \
00341 void METHOD ## NoThread() ISCONST \
00342 { \
00343 METHOD ## Partial(UT_JobInfo(0, 1, 0)); \
00344 } \
00345 \
00346 int METHOD ## InvokePartial(const UT_JobInfo &info) ISCONST \
00347 { \
00348 METHOD ## Partial(info); \
00349 return 0; \
00350 }
00351
00352 #define THREADED_METHOD1_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1) \
00353 void METHOD(PARMTYPE1 PARMNAME1) ISCONST \
00354 { \
00355 if (!(DOMULTI)) \
00356 { \
00357 METHOD ## NoThread(PARMNAME1); \
00358 return; \
00359 } \
00360 \
00361 UT_Functor2<int, PARMTYPE1, const UT_JobInfo &> functor( \
00362 this, &CLASSNAME::METHOD ## InvokePartial); \
00363 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00364 \
00365 alg ->run(UT_BindFirst1(functor, PARMNAME1)); \
00366 \
00367 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00368 } \
00369 \
00370 void METHOD ## NoThread(PARMTYPE1 PARMNAME1) ISCONST \
00371 { \
00372 METHOD ## Partial(PARMNAME1, UT_JobInfo(0, 1, 0)); \
00373 } \
00374 \
00375 int METHOD ## InvokePartial(PARMTYPE1 PARMNAME1, const UT_JobInfo &info) ISCONST \
00376 { \
00377 METHOD ## Partial(PARMNAME1, info); \
00378 return 0; \
00379 }
00380
00381 #define THREADED_METHOD2_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2) \
00382 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2) ISCONST \
00383 { \
00384 if (!(DOMULTI)) \
00385 { \
00386 METHOD ## NoThread(PARMNAME1, PARMNAME2); \
00387 return; \
00388 } \
00389 \
00390 UT_Functor2<int, boost::tuple<PARMTYPE1,PARMTYPE2 >, const UT_JobInfo &> functor( \
00391 this, &CLASSNAME::METHOD ## InvokePartial); \
00392 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00393 \
00394 alg ->run(UT_BindFirst1(functor, boost::tuple<PARMTYPE1, PARMTYPE2 >(PARMNAME1,PARMNAME2))); \
00395 \
00396 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00397 } \
00398 \
00399 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2) ISCONST \
00400 { \
00401 METHOD ## Partial(PARMNAME1, PARMNAME2, UT_JobInfo(0, 1, 0)); \
00402 } \
00403 \
00404 int METHOD ## InvokePartial(boost::tuple<PARMTYPE1, PARMTYPE2 > tuple, const UT_JobInfo &info) ISCONST \
00405 { \
00406 METHOD ## Partial(boost::get<0>(tuple), boost::get<1>(tuple), info); \
00407 return 0; \
00408 }
00409
00410 #define THREADED_METHOD3_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3) \
00411 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3) ISCONST \
00412 { \
00413 if (!(DOMULTI)) \
00414 { \
00415 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3); \
00416 return; \
00417 } \
00418 \
00419 UT_Functor2<int, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3 >, const UT_JobInfo &> functor( \
00420 this, &CLASSNAME::METHOD ## InvokePartial); \
00421 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00422 \
00423 alg ->run(UT_BindFirst1(functor, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3 >(PARMNAME1, PARMNAME2, PARMNAME3))); \
00424 \
00425 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00426 } \
00427 \
00428 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3) ISCONST \
00429 { \
00430 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, UT_JobInfo(0, 1, 0)); \
00431 } \
00432 \
00433 int METHOD ## InvokePartial(boost::tuple<PARMTYPE1, PARMTYPE2, PARMTYPE3 > tuple, const UT_JobInfo &info) ISCONST \
00434 { \
00435 METHOD ## Partial(boost::get<0>(tuple), boost::get<1>(tuple), boost::get<2>(tuple), info); \
00436 return 0; \
00437 }
00438
00439 #define THREADED_METHOD4_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4) \
00440 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4) ISCONST \
00441 { \
00442 if (!(DOMULTI)) \
00443 { \
00444 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4); \
00445 return; \
00446 } \
00447 \
00448 UT_Functor2<int, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4 >, const UT_JobInfo &> functor( \
00449 this, &CLASSNAME::METHOD ## InvokePartial); \
00450 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00451 \
00452 alg ->run(UT_BindFirst1(functor, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4 >(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4))); \
00453 \
00454 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00455 } \
00456 \
00457 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4) ISCONST \
00458 { \
00459 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, UT_JobInfo(0, 1, 0)); \
00460 } \
00461 \
00462 int METHOD ## InvokePartial(boost::tuple<PARMTYPE1, PARMTYPE2, PARMTYPE3, PARMTYPE4 > tuple, const UT_JobInfo &info) ISCONST \
00463 { \
00464 METHOD ## Partial(boost::get<0>(tuple), boost::get<1>(tuple), boost::get<2>(tuple), boost::get<3>(tuple), info); \
00465 return 0; \
00466 }
00467
00468
00469 #define THREADED_METHOD5_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5) \
00470 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5) ISCONST \
00471 { \
00472 if (!(DOMULTI)) \
00473 { \
00474 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5); \
00475 return; \
00476 } \
00477 \
00478 UT_Functor2<int, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4,PARMTYPE5 >, const UT_JobInfo &> functor( \
00479 this, &CLASSNAME::METHOD ## InvokePartial); \
00480 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00481 \
00482 alg ->run(UT_BindFirst1(functor, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4,PARMTYPE5 >(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5))); \
00483 \
00484 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00485 } \
00486 \
00487 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5) ISCONST \
00488 { \
00489 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, UT_JobInfo(0, 1, 0)); \
00490 } \
00491 \
00492 int METHOD ## InvokePartial(boost::tuple<PARMTYPE1, PARMTYPE2, PARMTYPE3, PARMTYPE4, PARMTYPE5 > tuple, const UT_JobInfo &info) ISCONST \
00493 { \
00494 METHOD ## Partial(boost::get<0>(tuple), boost::get<1>(tuple), boost::get<2>(tuple), boost::get<3>(tuple), boost::get<4>(tuple), info); \
00495 return 0; \
00496 }
00497
00498
00499 #define THREADED_METHOD6_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6) \
00500 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6) ISCONST \
00501 { \
00502 if (!(DOMULTI)) \
00503 { \
00504 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6); \
00505 return; \
00506 } \
00507 \
00508 UT_Functor2<int, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4,PARMTYPE5,PARMTYPE6 >, const UT_JobInfo &> functor( \
00509 this, &CLASSNAME::METHOD ## InvokePartial); \
00510 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00511 \
00512 alg ->run(UT_BindFirst1(functor, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4,PARMTYPE5,PARMTYPE6 >(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6))); \
00513 \
00514 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00515 } \
00516 \
00517 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6) ISCONST \
00518 { \
00519 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, UT_JobInfo(0, 1, 0)); \
00520 } \
00521 \
00522 int METHOD ## InvokePartial(boost::tuple<PARMTYPE1, PARMTYPE2, PARMTYPE3, PARMTYPE4, PARMTYPE5, PARMTYPE6 > tuple, const UT_JobInfo &info) ISCONST \
00523 { \
00524 METHOD ## Partial(boost::get<0>(tuple), boost::get<1>(tuple), boost::get<2>(tuple), boost::get<3>(tuple), boost::get<4>(tuple), boost::get<5>(tuple), info); \
00525 return 0; \
00526 }
00527
00528 #define THREADED_METHOD7_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7) \
00529 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6, PARMTYPE7 PARMNAME7) ISCONST \
00530 { \
00531 if (!(DOMULTI)) \
00532 { \
00533 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7); \
00534 return; \
00535 } \
00536 \
00537 UT_Functor2<int, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4,PARMTYPE5,PARMTYPE6,PARMTYPE7 >, const UT_JobInfo &> functor( \
00538 this, &CLASSNAME::METHOD ## InvokePartial); \
00539 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00540 \
00541 alg ->run(UT_BindFirst1(functor, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4,PARMTYPE5,PARMTYPE6,PARMTYPE7 >(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7))); \
00542 \
00543 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00544 } \
00545 \
00546 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6, PARMTYPE7 PARMNAME7) ISCONST \
00547 { \
00548 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7, UT_JobInfo(0, 1, 0)); \
00549 } \
00550 \
00551 int METHOD ## InvokePartial(boost::tuple<PARMTYPE1, PARMTYPE2, PARMTYPE3, PARMTYPE4, PARMTYPE5, PARMTYPE6, PARMTYPE7 > tuple, const UT_JobInfo &info) ISCONST \
00552 { \
00553 METHOD ## Partial(boost::get<0>(tuple), boost::get<1>(tuple), boost::get<2>(tuple), boost::get<3>(tuple), boost::get<4>(tuple), boost::get<5>(tuple), boost::get<6>(tuple), info); \
00554 return 0; \
00555 }
00556
00557 #define THREADED_METHOD8_INTERNAL(ISCONST, CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8) \
00558 void METHOD(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6, PARMTYPE7 PARMNAME7, PARMTYPE8 PARMNAME8) ISCONST \
00559 { \
00560 if (!(DOMULTI)) \
00561 { \
00562 METHOD ## NoThread(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7, PARMNAME8); \
00563 return; \
00564 } \
00565 \
00566 UT_Functor2<int, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4,PARMTYPE5,PARMTYPE6,PARMTYPE7,PARMTYPE8 >, const UT_JobInfo &> functor( \
00567 this, &CLASSNAME::METHOD ## InvokePartial); \
00568 UT_ThreadedAlgorithm *alg = UT_ThreadedAlgorithm::lockThreadedAlgorithm(); \
00569 \
00570 alg ->run(UT_BindFirst1(functor, boost::tuple<PARMTYPE1,PARMTYPE2,PARMTYPE3,PARMTYPE4,PARMTYPE5,PARMTYPE6,PARMTYPE7,PARMTYPE8 >(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7, PARMNAME8))); \
00571 \
00572 UT_ThreadedAlgorithm::releaseThreadedAlgorithm(alg); \
00573 } \
00574 \
00575 void METHOD ## NoThread(PARMTYPE1 PARMNAME1, PARMTYPE2 PARMNAME2, PARMTYPE3 PARMNAME3, PARMTYPE4 PARMNAME4, PARMTYPE5 PARMNAME5, PARMTYPE6 PARMNAME6, PARMTYPE7 PARMNAME7, PARMTYPE8 PARMNAME8) ISCONST \
00576 { \
00577 METHOD ## Partial(PARMNAME1, PARMNAME2, PARMNAME3, PARMNAME4, PARMNAME5, PARMNAME6, PARMNAME7, PARMNAME8, UT_JobInfo(0, 1, 0)); \
00578 } \
00579 \
00580 int METHOD ## InvokePartial(boost::tuple<PARMTYPE1, PARMTYPE2, PARMTYPE3, PARMTYPE4, PARMTYPE5, PARMTYPE6, PARMTYPE7, PARMTYPE8 > tuple, const UT_JobInfo &info) ISCONST \
00581 { \
00582 METHOD ## Partial(boost::get<0>(tuple), boost::get<1>(tuple), boost::get<2>(tuple), boost::get<3>(tuple), boost::get<4>(tuple), boost::get<5>(tuple), boost::get<6>(tuple), boost::get<7>(tuple), info); \
00583 return 0; \
00584 }
00585
00586
00587
00588 #endif // Switch if we allow functors.
00589
00590 #define THREADED_METHOD(CLASSNAME, DOMULTI, METHOD) \
00591 THREADED_METHOD_INTERNAL( , CLASSNAME, DOMULTI, METHOD)
00592 #define THREADED_METHOD_CONST(CLASSNAME, DOMULTI, METHOD) \
00593 THREADED_METHOD_INTERNAL(const , CLASSNAME, DOMULTI, METHOD)
00594
00595 #define THREADED_METHOD1(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1) \
00596 THREADED_METHOD1_INTERNAL( , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1)
00597 #define THREADED_METHOD1_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1) \
00598 THREADED_METHOD1_INTERNAL(const , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1)
00599
00600 #define THREADED_METHOD2(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2) \
00601 THREADED_METHOD2_INTERNAL( , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2)
00602 #define THREADED_METHOD2_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2) \
00603 THREADED_METHOD2_INTERNAL(const , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2)
00604
00605 #define THREADED_METHOD3(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3) \
00606 THREADED_METHOD3_INTERNAL( , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3)
00607 #define THREADED_METHOD3_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3) \
00608 THREADED_METHOD3_INTERNAL(const , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3)
00609
00610 #define THREADED_METHOD4(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4) \
00611 THREADED_METHOD4_INTERNAL( , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4)
00612 #define THREADED_METHOD4_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4) \
00613 THREADED_METHOD4_INTERNAL(const , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4)
00614
00615 #define THREADED_METHOD5(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5) \
00616 THREADED_METHOD5_INTERNAL( , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5)
00617 #define THREADED_METHOD5_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5) \
00618 THREADED_METHOD5_INTERNAL(const , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5)
00619
00620 #define THREADED_METHOD6(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6) \
00621 THREADED_METHOD6_INTERNAL( , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6)
00622 #define THREADED_METHOD6_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6) \
00623 THREADED_METHOD6_INTERNAL(const , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6)
00624
00625 #define THREADED_METHOD7(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7) \
00626 THREADED_METHOD7_INTERNAL( , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7)
00627 #define THREADED_METHOD7_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7) \
00628 THREADED_METHOD7_INTERNAL(const , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7)
00629
00630 #define THREADED_METHOD8(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8) \
00631 THREADED_METHOD8_INTERNAL( , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8)
00632 #define THREADED_METHOD8_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8) \
00633 THREADED_METHOD8_INTERNAL(const , CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8)
00634
00635 #endif