96 lines
1.8 KiB
C++
96 lines
1.8 KiB
C++
/*
|
|
* namedLockPattern.cpp
|
|
*/
|
|
|
|
#include "referenceCountingLock.h"
|
|
|
|
namespace epics { namespace pvAccess {
|
|
|
|
using namespace epics::pvData;
|
|
|
|
ReferenceCountingLock::ReferenceCountingLock(): _references(1)
|
|
{
|
|
/* pthread_mutexattr_t mutexAttribute;
|
|
int32 retval = pthread_mutexattr_init(&mutexAttribute);
|
|
if(retval != 0)
|
|
{
|
|
//string errMsg = "Error: pthread_mutexattr_init failed: " + string(strerror(retval));
|
|
assert(false);
|
|
}
|
|
retval = pthread_mutexattr_settype(&mutexAttribute, PTHREAD_MUTEX_RECURSIVE);
|
|
if(retval == 0)
|
|
{
|
|
retval = pthread_mutex_init(&_mutex, &mutexAttribute);
|
|
if(retval != 0)
|
|
{
|
|
//string errMsg = "Error: pthread_mutex_init failed: " + string(strerror(retval));
|
|
assert(false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//string errMsg = "Error: pthread_mutexattr_settype failed: " + string(strerror(retval));
|
|
assert(false);
|
|
}
|
|
|
|
pthread_mutexattr_destroy(&mutexAttribute);*/
|
|
}
|
|
|
|
ReferenceCountingLock::~ReferenceCountingLock()
|
|
{
|
|
// pthread_mutex_destroy(&_mutex);
|
|
}
|
|
|
|
bool ReferenceCountingLock::acquire(int64 msecs)
|
|
{
|
|
_mutex.lock();
|
|
return true;
|
|
/* struct timespec deltatime;
|
|
if(msecs > 0)
|
|
{
|
|
deltatime.tv_sec = msecs / 1000;
|
|
deltatime.tv_nsec = (msecs % 1000) * 1000;
|
|
}
|
|
else
|
|
{
|
|
deltatime.tv_sec = 0;
|
|
deltatime.tv_nsec = 0;
|
|
}
|
|
|
|
int32 retval = pthread_mutex_timedlock(&_mutex, &deltatime);
|
|
if(retval == 0)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
*/
|
|
}
|
|
|
|
void ReferenceCountingLock::release()
|
|
{
|
|
_mutex.unlock();
|
|
/* int retval = pthread_mutex_unlock(&_mutex);
|
|
if(retval != 0)
|
|
{
|
|
//string errMsg = "Error: pthread_mutex_unlock failed: " + string(strerror(retval));
|
|
//TODO do something?
|
|
}*/
|
|
}
|
|
|
|
int ReferenceCountingLock::increment()
|
|
{
|
|
Lock guard(&_countMutex);
|
|
++_references;
|
|
return _references;
|
|
}
|
|
|
|
int ReferenceCountingLock::decrement()
|
|
{
|
|
Lock guard(&_countMutex);
|
|
--_references;
|
|
return _references;
|
|
}
|
|
|
|
}}
|
|
|