Update of /cvsroot/pure-data/externals/grill/flext/source In directory sc8-pr-cvs1:/tmp/cvs-serv14274/source
Modified Files: flext.h flprefix.h flsupport.h flthr.cpp Log Message: ""
Index: flext.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flext.h,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** flext.h 5 Aug 2003 02:32:31 -0000 1.16 --- flext.h 13 Nov 2003 03:33:09 -0000 1.17 *************** *** 45,49 **** --- 45,51 ---- #include <multiprocessing.h> #elif FLEXT_THREADS == FLEXT_THR_WIN32 + #define _WIN32_WINNT 0x500 // must be WIN2000 at least! #include <windows.h> + #include <process.h> #else #error "Thread model not supported"
Index: flprefix.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flprefix.h,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** flprefix.h 17 Sep 2003 02:32:55 -0000 1.23 --- flprefix.h 13 Nov 2003 03:33:09 -0000 1.24 *************** *** 336,341 **** #undef FLEXT_THREADS #if FLEXT_OS == FLEXT_OS_MAC && FLEXT_SYS == FLEXT_SYS_MAX ! // Max crashes with posix threads (but don't know why...) #define FLEXT_THREADS FLEXT_THR_MP #else #define FLEXT_THREADS FLEXT_THR_POSIX --- 336,344 ---- #undef FLEXT_THREADS #if FLEXT_OS == FLEXT_OS_MAC && FLEXT_SYS == FLEXT_SYS_MAX ! // Max crashes with posix threads (because it's in the CFM model) #define FLEXT_THREADS FLEXT_THR_MP + #elif FLEXT_SYS == FLEXT_SYS_MAX && FLEXT_OS == FLEXT_OS_WIN + // for wmax use native Windows threads + #define FLEXT_THREADS FLEXT_THR_WIN32 #else #define FLEXT_THREADS FLEXT_THR_POSIX
Index: flsupport.h =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flsupport.h,v retrieving revision 1.54 retrieving revision 1.55 diff -C2 -d -r1.54 -r1.55 *** flsupport.h 12 Nov 2003 03:35:19 -0000 1.54 --- flsupport.h 13 Nov 2003 03:33:09 -0000 1.55 *************** *** 637,640 **** --- 637,642 ---- #elif FLEXT_THREADS == FLEXT_THR_POSIX typedef pthread_t thrid_t; + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + typedef DWORD thrid_t; #else #error *************** *** 648,651 **** --- 650,655 ---- #elif FLEXT_THREADS == FLEXT_THR_MP return MPCurrentTaskID(); + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + return GetCurrentThreadId(); #else #error *************** *** 661,664 **** --- 665,670 ---- #if FLEXT_THREADS == FLEXT_THR_POSIX return pthread_equal(ref,t) != 0; + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + return ref == t; #else return ref == t; *************** *** 728,731 **** --- 734,738 ---- static bool StopHelper(); static void ThrHelper(void *); + static void LaunchHelper(thr_entry *e);
//! the system's thread id *************** *** 743,746 **** --- 750,755 ---- #elif FLEXT_THREADS == FLEXT_THR_MP MPYield(); + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + SwitchToThread(); #else #error *************** *** 801,804 **** --- 810,835 ---- // int cnt; }; + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + { + public: + //! Construct thread mutex + ThrMutex() { ::InitializeCriticalSection(&mutex); } + //! Destroy thread mutex + ~ThrMutex() { ::DeleteCriticalSection(&mutex); } + + //! Lock thread mutex + bool Lock() { ::EnterCriticalSection(&mutex); return true; } + /*! Wait to lock thread mutex. + \todo Implement! + */ + // bool WaitForLock(double tm) { return pthread_mutex_lock(&mutex) == 0; } + //! Try to lock, but don't wait + bool TryLock() { return ::TryEnterCriticalSection(&mutex) != 0; } + //! Unlock thread mutex + bool Unlock() { ::LeaveCriticalSection(&mutex); return true; } + + protected: + CRITICAL_SECTION mutex; + }; #elif FLEXT_THREADS == FLEXT_THR_MP { *************** *** 843,847 **** /*! Wait for condition (for a certain time). \param ftime Wait time in seconds ! \ret 0 = signalled, 1 = timed out \remark If ftime = 0 this may suck away your cpu if used in a signalled loop. \remark The time resolution of the implementation is required to be at least ms. --- 874,878 ---- /*! Wait for condition (for a certain time). \param ftime Wait time in seconds ! \ret true = signalled, false = timed out \remark If ftime = 0 this may suck away your cpu if used in a signalled loop. \remark The time resolution of the implementation is required to be at least ms. *************** *** 850,857 ****
//! Signal condition ! bool Signal();
protected: pthread_cond_t cond; }; #elif FLEXT_THREADS == FLEXT_THR_MP --- 881,913 ----
//! Signal condition ! bool Signal() { return pthread_cond_signal(&cond) == 0; }
protected: pthread_cond_t cond; + }; + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + { + public: + //! Construct thread conditional + ThrCond() { cond = CreateEvent(NULL,FALSE,FALSE,NULL); } + //! Destroy thread conditional + ~ThrCond() { CloseHandle(cond); } + + //! Wait for condition + bool Wait() { return WaitForSingleObject(cond,INFINITE) == WAIT_OBJECT_0; } + + /*! Wait for condition (for a certain time). + \param ftime Wait time in seconds + \ret true = signalled, false = timed out + \remark If ftime = 0 this may suck away your cpu if used in a signalled loop. + \remark The time resolution of the implementation is required to be at least ms. + */ + bool TimedWait(double ftime) { return WaitForSingleObject(cond,(LONG)(ftime*1000)) == WAIT_OBJECT_0; } + + //! Signal condition + bool Signal() { return SetEvent(cond) != 0; } + + protected: + HANDLE cond; }; #elif FLEXT_THREADS == FLEXT_THR_MP
Index: flthr.cpp =================================================================== RCS file: /cvsroot/pure-data/externals/grill/flext/source/flthr.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** flthr.cpp 28 Jul 2003 02:32:41 -0000 1.20 --- flthr.cpp 13 Nov 2003 03:33:09 -0000 1.21 *************** *** 49,52 **** --- 49,58 ----
+ void flext::LaunchHelper(thr_entry *e) + { + e->thrid = GetThreadId(); + e->meth(e->params); + } + //! Start helper thread bool flext::StartHelper() *************** *** 76,79 **** --- 82,87 ---- ok = ret == noErr; } + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + ok = _beginthread(ThrHelper,0,NULL) >= 0; #else #error *************** *** 101,108 **** #endif
- //! Static helper thread function void flext::ThrHelper(void *) { #if FLEXT_THREADS == FLEXT_THR_POSIX // set prototype thread attributes --- 109,117 ---- #endif
//! Static helper thread function void flext::ThrHelper(void *) { + thrhelpid = GetThreadId(); + #if FLEXT_THREADS == FLEXT_THR_POSIX // set prototype thread attributes *************** *** 140,146 **** // post("Helper start thread"); #if FLEXT_THREADS == FLEXT_THR_POSIX ! ok = pthread_create (&ti->thrid,&attr,(void *(*)(void *))ti->meth,ti->params) == 0; #elif FLEXT_THREADS == FLEXT_THR_MP ! ok = MPCreateTask((TaskProc)ti->meth,ti->params,0,0,0,0,0,&ti->thrid) == noErr; #else #error --- 149,159 ---- // post("Helper start thread"); #if FLEXT_THREADS == FLEXT_THR_POSIX ! thrid_t dummy; ! ok = pthread_create (&dummy,&attr,(void *(*)(void *))LaunchHelper,ti) == 0; #elif FLEXT_THREADS == FLEXT_THR_MP ! thrid_t dummy; ! ok = MPCreateTask((TaskProc)LaunchHelper,ti,0,0,0,0,0,&dummy) == noErr; ! #elif FLEXT_THREADS == FLEXT_THR_WIN32 ! ok = _beginthread((void (*)(void *))LaunchHelper,0,ti) >= 0; #else #error *************** *** 343,346 **** --- 356,363 ---- MPTerminateTask(t->thrid,0); // here, we should use a task queue to check whether the task has really terminated!! + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + // can't use the c library function _endthread.. memory leaks will occur + HANDLE hnd = OpenThread(THREAD_ALL_ACCESS,TRUE,t->thrid); + TerminateThread(hnd,0); #else #error *************** *** 400,403 **** --- 417,455 ---- } return true; + + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + HANDLE href = OpenThread(THREAD_ALL_ACCESS,TRUE,ref); + HANDLE hid = OpenThread(THREAD_ALL_ACCESS,TRUE,id); + int pr = GetThreadPriority(href); + + if(pr == THREAD_PRIORITY_ERROR_RETURN) { + #ifdef FLEXT_DEBUG + post("flext - failed to get thread priority"); + #endif + return false; + } + + pr += dp; + if(pr < THREAD_PRIORITY_IDLE) { + #ifdef FLEXT_DEBUG + post("flext - minimum thread priority reached"); + #endif + pr = THREAD_PRIORITY_IDLE; + } + else if(pr > THREAD_PRIORITY_TIME_CRITICAL) { + #ifdef FLEXT_DEBUG + post("flext - maximum thread priority reached"); + #endif + pr = THREAD_PRIORITY_TIME_CRITICAL; + } + + if(SetThreadPriority(hid,pr) == 0) { + #ifdef FLEXT_DEBUG + post("flext - failed to change thread priority"); + #endif + return false; + } + return true; + #elif FLEXT_THREADS == FLEXT_THR_MP thr_entry *t; *************** *** 442,445 **** --- 494,510 ---- } return parm.sched_priority; + + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + HANDLE hid = OpenThread(THREAD_ALL_ACCESS,TRUE,id); + int pr = GetThreadPriority(hid); + + if(pr == THREAD_PRIORITY_ERROR_RETURN) { + #ifdef FLEXT_DEBUG + post("flext - failed to get thread priority"); + #endif + return -1; + } + return pr; + #elif FLEXT_THREADS == FLEXT_THR_MP thr_entry *t; *************** *** 473,476 **** --- 538,552 ---- } return true; + + #elif FLEXT_THREADS == FLEXT_THR_WIN32 + HANDLE hid = OpenThread(THREAD_ALL_ACCESS,TRUE,id); + if(SetThreadPriority(hid,p) == 0) { + #ifdef FLEXT_DEBUG + post("flext - failed to change thread priority"); + #endif + return false; + } + return true; + #elif FLEXT_THREADS == FLEXT_THR_MP thr_entry *t; *************** *** 539,550 **** bool ret = pthread_cond_timedwait(&cond,&mutex,&tm) == 0; Unlock(); - return ret; - } - - bool flext::ThrCond::Signal() - { - // Lock(); - bool ret = pthread_cond_signal(&cond) == 0; - // Unlock(); return ret; } --- 615,618 ----