/usr/include/barry18/barry/semaphore.h is in libbarry-dev 0.18.5-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | ///
/// \file semaphore.h
/// Simple class implementing a semaphore using pthreads mutex and condvar.
///
/*
Copyright (C) 2010, RealVNC Ltd.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License in the COPYING file at the
root directory of this project for more details.
*/
#ifndef __BARRY_SEMAPHORE_H__
#define __BARRY_SEMAPHORE_H__
#include "scoped_lock.h"
#include <pthread.h>
namespace Barry {
class semaphore
{
pthread_mutex_t *m_mutex;
pthread_cond_t *m_cv;
int m_value;
public:
semaphore(pthread_mutex_t &mutex, pthread_cond_t &cv, int value = 0)
: m_mutex(&mutex)
, m_cv(&cv)
, m_value(value)
{
}
// Waits for the value of this semaphore to be greater than 0 and then
// decrements it by one before returning.
void WaitForSignal()
{
scoped_lock lock(*m_mutex);
while( m_value <= 0 ) {
int ret = pthread_cond_wait(m_cv, m_mutex);
if( ret != 0 ) {
throw Barry::Error("semaphore: failed to wait on condvar");
}
}
--m_value;
lock.unlock();
}
// Checks for a semaphore signal without blocking. Returns true and decrements
// the semaphore if the value is greater than 0, otherwise returns false.
bool ReceiveSignal()
{
bool ret = false;
scoped_lock lock(*m_mutex);
if( m_value > 0 ) {
--m_value;
ret = true;
}
lock.unlock();
return ret;
}
// Increments the value of this semaphore by 1, waking any sleeping threads waiting
// on this semaphore.
void Signal()
{
scoped_lock lock(*m_mutex);
++m_value;
int ret = pthread_cond_signal(m_cv);
if( ret != 0 ) {
throw Barry::Error("Condvar: failed to signal condvar");
}
lock.unlock();
}
};
} // namespace Barry
#endif
|