semaphore
int sem_close(sem_t* semaphore);
int sem_init(sem_t* semaphore, int shared, unsigned value);
int sem_destroy(sem_t* semaphore);
int sem_post(sem_t* semaphore);
int sem_clockwait(sem_t* semaphore, clockid_t clock_id,
int sem_timedwait(sem_t* semaphore, const struct timespec* abstime);
int sem_trywait(sem_t* semaphore);
int sem_wait(sem_t* semaphore);
int sem_getvalue(sem_t* semaphore, int* value);
int32 semaphore; /* semaphore app will wait on */
SemaphoreInfo(team_id team, sem_id semaphore,
void SetTo(team_id team, sem_id semaphore,
sem_id semaphore;
extern status_t _kern_get_sem_info(sem_id semaphore, struct sem_info *info,
Blocker(sem_id semaphore);
: semaphore(create_sem(0, "blocker")),
if (!fData || fData->semaphore < 0)
return release_sem(fData->semaphore);
Data(sem_id semaphore)
: semaphore(semaphore),
if (semaphore >= 0)
delete_sem(semaphore);
sem_id semaphore;
Blocker::Blocker(sem_id semaphore)
: fData(new(std::nothrow) Data(semaphore))
delete_sem(semaphore);
return (fData->semaphore < 0 ? fData->semaphore : B_OK);
if (!fData || fData->semaphore < 0)
status_t error = get_sem_count(fData->semaphore, &count);
error = acquire_sem_etc(fData->semaphore, count, B_RELATIVE_TIMEOUT, 0);
error = release_sem_etc(fData->semaphore, -count, 0);
if (!fData || fData->semaphore < 0)
status_t error = acquire_sem(fData->semaphore);
sem_id semaphore = -1;
semaphore = cookie->blocking_semaphore;
if (semaphore >= 0) {
"releasing blocking sem %" B_PRId32 "\n", cookie, semaphore));
release_sem(semaphore);
semaphore = create_sem(0, "IppSetupSem");
release_sem(semaphore);
release_sem(semaphore);
release_sem(semaphore);
acquire_sem(semaphore);
delete_sem(semaphore);
long semaphore;
inline SemaphoreLocker(sem_id semaphore, bool alreadyLocked = false,
fSem(semaphore)
semaphore &sem = sSemaphores[id];
static semaphore sSemaphores[kSemaphoreCount];
semaphore &sem = sSemaphores[i];
semaphore &sem = sSemaphores[id];
SemaphoreInfo::SemaphoreInfo(team_id team, sem_id semaphore,
fSemaphore(semaphore),
SemaphoreInfo::SetTo(team_id team, sem_id semaphore, const BString& name,
fSemaphore = semaphore;
fMutex.semaphore = create_sem(0, mutexName.String());
fQueue.semaphore = create_sem(0, queueName.String());
error = acquire_sem_etc(benaphore.semaphore, 1, B_ABSOLUTE_TIMEOUT,
release_sem(benaphore.semaphore);
delete_sem(fMutex.semaphore);
delete_sem(fQueue.semaphore);
MessageLooper::WaitForQuit(sem_id semaphore, bigtime_t timeout)
status = acquire_sem_etc(semaphore, 1, B_RELATIVE_TIMEOUT, timeout);
static status_t WaitForQuit(sem_id semaphore,
SemaphoreLocker(sem_id semaphore, bigtime_t timeout = B_INFINITE_TIMEOUT)
fSemaphore(semaphore)
size_t Hash(NamedSem* semaphore) const
return HashKey(semaphore->Name());
bool Compare(const KeyType& key, NamedSem* semaphore) const
return strcmp(key, semaphore->Name()) == 0;
NamedSem*& GetLink(NamedSem* semaphore) const
return semaphore->HashLink();
TeamSemInfo(SemInfo* semaphore, sem_t* userSem)
fSemaphore(semaphore),
size_t Hash(TeamSemInfo* semaphore) const
return HashKey(semaphore->ID());
bool Compare(const KeyType& key, TeamSemInfo* semaphore) const
return key == semaphore->ID();
TeamSemInfo*& GetLink(TeamSemInfo* semaphore) const
return semaphore->HashLink();
XsiSemaphore *semaphore = NULL;
semaphore = semaphoreSet->Semaphore(semaphoreNumber);
unsigned short value = semaphore->Value();
if (semaphore->Add(operation)) {
semaphore->Add(operation);
semaphore = semaphoreSet->Semaphore(semaphoreNumber);
semaphore->Revert(operation);
semaphore->Enqueue(&queueEntry, waitOnZero);
semaphore = NULL;
XsiSemaphore *semaphore = semaphoreSet->Semaphore(semaphoreNumber);
semaphore = semaphoreSet->Semaphore(semaphoreNumber);
semaphore->Revert(operation);
XsiSemaphore *semaphore = semaphoreSet->Semaphore(semaphoreNumber);
semaphore->SetPid(getpid());
XsiSemaphore *semaphore = semaphoreSet->Semaphore(semaphoreNumber);
result = semaphore->Value();
semaphore->SetValue(args.val);
result = semaphore->LastPid();
result = semaphore->ThreadsWaitingToIncrease();
result = semaphore->ThreadsWaitingToBeZero();
semaphore = semaphoreSet->Semaphore(i);
unsigned short value = semaphore->Value();
semaphore = semaphoreSet->Semaphore(i);
semaphore->SetValue(value);
sem_id semaphore = create_sem(0, "pthread once");
if (semaphore >= 0) {
value = atomic_test_and_set(control, semaphore, STATE_INITIALIZING);
value = semaphore;
delete_sem(semaphore);
sem_id semaphore = create_sem(0, "pthread once");
if (semaphore >= 0) {
semaphore, STATE_INITIALIZING);
value = semaphore;
delete_sem(semaphore);
status_t error = _kern_realtime_sem_close(semaphore->u.named_sem_id,
sem_init(sem_t* semaphore, int shared, unsigned value)
semaphore->type = shared ? SEM_TYPE_UNNAMED_SHARED : SEM_TYPE_UNNAMED;
semaphore->u.unnamed_sem = value;
sem_destroy(sem_t* semaphore)
if (semaphore->type != SEM_TYPE_UNNAMED && semaphore->type != SEM_TYPE_UNNAMED_SHARED)
unnamed_sem_post(sem_t* semaphore)
int32* sem = (int32*)&semaphore->u.unnamed_sem;
if (semaphore->type == SEM_TYPE_UNNAMED_SHARED)
unnamed_sem_trywait(sem_t* semaphore)
int32* sem = (int32*)&semaphore->u.unnamed_sem;
unnamed_sem_timedwait(sem_t* semaphore, clockid_t clock_id,
int32* sem = (int32*)&semaphore->u.unnamed_sem;
if (semaphore->type == SEM_TYPE_UNNAMED_SHARED)
int result = unnamed_sem_trywait(semaphore);
sem_post(sem_t* semaphore)
if (semaphore->type == SEM_TYPE_NAMED)
error = _kern_realtime_sem_post(semaphore->u.named_sem_id);
error = unnamed_sem_post(semaphore);
named_sem_timedwait(sem_t* semaphore, clockid_t clock_id,
status_t err = _kern_realtime_sem_wait(semaphore->u.named_sem_id,
status_t err = _kern_realtime_sem_wait(semaphore->u.named_sem_id, flags,
sem_trywait(sem_t* semaphore)
if (semaphore->type == SEM_TYPE_NAMED) {
error = _kern_realtime_sem_wait(semaphore->u.named_sem_id,
error = unnamed_sem_trywait(semaphore);
sem_wait(sem_t* semaphore)
if (semaphore->type == SEM_TYPE_NAMED)
error = named_sem_timedwait(semaphore, CLOCK_REALTIME, NULL);
error = unnamed_sem_timedwait(semaphore, CLOCK_REALTIME, NULL);
sem_clockwait(sem_t* semaphore, clockid_t clock_id, const struct timespec* abstime)
if (semaphore->type == SEM_TYPE_NAMED)
error = named_sem_timedwait(semaphore, clock_id, abstime);
error = unnamed_sem_timedwait(semaphore, clock_id, abstime);
sem_timedwait(sem_t* semaphore, const struct timespec* abstime)
return sem_clockwait(semaphore, CLOCK_REALTIME, abstime);
sem_getvalue(sem_t* semaphore, int* value)
if (semaphore->type == SEM_TYPE_NAMED) {
semaphore->u.named_sem_id, value));
*value = semaphore->u.unnamed_sem < 0 ? 0 : semaphore->u.unnamed_sem;
sem_close(sem_t* semaphore)
struct semid_ds semaphore;
memset(&semaphore, 0, sizeof(struct semid_ds));
semaphore.sem_perm.uid = getuid() + 3;
semaphore.sem_perm.gid = getgid() + 3;
semaphore.sem_perm.mode = 0666;
args.buf = &semaphore;
memset(&semaphore, 0, sizeof(struct semid_ds));
args.buf = &semaphore;