[PATCH] RTEMS: Synchronize <sys/time.h> with FreeBSD

Sebastian Huber sebastian.huber@embedded-brains.de
Tue Sep 24 05:55:00 GMT 2019


On 23/09/2019 22:06, Brian Inglis wrote:
> On 2019-09-23 04:07, Sebastian Huber wrote:
>> This change is based on the FreeBSD commit:
>>
>> Author: asomers <asomers@FreeBSD.org>
>> Date:   Mon Jul 30 15:46:40 2018 +0000
>>
>>      Make timespecadd(3) and friends public
>>
>>      The timespecadd(3) family of macros were imported from NetBSD back in
>>      r35029. However, they were initially guarded by #ifdef _KERNEL. In the
>>      meantime, we have grown at least 28 syscalls that use timespecs in some
>>      way, leading many programs both inside and outside of the base system to
>>      redefine those macros. It's better just to make the definitions public.
>>
>>      Our kernel currently defines two-argument versions of timespecadd and
>>      timespecsub.  NetBSD, OpenBSD, and FreeDesktop.org's libbsd, however, define
>>      three-argument versions.  Solaris also defines a three-argument version, but
>>      only in its kernel.  This revision changes our definition to match the
>>      common three-argument version.
>>
>>      Bump _FreeBSD_version due to the breaking KPI change.
>>
>>      Discussed with: cem, jilles, ian, bde
>>      Differential Revision:  https://reviews.freebsd.org/D14725
>> ---
>>   newlib/libc/sys/rtems/include/machine/_time.h | 42 +++++++++++++++++++++++++--
>>   1 file changed, 39 insertions(+), 3 deletions(-)
>>
>> diff --git a/newlib/libc/sys/rtems/include/machine/_time.h b/newlib/libc/sys/rtems/include/machine/_time.h
>> index 13fa14afa..24e6c7398 100644
>> --- a/newlib/libc/sys/rtems/include/machine/_time.h
>> +++ b/newlib/libc/sys/rtems/include/machine/_time.h
>> @@ -1,6 +1,9 @@
>>   /*-
>> + * SPDX-License-Identifier: BSD-3-Clause
>> + *
>> + * Copyright (c) 1982, 1986, 1993
>> + *	The Regents of the University of California.  All rights reserved.
>>    * Copyright (c) 2016 embedded brains GmbH
>> - * All rights reserved.
>>    *
>>    * Redistribution and use in source and binary forms, with or without
>>    * modification, are permitted provided that the following conditions
>> @@ -10,11 +13,14 @@
>>    * 2. Redistributions in binary form must reproduce the above copyright
>>    *    notice, this list of conditions and the following disclaimer in the
>>    *    documentation and/or other materials provided with the distribution.
>> + * 3. Neither the name of the University nor the names of its contributors
>> + *    may be used to endorse or promote products derived from this software
>> + *    without specific prior written permission.
>>    *
>> - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
>> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
>>    * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
>>    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
>> - * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
>> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
>>    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
>>    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
>>    * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
>> @@ -22,12 +28,42 @@
>>    * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
>>    * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
>>    * SUCH DAMAGE.
>> + *
>> + *	@(#)time.h	8.5 (Berkeley) 5/4/95
>> + * $FreeBSD: head/sys/sys/time.h 346176 2019-04-13 04:46:35Z imp $
>>    */
>>   
>>   #ifndef _SYS_TIME_H_
>>   #error "must be included via <sys/time.h>"
>>   #endif /* !_SYS_TIME_H_ */
>>   
>> +/* Operations on timespecs */
>> +#define	timespecclear(tvp)	((tvp)->tv_sec = (tvp)->tv_nsec = 0)
>> +#define	timespecisset(tvp)	((tvp)->tv_sec || (tvp)->tv_nsec)
>> +#define	timespeccmp(tvp, uvp, cmp)				\
>> +	(((tvp)->tv_sec == (uvp)->tv_sec) ?				\
>> +	    ((tvp)->tv_nsec cmp (uvp)->tv_nsec) :			\
>> +	    ((tvp)->tv_sec cmp (uvp)->tv_sec))
>> +
>> +#define	timespecadd(tsp, usp, vsp)				\
>> +	do {								\
>> +		(vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec;		\
>> +		(vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec;	\
>> +		if ((vsp)->tv_nsec >= 1000000000L) {			\
>> +			(vsp)->tv_sec++;				\
>> +			(vsp)->tv_nsec -= 1000000000L;			\
>> +		}							\
>> +	} while (0)
>> +#define	timespecsub(tsp, usp, vsp)				\
>> +	do {								\
>> +		(vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec;		\
>> +		(vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec;	\
>> +		if ((vsp)->tv_nsec < 0) {				\
>> +			(vsp)->tv_sec--;				\
>> +			(vsp)->tv_nsec += 1000000000L;			\
>> +		}							\
>> +	} while (0)
>> +
>>   #ifdef _KERNEL
>>   /* Header file provided outside of Newlib */
>>   #include <machine/_kernel_time.h>
> 
> It would be good to make this more generally available for Cygwin, RTEMS, and
> other systems, in a similar place to timeval, in
> newlib/libc/include/sys/_timespec.h.

No, the purpose of this file is to provide only the type definitions and 
nothing extra.

> The timeval timer... macros are already defined in
> newlib/libc/include/sys/_timeval.h under the __BSD_VISIBLE feature and #if*n*def
> _KERNEL, 

That these macros are present in <sys/_timeval.h> looks like a bug which 
I produced. In FreeBSD, the macros are defined in <sys/time.h>.

> and these timespec macros are also available under most Linux distros,
> standard on BSD.

The timespec macros above are not included in openSUSE 15.1 and the 
latest glibc Git master. On which Linux system did you see them?

> 
> The conversion macros TIMEVAL_TO_TIMESPEC and TIMESPEC_TO_TIMEVAL are already
> available in newlib/libc/include/sys/timespec.h.
> 
> All the bintime... and sbintime... facilities are already available in
> newlib/libc/include/sys/time.h guarded by __BSD_VISIBLE.
> 
> As the existing facilities require _BSD_SOURCE be defined to make these public,
> should the new additions also be guarded, or the guards removed in all cases?
> 
> As I reinvented those wheels just last week, not knowing about these facilities,
> could we please also make all the relevant BSD timeval...(3), timespec...(3),
> and bintime...(9) man pages available also, perhaps under newlib/libc/time/?

I can change the patch to add these macros to <sys/time.h> under the 
__BSD_VISIBLE guard if this is fine for everyone.

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.



More information about the Newlib mailing list