Date: Wed, 18 Nov 2009 06:10:50 +0000 (UTC) From: David Xu <davidxu@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r199475 - head/lib/librt Message-ID: <200911180610.nAI6AoMJ060564@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: davidxu Date: Wed Nov 18 06:10:50 2009 New Revision: 199475 URL: http://svn.freebsd.org/changeset/base/199475 Log: Make following functions be cancellation points: mq_receive mq_send mq_timereceive mq_timedsend Modified: head/lib/librt/mq.c Modified: head/lib/librt/mq.c ============================================================================== --- head/lib/librt/mq.c Wed Nov 18 05:52:09 2009 (r199474) +++ head/lib/librt/mq.c Wed Nov 18 06:10:50 2009 (r199475) @@ -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_getatt __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, } 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_ } 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, siz } 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) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911180610.nAI6AoMJ060564>