semaphore.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2017 TriaGnoSys GmbH
3  * 2013 Freie Universität Berlin
4  *
5  * This file is subject to the terms and conditions of the GNU Lesser
6  * General Public License v2.1. See the file LICENSE in the top level
7  * directory for more details.
8  */
9 
10 #pragma once
11 
27 #include <errno.h>
28 #include <time.h>
29 
30 #include "sema.h"
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
39 typedef sema_t sem_t;
40 
44 #define SEM_FAILED ((sem_t *) 0)
45 
67 static inline int sem_init(sem_t *sem, int pshared, unsigned value)
68 {
69  sema_create((sema_t *)sem, value);
70  (void)pshared;
71  return 0;
72 }
73 
95 static inline int sem_destroy(sem_t *sem)
96 {
97  sema_destroy((sema_t *)sem);
98  return 0;
99 }
100 
123 static inline int sem_post(sem_t *sem)
124 {
125  int res = sema_post((sema_t *)sem);
126 
127  if (res < 0) {
128  errno = -res;
129  return -1;
130  }
131  return 0;
132 }
133 
151 static inline int sem_wait(sem_t *sem)
152 {
153  int res = sema_wait((sema_t *)sem);
154 
155  if (res < 0) {
156  errno = -res;
157  return -1;
158  }
159  return 0;
160 }
161 
176 static inline sem_t *sem_open(const char *name, int oflag, ...)
177 {
178  (void)name;
179  (void)oflag;
180  errno = ENOMEM;
181  return SEM_FAILED;
182 }
183 
197 static inline int sem_close(sem_t *sem)
198 {
199  (void)sem;
200  errno = EINVAL;
201  return -1;
202 }
203 
217 static inline int sem_unlink(const char *name)
218 {
219  (void)name;
220  errno = ENOENT;
221  return -1;
222 }
223 
244 int sem_timedwait(sem_t *sem, const struct timespec *abstime);
245 
258 static inline int sem_trywait(sem_t *sem)
259 {
260  int res = sema_try_wait((sema_t *)sem);
261 
262  if (res < 0) {
263  errno = -res;
264  return -1;
265  }
266  return 0;
267 }
268 
282 static inline int sem_getvalue(sem_t *sem, int *sval)
283 {
284  if (sem != NULL) {
285  *sval = (int)sema_get_value((sema_t *)sem);
286  return 0;
287  }
288  errno = EINVAL;
289  return -1;
290 }
291 
292 #ifdef __cplusplus
293 }
294 #endif
295 
#define ENOENT
No such file or directory.
Definition: errno.h:113
#define EINVAL
Invalid argument.
Definition: errno.h:96
#define ENOMEM
Not enough space.
Definition: errno.h:117
int errno
number of last error
#define SEM_FAILED
Value returned if ‘sem_open’ failed.
Definition: semaphore.h:44
static sem_t * sem_open(const char *name, int oflag,...)
Open a named semaphore name with open flags oflag.
Definition: semaphore.h:176
static int sem_unlink(const char *name)
Remove named semaphore name.
Definition: semaphore.h:217
static int sem_getvalue(sem_t *sem, int *sval)
Get current value of sem and store it in sval.
Definition: semaphore.h:282
sema_t sem_t
POSIX-specific semaphore type.
Definition: semaphore.h:39
static int sem_init(sem_t *sem, int pshared, unsigned value)
Initialize an unnamed semaphore.
Definition: semaphore.h:67
static int sem_trywait(sem_t *sem)
Test whether sem is posted.
Definition: semaphore.h:258
int sem_timedwait(sem_t *sem, const struct timespec *abstime)
Similar to ‘sem_wait’ but wait only until abstime.
static int sem_destroy(sem_t *sem)
destroy an unnamed semaphore
Definition: semaphore.h:95
static int sem_post(sem_t *sem)
Unlock a semaphore.
Definition: semaphore.h:123
static int sem_wait(sem_t *sem)
Lock a semaphore.
Definition: semaphore.h:151
static int sem_close(sem_t *sem)
Close descriptor for named semaphore sem.
Definition: semaphore.h:197
void sema_create(sema_t *sema, unsigned int value)
Creates semaphore dynamically.
static int sema_wait(sema_t *sema)
Wait for a semaphore being posted (without timeout).
Definition: sema.h:172
void sema_destroy(sema_t *sema)
Destroys a semaphore.
static unsigned sema_get_value(const sema_t *sema)
Get a semaphore's current value.
Definition: sema.h:111
static int sema_try_wait(sema_t *sema)
Test if the semaphore is posted.
Definition: sema.h:188
int sema_post(sema_t *sema)
Signal semaphore.
Semaphore definitions.
A Semaphore.
Definition: sema.h:67