diff options
author | Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr> | 2017-07-06 19:31:15 +0200 |
---|---|---|
committer | Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr> | 2017-07-06 19:31:15 +0200 |
commit | 3c989fdbc1573c8230ab7b250104ce934d3e4644 (patch) | |
tree | 24c7bde2baa5da544113f680d50c5c6c1f0013ce | |
parent | b565efd17dc76a342d3c583ef7dafbe26a1b0304 (diff) | |
download | glibc-3c989fdbc1573c8230ab7b250104ce934d3e4644.tar.gz |
Y2038: implement Y2038-ready mq_timedsend, mq_timedreceive
-rw-r--r-- | rt/Makefile | 3 | ||||
-rw-r--r-- | rt/Versions | 1 | ||||
-rw-r--r-- | rt/mq_timedreceive_t64.c | 45 | ||||
-rw-r--r-- | rt/mq_timedsend_t64.c | 44 | ||||
-rw-r--r-- | rt/mqueue.h | 22 |
5 files changed, 114 insertions, 1 deletions
diff --git a/rt/Makefile b/rt/Makefile index 4713497233..a63e6bf850 100644 --- a/rt/Makefile +++ b/rt/Makefile @@ -37,7 +37,8 @@ timer-routines := timer_create timer_delete timer_getoverr \ shm-routines := shm_open shm_unlink mq-routines := mq_open mq_close mq_unlink mq_getattr mq_setattr \ mq_notify mq_send mq_receive mq_timedsend \ - mq_timedreceive + mq_timedreceive \ + mq_timedreceive_t64 mq_timedsend_t64 routines = $(clock-routines) diff --git a/rt/Versions b/rt/Versions index d14a87f192..4f6f54d24e 100644 --- a/rt/Versions +++ b/rt/Versions @@ -44,5 +44,6 @@ librt { GLIBC_Y2038 { __timer_gettime64; __timer_settime64; __timerfd_gettime64; __timerfd_settime64; + __mq_timedreceive_t64; __mq_timedsend_t64; } } diff --git a/rt/mq_timedreceive_t64.c b/rt/mq_timedreceive_t64.c new file mode 100644 index 0000000000..d24937a4ff --- /dev/null +++ b/rt/mq_timedreceive_t64.c @@ -0,0 +1,45 @@ +/* Copyright (C) 2004-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <mqueue.h> + +/* 64-bit time version */ + +extern int __y2038_linux_support; + +/* Receive the oldest from highest priority messages in message queue + MQDES, stop waiting if ABS_TIMEOUT expires. */ +ssize_t +__mq_timedreceive_t64 (mqd_t mqdes, char *__restrict msg_ptr, size_t msg_len, + unsigned int *__restrict msg_prio, + const struct timespec *__restrict abs_timeout) +{ + struct timespec ts32, *tsp32 = NULL; + if (__y2038_linux_support) + { + /* TODO: use 64-bit syscall */ + } + + if (abs_timeout) + { + ts32.tv_sec = abs_timeout->tv_sec; + ts32.tv_nsec = abs_timeout->tv_nsec; + tsp32 = &ts32; + } + return mq_timedreceive(mqdes, msg_ptr, msg_len, msg_prio, tsp32); +} diff --git a/rt/mq_timedsend_t64.c b/rt/mq_timedsend_t64.c new file mode 100644 index 0000000000..b585d99db9 --- /dev/null +++ b/rt/mq_timedsend_t64.c @@ -0,0 +1,44 @@ +/* Copyright (C) 2004-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <mqueue.h> + +/* 64-bit time version */ + +extern int __y2038_linux_support; + +/* Add message pointed by MSG_PTR to message queue MQDES, stop blocking + on full message queue if ABS_TIMEOUT expires. */ +int +__mq_timedsend_t64 (mqd_t mqdes, const char *msg_ptr, size_t msg_len, + unsigned int msg_prio, const struct __timespec64 *abs_timeout) +{ + struct timespec ts32, *tsp32 = NULL; + if (__y2038_linux_support) + { + /* TODO: use 64-bit syscall */ + } + + if (abs_timeout) + { + ts32.tv_sec = abs_timeout->tv_sec; + ts32.tv_nsec = abs_timeout->tv_nsec; + tsp32 = &ts32; + } + return mq_timedsend(mqdes, msg_ptr, msg_len, msg_prio, tsp32); +} diff --git a/rt/mqueue.h b/rt/mqueue.h index d65871e3c2..1ca165f18c 100644 --- a/rt/mqueue.h +++ b/rt/mqueue.h @@ -74,6 +74,17 @@ extern int mq_send (mqd_t __mqdes, const char *__msg_ptr, size_t __msg_len, #ifdef __USE_XOPEN2K /* Receive the oldest from highest priority messages in message queue MQDES, stop waiting if ABS_TIMEOUT expires. */ +# ifdef __USE_TIME_BITS64 +# if defined(__REDIRECT) +extern ssize_t __REDIRECT (mq_timedreceive, (mqd_t __mqdes, + char *__restrict __msg_ptr, size_t __msg_len, + unsigned int *__restrict __msg_prio, + const struct timespec *__restrict __abs_timeout), + __mq_timedreceive_t64) __nonnull((2, 5)); +# else +# define mq_timedreceive __mq_timedreceive_t64 +# endif +# endif extern ssize_t mq_timedreceive (mqd_t __mqdes, char *__restrict __msg_ptr, size_t __msg_len, unsigned int *__restrict __msg_prio, @@ -82,6 +93,17 @@ extern ssize_t mq_timedreceive (mqd_t __mqdes, char *__restrict __msg_ptr, /* Add message pointed by MSG_PTR to message queue MQDES, stop blocking on full message queue if ABS_TIMEOUT expires. */ +# ifdef __USE_TIME_BITS64 +# if defined(__REDIRECT) +extern int __REDIRECT (mq_timedsend, (mqd_t __mqdes, + const char *__msg_ptr, size_t __msg_len, + unsigned int __msg_prio, + const struct timespec *__abs_timeout), + __mq_timedsend_t64) __nonnull((2, 5)); +# else +# define mq_timedsend __mq_timedsend_t64 +# endif +# endif extern int mq_timedsend (mqd_t __mqdes, const char *__msg_ptr, size_t __msg_len, unsigned int __msg_prio, const struct timespec *__abs_timeout) |