1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

queue_signalled: add support for OS X

This commit is contained in:
Steffen Vogel 2018-05-23 09:06:29 +02:00
parent cbcb0e6832
commit 8de7a8b763
2 changed files with 68 additions and 3 deletions

View file

@ -34,9 +34,11 @@ enum queue_signalled_flags {
QUEUE_SIGNALLED_POLLING = (2 << 0),
#ifdef __linux__
QUEUE_SIGNALLED_EVENTFD = (3 << 0),
#elif defined(__APPLE__)
QUEUE_SIGNALLED_PIPE = (3 << 0),
#endif
QUEUE_SIGNALLED_MASK = 0xf,
/* Other flags */
QUEUE_SIGNALLED_PROCESS_SHARED = (1 << 4)
};
@ -44,9 +46,9 @@ enum queue_signalled_flags {
/** Wrapper around queue that uses POSIX CV's for signalling writes. */
struct queue_signalled {
struct queue queue; /**< Actual underlying queue. */
enum queue_signalled_flags mode;
union {
struct {
pthread_cond_t ready; /**< Condition variable to signal writes to the queue. */
@ -54,6 +56,8 @@ struct queue_signalled {
} pthread;
#ifdef __linux__
int eventfd;
#elif defined(__APPLE__)
int pipe[2];
#endif
};
};

View file

@ -48,6 +48,11 @@ int queue_signalled_init(struct queue_signalled *qs, size_t size, struct memtype
qs->mode = QUEUE_SIGNALLED_PTHREAD;
else
qs->mode = QUEUE_SIGNALLED_EVENTFD;
#elif defined(__APPLE__)
if (flags & QUEUE_SIGNALLED_PROCESS_SHARED)
qs->mode = QUEUE_SIGNALLED_PTHREAD;
else
qs->mode = QUEUE_SIGNALLED_PIPE;
#else
qs->mode = QUEUE_SIGNALLED_PTHREAD;
#endif
@ -84,6 +89,12 @@ int queue_signalled_init(struct queue_signalled *qs, size_t size, struct memtype
if (qs->eventfd < 0)
return -2;
}
#elif defined(__APPLE__)
else if (qs->mode == QUEUE_SIGNALLED_PIPE) {
ret = pipe(qs->pipe);
if (ret < 0)
return -2;
}
#endif
else
return -1;
@ -112,6 +123,12 @@ int queue_signalled_destroy(struct queue_signalled *qs)
if (ret)
return ret;
}
#elif defined(__APPLE__)
else if (qs->mode == QUEUE_SIGNALLED_PIPE) {
ret = close(qs->pipe[0]) + close(qs->pipe[1]);
if (ret)
return ret;
}
#endif
else
return -1;
@ -143,6 +160,14 @@ int queue_signalled_push(struct queue_signalled *qs, void *ptr)
if (ret < 0)
return ret;
}
#elif defined(__APPLE__)
else if (qs->mode == QUEUE_SIGNALLED_PIPE) {
int ret;
uint8_t incr = 1;
ret = write(qs->pipe[1], &incr, sizeof(incr));
if (ret < 0)
return ret;
}
#endif
else
return -1;
@ -174,6 +199,14 @@ int queue_signalled_push_many(struct queue_signalled *qs, void *ptr[], size_t cn
if (ret < 0)
return ret;
}
#elif defined(__APPLE__)
else if (qs->mode == QUEUE_SIGNALLED_PIPE) {
int ret;
uint8_t incr = 1;
ret = write(qs->pipe[1], &incr, sizeof(incr));
if (ret < 0)
return ret;
}
#endif
else
return -1;
@ -208,6 +241,14 @@ int queue_signalled_pull(struct queue_signalled *qs, void **ptr)
if (ret < 0)
break;
}
#elif defined(__APPLE__)
else if (qs->mode == QUEUE_SIGNALLED_PIPE) {
int ret;
uint8_t incr = 1;
ret = read(qs->pipe[0], &incr, sizeof(incr));
if (ret < 0)
break;
}
#endif
else
break;
@ -249,6 +290,14 @@ int queue_signalled_pull_many(struct queue_signalled *qs, void *ptr[], size_t cn
if (ret < 0)
break;
}
#elif defined(__APPLE__)
else if (qs->mode == QUEUE_SIGNALLED_PIPE) {
int ret;
uint8_t incr = 1;
ret = read(qs->pipe[0], &incr, sizeof(incr));
if (ret < 0)
break;
}
#endif
else
break;
@ -288,6 +337,15 @@ int queue_signalled_close(struct queue_signalled *qs)
if (ret < 0)
return ret;
}
#elif defined(__APPLE__)
else if (qs->mode == QUEUE_SIGNALLED_PIPE) {
int ret;
uint64_t incr = 1;
ret = write(qs->pipe[1], &incr, sizeof(incr));
if (ret < 0)
return ret;
}
#endif
else
return -1;
@ -301,6 +359,9 @@ int queue_signalled_fd(struct queue_signalled *qs)
#ifdef __linux__
case QUEUE_SIGNALLED_EVENTFD:
return qs->eventfd;
#elif defined(__APPLE__)
case QUEUE_SIGNALLED_PIPE:
return qs->pipe[0];
#endif
default: { }
}