summaryrefslogtreecommitdiffstats
path: root/lib/librt
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2009-11-18 06:10:50 +0000
committerdavidxu <davidxu@FreeBSD.org>2009-11-18 06:10:50 +0000
commita40357aa8380d1cf1a30e1f219ac70cb25bac17c (patch)
tree30d86496a0fcd681fce8496fa52c74738ea72e69 /lib/librt
parent53b319698b242505834766a9cd2e859e287ac60d (diff)
downloadFreeBSD-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.c59
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)
{
OpenPOWER on IntegriCloud