129 lines
3.6 KiB
C++
129 lines
3.6 KiB
C++
|
|
|
|
#include "ofxsSupportPrivate.h"
|
|
|
|
namespace OFX {
|
|
|
|
namespace MultiThread {
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// SMP class
|
|
|
|
/** @brief ctor */
|
|
Processor::Processor(void)
|
|
{
|
|
}
|
|
|
|
/** @brief dtor */
|
|
Processor::~Processor()
|
|
{
|
|
}
|
|
|
|
/** @brief Function to pass to the multi thread suite */
|
|
void Processor::staticMultiThreadFunction(unsigned int threadIndex, unsigned int threadMax, void *customArg)
|
|
{
|
|
// cast the custom arg to one of me
|
|
Processor *me = (Processor *) customArg;
|
|
|
|
// and call my thread function
|
|
me->multiThreadFunction(threadIndex, threadMax);
|
|
}
|
|
|
|
/** @brief Function to pass to the multi thread suite */
|
|
void Processor::multiThread(unsigned int nCPUs)
|
|
{
|
|
// if 0, use all the CPUs we can
|
|
if(nCPUs == 0)
|
|
nCPUs = OFX::MultiThread::getNumCPUs();
|
|
|
|
// if 1 cpu, don't bother with the threading
|
|
if(nCPUs == 1) {
|
|
multiThreadFunction(0, 1);
|
|
}
|
|
else {
|
|
// OK do it
|
|
OfxStatus stat = kOfxStatFailed;
|
|
if(OFX::Private::gThreadSuite){
|
|
stat = OFX::Private::gThreadSuite->multiThread(staticMultiThreadFunction, nCPUs, (void *)this);
|
|
}
|
|
|
|
// did we do it?
|
|
throwSuiteStatusException(stat);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// futility functions
|
|
|
|
/** @brief Has the current thread been spawned from an MP */
|
|
bool isSpawnedThread(void)
|
|
{
|
|
if(OFX::Private::gThreadSuite){
|
|
int v = OFX::Private::gThreadSuite->multiThreadIsSpawnedThread();
|
|
return v != 0;
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/** @brief The number of CPUs that can be used for MP-ing */
|
|
unsigned int getNumCPUs(void)
|
|
{
|
|
unsigned int n = 1;
|
|
OfxStatus stat = OFX::Private::gThreadSuite ? OFX::Private::gThreadSuite->multiThreadNumCPUs(&n) : kOfxStatFailed;
|
|
|
|
if(stat != kOfxStatOK) n = 1;
|
|
return n;
|
|
}
|
|
|
|
/** @brief The index of the current thread. From 0 to numCPUs() - 1 */
|
|
unsigned int getThreadIndex(void)
|
|
{
|
|
unsigned int n = 0;
|
|
OfxStatus stat = OFX::Private::gThreadSuite ? OFX::Private::gThreadSuite->multiThreadIndex(&n) : kOfxStatFailed;
|
|
if(stat != kOfxStatOK) n = 0;
|
|
return n;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// MUTEX class
|
|
|
|
/** @brief ctor */
|
|
Mutex::Mutex(int lockCount)
|
|
: _handle(0)
|
|
{
|
|
OfxStatus stat = OFX::Private::gThreadSuite ? OFX::Private::gThreadSuite->mutexCreate(&_handle, lockCount) : kOfxStatReplyDefault;
|
|
throwSuiteStatusException(stat);
|
|
}
|
|
|
|
/** @brief dtor */
|
|
Mutex::~Mutex(void)
|
|
{
|
|
OfxStatus stat = OFX::Private::gThreadSuite ? OFX::Private::gThreadSuite->mutexDestroy(_handle) : kOfxStatReplyDefault;
|
|
(void)stat;
|
|
}
|
|
|
|
/** @brief lock it, blocks until lock is gained */
|
|
void Mutex::lock()
|
|
{
|
|
OfxStatus stat = OFX::Private::gThreadSuite ? OFX::Private::gThreadSuite->mutexLock(_handle) : kOfxStatReplyDefault;
|
|
throwSuiteStatusException(stat);
|
|
}
|
|
|
|
/** @brief unlock it */
|
|
void Mutex::unlock()
|
|
{
|
|
OfxStatus stat = OFX::Private::gThreadSuite ? OFX::Private::gThreadSuite->mutexUnLock(_handle) : kOfxStatReplyDefault;
|
|
throwSuiteStatusException(stat);
|
|
}
|
|
|
|
/** @brief attempt to lock, non-blocking */
|
|
bool Mutex::tryLock()
|
|
{
|
|
OfxStatus stat = OFX::Private::gThreadSuite ? OFX::Private::gThreadSuite->mutexTryLock(_handle) : kOfxStatReplyDefault;
|
|
return stat == kOfxStatOK;
|
|
}
|
|
|
|
};
|
|
};
|