Skip site navigation (1)Skip section navigation (2)
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>