Export the mq_getfd_np() symbol from librt.so, which allows to get

file descriptor for the given posix mqueue.  Export the
timer_oshandle_np() symbol to get ktimer id for the given posix timer.

Requested by:	Lewis Donzis <lew@perftech.com>
Reviewed by:	jilles
Discussed with:	kan
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2016-10-02 17:02:59 +00:00
parent a7d1d41617
commit ddce1c3ddb
8 changed files with 23 additions and 11 deletions

View File

@ -50,7 +50,9 @@ ssize_t mq_timedreceive(mqd_t, char *__restrict, size_t,
int mq_timedsend(mqd_t, const char *, size_t, unsigned, int mq_timedsend(mqd_t, const char *, size_t, unsigned,
const struct timespec *); const struct timespec *);
int mq_unlink(const char *); 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 __END_DECLS
#endif #endif

View File

@ -194,6 +194,7 @@ char *timezone(int, int); /* XXX XSI conflict */
void tzsetwall(void); void tzsetwall(void);
time_t timelocal(struct tm * const); time_t timelocal(struct tm * const);
time_t timegm(struct tm * const); time_t timegm(struct tm * const);
int timer_oshandle_np(timer_t timerid);
#endif /* __BSD_VISIBLE */ #endif /* __BSD_VISIBLE */
#if __POSIX_VISIBLE >= 200809 || defined(_XLOCALE_H_) #if __POSIX_VISIBLE >= 200809 || defined(_XLOCALE_H_)

View File

@ -25,6 +25,11 @@ FBSD_1.0 {
timer_getoverrun; timer_getoverrun;
}; };
FBSD_1.5 {
mq_getfd_np;
timer_oshandle_np;
};
FBSDprivate_1.0 { FBSDprivate_1.0 {
_aio_read; _aio_read;
_aio_write; _aio_write;

View File

@ -272,8 +272,9 @@ __mq_unlink(const char *path)
return __sys_kmq_unlink(path); return __sys_kmq_unlink(path);
} }
#pragma weak mq_getfd_np
int int
__mq_oshandle(mqd_t mqd) mq_getfd_np(mqd_t mqd)
{ {
return (mqd->oshandle); return (mqd->oshandle);

View File

@ -175,8 +175,9 @@ __timer_settime(timer_t timerid, int flags,
flags, value, ovalue); flags, value, ovalue);
} }
#pragma weak timer_oshandle_np
int int
__timer_oshandle(timer_t timerid) timer_oshandle_np(timer_t timerid)
{ {
return (timerid->oshandle); return (timerid->oshandle);

View File

@ -10,8 +10,8 @@ CFLAGS+= -I${SRCTOP}/tests
PROGS+= mqtest1 PROGS+= mqtest1
PROGS+= mqtest2 PROGS+= mqtest2
#PROGS+= mqtest3 PROGS+= mqtest3
#PROGS+= mqtest4 PROGS+= mqtest4
PROGS+= mqtest5 PROGS+= mqtest5
LIBADD+= rt LIBADD+= rt

View File

@ -62,9 +62,10 @@ main(void)
buf = malloc(attr.mq_msgsize); buf = malloc(attr.mq_msgsize);
for (j = 0; j < LOOPS; ++j) { for (j = 0; j < LOOPS; ++j) {
FD_ZERO(&set); FD_ZERO(&set);
FD_SET(__mq_oshandle(mq), &set); FD_SET(mq_getfd_np(mq), &set);
alarm(3); 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) if (status != 1)
err(1, "child process: select()"); err(1, "child process: select()");
status = mq_receive(mq, buf, attr.mq_msgsize, &prio); status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
@ -94,8 +95,9 @@ main(void)
} }
alarm(3); alarm(3);
FD_ZERO(&set); FD_ZERO(&set);
FD_SET(__mq_oshandle(mq), &set); FD_SET(mq_getfd_np(mq), &set);
status = select(__mq_oshandle(mq)+1, NULL, &set, NULL, NULL); status = select(mq_getfd_np(mq) + 1, NULL, &set,
NULL, NULL);
if (status != 1) if (status != 1)
err(1, "select()"); err(1, "select()");
status = mq_send(mq, buf, attr.mq_msgsize, PRIO); status = mq_send(mq, buf, attr.mq_msgsize, PRIO);

View File

@ -57,7 +57,7 @@ main(void)
mq = mq_open(MQNAME, O_RDWR); mq = mq_open(MQNAME, O_RDWR);
if (mq == (mqd_t)-1) if (mq == (mqd_t)-1)
err(1, "child: mq_open"); 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); status = kevent(kq, &kev, 1, NULL, 0, NULL);
if (status == -1) if (status == -1)
err(1, "child: kevent"); err(1, "child: kevent");
@ -89,7 +89,7 @@ main(void)
signal(SIGALRM, sighandler); signal(SIGALRM, sighandler);
kq = kqueue(); 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); status = kevent(kq, &kev, 1, NULL, 0, NULL);
if (status == -1) if (status == -1)
err(1, "kevent"); err(1, "kevent");