epics mutex now used in named lock pattern

This commit is contained in:
Gasper Jansa
2011-01-09 20:15:00 +01:00
parent 8644741cfa
commit e26e05bfbf
4 changed files with 46 additions and 27 deletions

View File

@@ -8,7 +8,7 @@ namespace epics { namespace pvAccess {
ReferenceCountingLock::ReferenceCountingLock(): _references(1)
{
pthread_mutexattr_t mutexAttribute;
/* pthread_mutexattr_t mutexAttribute;
int32 retval = pthread_mutexattr_init(&mutexAttribute);
if(retval != 0)
{
@@ -31,23 +31,29 @@ ReferenceCountingLock::ReferenceCountingLock(): _references(1)
assert(false);
}
pthread_mutexattr_destroy(&mutexAttribute);
pthread_mutexattr_destroy(&mutexAttribute);*/
}
ReferenceCountingLock::~ReferenceCountingLock()
{
pthread_mutex_destroy(&_mutex);
// pthread_mutex_destroy(&_mutex);
}
bool ReferenceCountingLock::acquire(int64 msecs)
{
#ifdef darwin
// timedlock not supported by Darwin OS
return (pthread_mutex_lock(&_mutex) == 0);
#else
struct timespec deltatime;
deltatime.tv_sec = msecs / 1000;
deltatime.tv_nsec = (msecs % 1000) * 1000;
_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)
@@ -55,35 +61,32 @@ bool ReferenceCountingLock::acquire(int64 msecs)
return true;
}
return false;
#endif
*/
}
void ReferenceCountingLock::release()
{
int retval = pthread_mutex_unlock(&_mutex);
_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()
{
//TODO does it really has to be atomic?
return ++_references;
// commented because linking depends on specific version of glibc library
// on i386 target
//return __sync_add_and_fetch(&_references,1);
Lock guard(&_countMutex);
++_references;
return _references;
}
int ReferenceCountingLock::decrement()
{
//TODO does it really has to be atomic?
return --_references;
// commented because linking depends on specific version of glibc library
// on i386 target
//return __sync_sub_and_fetch(&_references,1);
Lock guard(&_countMutex);
--_references;
return _references;
}
}}