Le Thu, Oct 14, 2021 at 05:54:44PM -0400, [email protected] a écrit :
> Quoth [email protected]:
> > But is clock_gettime(2) available in APE in any instance of Plan9 or is
> > there a routine achieving the same purpose?
>
> Here's a quick sketch of something that we could add; note
> that the implemented monotonicity is really crude.
>
> diff 03d870e0283299404b0eb46689d13f8538e83a2f uncommitted
> --- a//sys/include/ape/time.h
> +++ b//sys/include/ape/time.h
> @@ -53,15 +53,20 @@
> #ifdef _POSIX_SOURCE
> extern void tzset(void);
>
> +#define CLOCK_REALTIME 1
> +#define CLOCK_MONOTONIC 2
> +
> +typedef int clockid_t;
> +
> struct timespec {
> time_t tv_sec;
> long tv_nsec;
> };
> extern int nanosleep(const struct timespec *req, struct timespec *rem);
> -#endif
>
> -#ifdef __cplusplus
> -}
> +extern int clock_getres(clockid_t, struct timespec*);
> +extern int clock_gettime(clockid_t, struct timespec*);
> +extern int clock_settime(clockid_t, struct timespec*);
> #endif
>
> #ifdef _POSIX_SOURCE
> @@ -69,6 +74,10 @@
> extern long timezone;
> extern long altzone;
> extern int daylight;
> +#endif
> +
> +#ifdef __cplusplus
> +}
> #endif
>
> #endif /* __TIME_H */
> --- /tmp/diff100001791256
> +++ b/sys/src/ape/lib/bsd/clock.c
> @@ -1,0 +1,60 @@
> +#include <sys/types.h>
> +#include <time.h>
> +#include <errno.h>
> +#include <lock.h>
> +
> +/* ap/plan9/9nsec.c */
> +extern long long _NSEC(void);
> +
> +#define Ns2sec (1000*1000*1000)
> +
> +int
> +clock_getres(clockid_t id, struct timespec *ts)
> +{
> + if(id != CLOCK_REALTIME && id != CLOCK_MONOTONIC){
> + errno = EINVAL;
> + return -1;
> + }
> + ts->tv_sec = 0;
> + ts->tv_nsec = 1;
> + return 0;
> +}
> +
> +int
> +clock_settime(clockid_t, struct timespec *)
> +{
> + errno = EPERM;
> + return -1;
> +}
> +
> +int
> +clock_gettime(clockid_t clk, struct timespec *ts)
> +{
> + static Lock maxlk;
> + static long long max;
> + long long t;
> +
> + t = _NSEC();
> + switch(clk){
> + case CLOCK_REALTIME:
> + /* nothing */
> + break;
> + case CLOCK_MONOTONIC:
> + /* Bug: we should support a real monotonic clock */
> + lock(&maxlk);
> + if(t < max)
> + t = max;
> + else
> + max = t;
> + unlock(&maxlk);
> + break;
> + default:
> + errno = EINVAL;
> + return -1;
> + }
> +
> + ts->tv_sec = t/Ns2sec;
> + ts->tv_nsec = t%Ns2sec;
> +
> + return 0;
> +}
Since only CLOCK_REALTIME is mandatory (up to current POSIX 7), you could drop
the MONOTONIC
variant. And nsec(2) is good enough for REALTIME.
Thanks for working on this!
Best,
--
Thierry Laronde <tlaronde +AT+ polynum +dot+ com>
http://www.kergis.com/
http://kertex.kergis.com/
http://www.sbfa.fr/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89 250D 52B1 AE95 6006 F40C
------------------------------------------
9fans: 9fans
Permalink:
https://9fans.topicbox.com/groups/9fans/T1992d89fd8b382c7-Me0d4b6affdd5977cbe6d2c8b
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription