tsem_xxx for mac
This commit is contained in:
parent
94eb0e1e71
commit
4e774660b6
|
@ -16,25 +16,81 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
int tsem_init(dispatch_semaphore_t *sem, int pshared, unsigned int value) {
|
struct tsem_s {
|
||||||
*sem = dispatch_semaphore_create(value);
|
dispatch_semaphore_t sem;
|
||||||
if (*sem == NULL) {
|
volatile unsigned int valid:1;
|
||||||
return -1;
|
};
|
||||||
} else {
|
|
||||||
|
int tsem_wait(tsem_t *sem);
|
||||||
|
int tsem_post(tsem_t *sem);
|
||||||
|
int tsem_destroy(tsem_t *sem);
|
||||||
|
int tsem_init(tsem_t *sem, int pshared, unsigned int value) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==creating\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
if (*sem) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==already initialized\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
struct tsem_s *p = (struct tsem_s*)calloc(1, sizeof(*p));
|
||||||
|
if (!p) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==out of memory\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
p->sem = dispatch_semaphore_create(value);
|
||||||
|
if (p->sem == NULL) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==not created\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
p->valid = 1;
|
||||||
|
|
||||||
|
*sem = p;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tsem_wait(tsem_t *sem) {
|
||||||
|
if (!*sem) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
struct tsem_s *p = *sem;
|
||||||
|
if (!p->valid) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
return dispatch_semaphore_wait(p->sem, DISPATCH_TIME_FOREVER);
|
||||||
|
}
|
||||||
|
|
||||||
|
int tsem_post(tsem_t *sem) {
|
||||||
|
if (!*sem) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
struct tsem_s *p = *sem;
|
||||||
|
if (!p->valid) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
return dispatch_semaphore_signal(p->sem);
|
||||||
|
}
|
||||||
|
|
||||||
|
int tsem_destroy(tsem_t *sem) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==destroying\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
if (!*sem) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==not initialized\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
struct tsem_s *p = *sem;
|
||||||
|
if (!p->valid) {
|
||||||
|
fprintf(stderr, "==%s[%d]%s():[%p]==already destroyed\n", basename(__FILE__), __LINE__, __func__, sem);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
int tsem_wait(dispatch_semaphore_t *sem) {
|
p->valid = 0;
|
||||||
dispatch_semaphore_wait(*sem, DISPATCH_TIME_FOREVER);
|
free(p);
|
||||||
|
|
||||||
|
*sem = NULL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tsem_post(dispatch_semaphore_t *sem) {
|
|
||||||
dispatch_semaphore_signal(*sem);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tsem_destroy(dispatch_semaphore_t *sem) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue