diff options
author | davidxu <davidxu@FreeBSD.org> | 2009-11-18 06:10:50 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2009-11-18 06:10:50 +0000 |
commit | a40357aa8380d1cf1a30e1f219ac70cb25bac17c (patch) | |
tree | 30d86496a0fcd681fce8496fa52c74738ea72e69 /lib/librt | |
parent | 53b319698b242505834766a9cd2e859e287ac60d (diff) | |
download | FreeBSD-src-a40357aa8380d1cf1a30e1f219ac70cb25bac17c.zip FreeBSD-src-a40357aa8380d1cf1a30e1f219ac70cb25bac17c.tar.gz |
Make following functions be cancellation points:
mq_receive
mq_send
mq_timereceive
mq_timedsend
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) { |