Message ID | 20200203183153.11635-6-alistair.francis@wdc.com |
---|---|
State | New |
Headers | show |
Series | Always use 32-bit time_t for certain syscalls | expand |
Hi Alistair, > Add a __rusage64 struct which always uses a 64-bit time_t. > --- > include/sys/resource.h | 110 > +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 > insertions(+) > > diff --git a/include/sys/resource.h b/include/sys/resource.h > index c55d4e63bd..9d604dfe3e 100644 > --- a/include/sys/resource.h > +++ b/include/sys/resource.h > @@ -2,6 +2,116 @@ > #include <resource/sys/resource.h> > > #ifndef _ISOMAC > +# include <time.h> > +# include <string.h> > + > +/* Internal version of rusage with a 64-bit time_t. */ > +#if __TIMESIZE == 64 > +# define __rusage64 rusage > +#else > +struct __rusage64 > + { > + struct __timeval64 ru_utime; > + struct __timeval64 ru_stime; > + __extension__ union > + { > + long int ru_maxrss; > + __syscall_slong_t __ru_maxrss_word; > + }; > + __extension__ union > + { > + long int ru_ixrss; > + __syscall_slong_t __ru_ixrss_word; > + }; > + __extension__ union > + { > + long int ru_idrss; > + __syscall_slong_t __ru_idrss_word; > + }; > + __extension__ union > + { > + long int ru_isrss; > + __syscall_slong_t __ru_isrss_word; > + }; > + __extension__ union > + { > + long int ru_minflt; > + __syscall_slong_t __ru_minflt_word; > + }; > + __extension__ union > + { > + long int ru_majflt; > + __syscall_slong_t __ru_majflt_word; > + }; > + __extension__ union > + { > + long int ru_nswap; > + __syscall_slong_t __ru_nswap_word; > + }; > + __extension__ union > + { > + long int ru_inblock; > + __syscall_slong_t __ru_inblock_word; > + }; > + __extension__ union > + { > + long int ru_oublock; > + __syscall_slong_t __ru_oublock_word; > + }; > + __extension__ union > + { > + long int ru_msgsnd; > + __syscall_slong_t __ru_msgsnd_word; > + }; > + __extension__ union > + { > + long int ru_msgrcv; > + __syscall_slong_t __ru_msgrcv_word; > + }; > + __extension__ union > + { > + long int ru_nsignals; > + __syscall_slong_t __ru_nsignals_word; > + }; > + __extension__ union > + { > + long int ru_nvcsw; > + __syscall_slong_t __ru_nvcsw_word; > + }; > + __extension__ union > + { > + long int ru_nivcsw; > + __syscall_slong_t __ru_nivcsw_word; > + }; > + }; > +#endif > + > +static inline void > +rusage64_to_rusage (const struct __rusage64 *restrict r64, > + struct rusage *restrict r) > +{ > + /* Make sure the entire output structure is cleared, including > + padding and reserved fields. */ > + memset (r, 0, sizeof *r); > + > + r->ru_utime = valid_timeval64_to_timeval (r64->ru_utime); > + r->ru_stime = valid_timeval64_to_timeval (r64->ru_stime); > + r->ru_maxrss = r64->ru_maxrss; > + r->ru_ixrss = r64->ru_ixrss; > + r->ru_idrss = r64->ru_idrss; > + r->ru_isrss = r64->ru_isrss; > + r->ru_minflt = r64->ru_minflt; > + r->ru_majflt = r64->ru_majflt; > + r->ru_nswap = r64->ru_nswap; > + r->ru_inblock = r64->ru_inblock; > + r->ru_oublock = r64->ru_oublock; > + r->ru_msgsnd = r64->ru_msgsnd; > + r->ru_msgrcv = r64->ru_msgrcv; > + r->ru_nsignals = r64->ru_nsignals; > + r->ru_nvcsw = r64->ru_nvcsw; > + r->ru_nivcsw = r64->ru_nivcsw; > +} > + > /* Prototypes repeated instead of using __typeof because > sys/resource.h is included in C++ tests, and declaring functions > with __typeof and __THROW doesn't work for C++. */ Reviewed-by: Lukasz Majewski <lukma@denx.de> Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
diff --git a/include/sys/resource.h b/include/sys/resource.h index c55d4e63bd..9d604dfe3e 100644 --- a/include/sys/resource.h +++ b/include/sys/resource.h @@ -2,6 +2,116 @@ #include <resource/sys/resource.h> #ifndef _ISOMAC +# include <time.h> +# include <string.h> + +/* Internal version of rusage with a 64-bit time_t. */ +#if __TIMESIZE == 64 +# define __rusage64 rusage +#else +struct __rusage64 + { + struct __timeval64 ru_utime; + struct __timeval64 ru_stime; + __extension__ union + { + long int ru_maxrss; + __syscall_slong_t __ru_maxrss_word; + }; + __extension__ union + { + long int ru_ixrss; + __syscall_slong_t __ru_ixrss_word; + }; + __extension__ union + { + long int ru_idrss; + __syscall_slong_t __ru_idrss_word; + }; + __extension__ union + { + long int ru_isrss; + __syscall_slong_t __ru_isrss_word; + }; + __extension__ union + { + long int ru_minflt; + __syscall_slong_t __ru_minflt_word; + }; + __extension__ union + { + long int ru_majflt; + __syscall_slong_t __ru_majflt_word; + }; + __extension__ union + { + long int ru_nswap; + __syscall_slong_t __ru_nswap_word; + }; + __extension__ union + { + long int ru_inblock; + __syscall_slong_t __ru_inblock_word; + }; + __extension__ union + { + long int ru_oublock; + __syscall_slong_t __ru_oublock_word; + }; + __extension__ union + { + long int ru_msgsnd; + __syscall_slong_t __ru_msgsnd_word; + }; + __extension__ union + { + long int ru_msgrcv; + __syscall_slong_t __ru_msgrcv_word; + }; + __extension__ union + { + long int ru_nsignals; + __syscall_slong_t __ru_nsignals_word; + }; + __extension__ union + { + long int ru_nvcsw; + __syscall_slong_t __ru_nvcsw_word; + }; + __extension__ union + { + long int ru_nivcsw; + __syscall_slong_t __ru_nivcsw_word; + }; + }; +#endif + +static inline void +rusage64_to_rusage (const struct __rusage64 *restrict r64, + struct rusage *restrict r) +{ + /* Make sure the entire output structure is cleared, including + padding and reserved fields. */ + memset (r, 0, sizeof *r); + + r->ru_utime = valid_timeval64_to_timeval (r64->ru_utime); + r->ru_stime = valid_timeval64_to_timeval (r64->ru_stime); + r->ru_maxrss = r64->ru_maxrss; + r->ru_ixrss = r64->ru_ixrss; + r->ru_idrss = r64->ru_idrss; + r->ru_isrss = r64->ru_isrss; + r->ru_minflt = r64->ru_minflt; + r->ru_majflt = r64->ru_majflt; + r->ru_nswap = r64->ru_nswap; + r->ru_inblock = r64->ru_inblock; + r->ru_oublock = r64->ru_oublock; + r->ru_msgsnd = r64->ru_msgsnd; + r->ru_msgrcv = r64->ru_msgrcv; + r->ru_nsignals = r64->ru_nsignals; + r->ru_nvcsw = r64->ru_nvcsw; + r->ru_nivcsw = r64->ru_nivcsw; +} + /* Prototypes repeated instead of using __typeof because sys/resource.h is included in C++ tests, and declaring functions with __typeof and __THROW doesn't work for C++. */