Files
oak-editor/third_party/openfx/Support/Library/ofxsMultiThread.cpp
T

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;
}
};
};