diff options
Diffstat (limited to 'lib/librt')
-rw-r--r-- | lib/librt/mq.c | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/lib/librt/mq.c b/lib/librt/mq.c index 9bdb503..f2e01ca 100644 --- a/lib/librt/mq.c +++ b/lib/librt/mq.c @@ -33,6 +33,7 @@ #include "namespace.h" #include <errno.h> +#include <pthread.h> #include <stddef.h> #include <stdlib.h> #include <signal.h> @@ -66,15 +67,15 @@ __weak_reference(__mq_getattr, mq_getattr); __weak_reference(__mq_getattr, _mq_getattr); __weak_reference(__mq_setattr, mq_setattr); __weak_reference(__mq_setattr, _mq_setattr); -__weak_reference(__mq_timedreceive, mq_timedreceive); +__weak_reference(__mq_timedreceive_cancel, mq_timedreceive); __weak_reference(__mq_timedreceive, _mq_timedreceive); -__weak_reference(__mq_timedsend, mq_timedsend); +__weak_reference(__mq_timedsend_cancel, mq_timedsend); __weak_reference(__mq_timedsend, _mq_timedsend); __weak_reference(__mq_unlink, mq_unlink); __weak_reference(__mq_unlink, _mq_unlink); -__weak_reference(__mq_send, mq_send); +__weak_reference(__mq_send_cancel, mq_send); __weak_reference(__mq_send, _mq_send); -__weak_reference(__mq_receive, mq_receive); +__weak_reference(__mq_receive_cancel, mq_receive); __weak_reference(__mq_receive, _mq_receive); mqd_t @@ -196,6 +197,19 @@ __mq_timedreceive(mqd_t mqd, char *buf, size_t len, } ssize_t +__mq_timedreceive_cancel(mqd_t mqd, char *buf, size_t len, + unsigned *prio, const struct timespec *timeout) +{ + int oldtype; + int ret; + + _pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); + ret = __sys_kmq_timedreceive(mqd->oshandle, buf, len, prio, timeout); + _pthread_setcanceltype(oldtype, NULL); + return (ret); +} + +ssize_t __mq_receive(mqd_t mqd, char *buf, size_t len, unsigned *prio) { @@ -203,6 +217,17 @@ __mq_receive(mqd_t mqd, char *buf, size_t len, unsigned *prio) } ssize_t +__mq_receive_cancel(mqd_t mqd, char *buf, size_t len, unsigned *prio) +{ + int oldtype; + int ret; + + _pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); + ret = __sys_kmq_timedreceive(mqd->oshandle, buf, len, prio, NULL); + _pthread_setcanceltype(oldtype, NULL); + return (ret); +} +ssize_t __mq_timedsend(mqd_t mqd, char *buf, size_t len, unsigned prio, const struct timespec *timeout) { @@ -211,12 +236,38 @@ __mq_timedsend(mqd_t mqd, char *buf, size_t len, } ssize_t +__mq_timedsend_cancel(mqd_t mqd, char *buf, size_t len, + unsigned prio, const struct timespec *timeout) +{ + int oldtype; + int ret; + + _pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); + ret = __sys_kmq_timedsend(mqd->oshandle, buf, len, prio, timeout); + _pthread_setcanceltype(oldtype, NULL); + return (ret); +} + +ssize_t __mq_send(mqd_t mqd, char *buf, size_t len, unsigned prio) { return __sys_kmq_timedsend(mqd->oshandle, buf, len, prio, NULL); } + +ssize_t +__mq_send_cancel(mqd_t mqd, char *buf, size_t len, unsigned prio) +{ + int oldtype; + int ret; + + _pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); + ret = __sys_kmq_timedsend(mqd->oshandle, buf, len, prio, NULL); + _pthread_setcanceltype(oldtype, NULL); + return (ret); +} + int __mq_unlink(const char *path) { |