From owner-svn-src-all@FreeBSD.ORG Wed Nov 18 06:10:50 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6115D106566B; Wed, 18 Nov 2009 06:10:50 +0000 (UTC) (envelope-from davidxu@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4FC388FC0A; Wed, 18 Nov 2009 06:10:50 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id nAI6Aoi7060566; Wed, 18 Nov 2009 06:10:50 GMT (envelope-from davidxu@svn.freebsd.org) Received: (from davidxu@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nAI6AoMJ060564; Wed, 18 Nov 2009 06:10:50 GMT (envelope-from davidxu@svn.freebsd.org) Message-Id: <200911180610.nAI6AoMJ060564@svn.freebsd.org> From: David Xu Date: Wed, 18 Nov 2009 06:10:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r199475 - head/lib/librt X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Nov 2009 06:10:50 -0000 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 +#include #include #include #include @@ -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) {