mq on kqueue broken after upgrade to FreeBSD 11

Alexander Kabaev kabaev at gmail.com
Sun Oct 2 03:41:07 UTC 2016


On Sun, 2 Oct 2016 00:07:22 +0300
Konstantin Belousov <kostikbel at gmail.com> wrote:

> On Sat, Oct 01, 2016 at 10:16:55PM +0200, Jilles Tjoelker wrote:
> > The idea is good, but perhaps call the function mq_getfd_np() to
> > clarify it returns a file descriptor. Also, the __ versions should
> > not be exported since they are not used outside the library (they
> > can be exported if and when needed).  
> 
> 
> diff --git a/include/mqueue.h b/include/mqueue.h
> index 788d0a1..e1c0f27 100644
> --- a/include/mqueue.h
> +++ b/include/mqueue.h
> @@ -50,7 +50,9 @@ ssize_t	mq_timedreceive(mqd_t, char
> *__restrict, size_t, int	mq_timedsend(mqd_t, const char *,
> size_t, unsigned, const struct timespec *);
>  int	mq_unlink(const char *);
> -int	__mq_oshandle(mqd_t mqd);
> +#if __BSD_VISIBLE
> +int	mq_getfd_np(mqd_t mqd);
> +#endif /* __BSD_VISIBLE */
>  
>  __END_DECLS
>  #endif
> diff --git a/include/time.h b/include/time.h
> index 14d6044..c172538 100644
> --- a/include/time.h
> +++ b/include/time.h
> @@ -194,6 +194,7 @@ char *timezone(int, int);	/* XXX XSI
> conflict */ void tzsetwall(void);
>  time_t timelocal(struct tm * const);
>  time_t timegm(struct tm * const);
> +int timer_oshandle_np(timer_t timerid);
>  #endif /* __BSD_VISIBLE */
>  
>  #if __POSIX_VISIBLE >= 200809 || defined(_XLOCALE_H_)
> diff --git a/lib/librt/Symbol.map b/lib/librt/Symbol.map
> index 161bb76..fef3c15 100644
> --- a/lib/librt/Symbol.map
> +++ b/lib/librt/Symbol.map
> @@ -25,6 +25,11 @@ FBSD_1.0 {
>  	timer_getoverrun;
>  };
>  
> +FBSD_1.5 {
> +	mq_getfd_np;
> +	timer_oshandle_np;
> +};
> +
>  FBSDprivate_1.0 {
>  	_aio_read;
>  	_aio_write;
> diff --git a/lib/librt/mq.c b/lib/librt/mq.c
> index 750e969..513fa72 100644
> --- a/lib/librt/mq.c
> +++ b/lib/librt/mq.c
> @@ -272,8 +272,9 @@ __mq_unlink(const char *path)
>  	return __sys_kmq_unlink(path);
>  }
>  
> +#pragma weak mq_getfd_np
>  int
> -__mq_oshandle(mqd_t mqd)
> +mq_getfd_np(mqd_t mqd)
>  {
>  
>  	return (mqd->oshandle);
> diff --git a/lib/librt/timer.c b/lib/librt/timer.c
> index 90269c2..b5f775c 100644
> --- a/lib/librt/timer.c
> +++ b/lib/librt/timer.c
> @@ -175,8 +175,9 @@ __timer_settime(timer_t timerid, int flags,
>  		flags, value, ovalue);
>  }
>  
> +#pragma weak timer_oshandle_np
>  int
> -__timer_oshandle(timer_t timerid)
> +timer_oshandle_np(timer_t timerid)
>  {
>  
>  	return (timerid->oshandle);
> diff --git a/tests/sys/mqueue/Makefile b/tests/sys/mqueue/Makefile
> index ce5033c..251c497 100644
> --- a/tests/sys/mqueue/Makefile
> +++ b/tests/sys/mqueue/Makefile
> @@ -10,8 +10,8 @@ CFLAGS+=	-I${SRCTOP}/tests
>  
>  PROGS+=		mqtest1
>  PROGS+=		mqtest2
> -#PROGS+=		mqtest3
> -#PROGS+=		mqtest4
> +PROGS+=		mqtest3
> +PROGS+=		mqtest4
>  PROGS+=		mqtest5
>  
>  LIBADD+=	rt
> diff --git a/tests/sys/mqueue/mqtest3.c b/tests/sys/mqueue/mqtest3.c
> index c4b849e..3e20c4d 100644
> --- a/tests/sys/mqueue/mqtest3.c
> +++ b/tests/sys/mqueue/mqtest3.c
> @@ -62,9 +62,10 @@ main(void)
>  		buf = malloc(attr.mq_msgsize);
>  		for (j = 0; j < LOOPS; ++j) {
>  			FD_ZERO(&set);
> -			FD_SET(__mq_oshandle(mq), &set);
> +			FD_SET(mq_getfd_np(mq), &set);
>  			alarm(3);
> -			status = select(__mq_oshandle(mq)+1, &set,
> NULL, NULL, NULL);
> +			status = select(mq_getfd_np(mq) + 1, &set,
> NULL,
> +			    NULL, NULL);
>  			if (status != 1)
>  				err(1, "child process: select()");
>  			status = mq_receive(mq, buf,
> attr.mq_msgsize, &prio); @@ -94,8 +95,9 @@ main(void)
>  			}
>  			alarm(3);
>  			FD_ZERO(&set);
> -			FD_SET(__mq_oshandle(mq), &set);
> -			status = select(__mq_oshandle(mq)+1, NULL,
> &set, NULL, NULL);
> +			FD_SET(mq_getfd_np(mq), &set);
> +			status = select(mq_getfd_np(mq) + 1, NULL,
> &set,
> +			    NULL, NULL);
>  			if (status != 1)
>  				err(1, "select()");
>  			status = mq_send(mq, buf, attr.mq_msgsize,
> PRIO); diff --git a/tests/sys/mqueue/mqtest4.c
> b/tests/sys/mqueue/mqtest4.c index 474d212..b0b3952 100644
> --- a/tests/sys/mqueue/mqtest4.c
> +++ b/tests/sys/mqueue/mqtest4.c
> @@ -57,7 +57,7 @@ main(void)
>  		mq = mq_open(MQNAME, O_RDWR);
>  		if (mq == (mqd_t)-1)
>  			err(1, "child: mq_open");
> -		EV_SET(&kev, __mq_oshandle(mq), EVFILT_READ, EV_ADD,
> 0, 0, 0);
> +		EV_SET(&kev, mq_getfd_np(mq), EVFILT_READ, EV_ADD,
> 0, 0, 0); status = kevent(kq, &kev, 1, NULL, 0, NULL);
>  		if (status == -1)
>  			err(1, "child: kevent");
> @@ -89,7 +89,7 @@ main(void)
>  
>  		signal(SIGALRM, sighandler);
>  		kq = kqueue();
> -		EV_SET(&kev, __mq_oshandle(mq), EVFILT_WRITE,
> EV_ADD, 0, 0, 0);
> +		EV_SET(&kev, mq_getfd_np(mq), EVFILT_WRITE, EV_ADD,
> 0, 0, 0); status = kevent(kq, &kev, 1, NULL, 0, NULL);
>  		if (status == -1)
>  			err(1, "kevent");

This looks good to me, thank you. If there is a desire to keep old
names exported, we can provide them as compat symbols too, so that old
binaries keep working. Software built from sources is better off
adapting new names which I think are quite a bit better.

-- 
Alexander Kabaev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 949 bytes
Desc: Цифровая подпись OpenPGP
URL: <http://lists.freebsd.org/pipermail/freebsd-arch/attachments/20161001/d6b3ebe8/attachment.sig>


More information about the freebsd-arch mailing list