mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #22117: Use the _PyTime_t API in _datetime.datetime() constructor
* Remove _PyTime_gettimeofday() * Add _PyTime_GetSystemClock()
This commit is contained in:
parent
10915aa85c
commit
09e5cf28ae
4 changed files with 35 additions and 124 deletions
119
Python/pytime.c
119
Python/pytime.c
|
@ -19,106 +19,6 @@
|
|||
#define MS_TO_NS (MS_TO_US * US_TO_NS)
|
||||
#define SEC_TO_NS (SEC_TO_MS * MS_TO_NS)
|
||||
|
||||
static int
|
||||
pygettimeofday(_PyTime_timeval *tp, _Py_clock_info_t *info, int raise)
|
||||
{
|
||||
#ifdef MS_WINDOWS
|
||||
FILETIME system_time;
|
||||
ULARGE_INTEGER large;
|
||||
ULONGLONG microseconds;
|
||||
|
||||
assert(info == NULL || raise);
|
||||
|
||||
GetSystemTimeAsFileTime(&system_time);
|
||||
large.u.LowPart = system_time.dwLowDateTime;
|
||||
large.u.HighPart = system_time.dwHighDateTime;
|
||||
/* 11,644,473,600,000,000: number of microseconds between
|
||||
the 1st january 1601 and the 1st january 1970 (369 years + 89 leap
|
||||
days). */
|
||||
microseconds = large.QuadPart / 10 - 11644473600000000;
|
||||
tp->tv_sec = microseconds / SEC_TO_US;
|
||||
tp->tv_usec = microseconds % SEC_TO_US;
|
||||
if (info) {
|
||||
DWORD timeAdjustment, timeIncrement;
|
||||
BOOL isTimeAdjustmentDisabled, ok;
|
||||
|
||||
info->implementation = "GetSystemTimeAsFileTime()";
|
||||
info->monotonic = 0;
|
||||
ok = GetSystemTimeAdjustment(&timeAdjustment, &timeIncrement,
|
||||
&isTimeAdjustmentDisabled);
|
||||
if (!ok) {
|
||||
PyErr_SetFromWindowsErr(0);
|
||||
return -1;
|
||||
}
|
||||
info->resolution = timeIncrement * 1e-7;
|
||||
info->adjustable = 1;
|
||||
}
|
||||
|
||||
#else /* MS_WINDOWS */
|
||||
int err;
|
||||
#ifdef HAVE_CLOCK_GETTIME
|
||||
struct timespec ts;
|
||||
#endif
|
||||
|
||||
assert(info == NULL || raise);
|
||||
|
||||
#ifdef HAVE_CLOCK_GETTIME
|
||||
err = clock_gettime(CLOCK_REALTIME, &ts);
|
||||
if (err) {
|
||||
if (raise)
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
return -1;
|
||||
}
|
||||
tp->tv_sec = ts.tv_sec;
|
||||
tp->tv_usec = ts.tv_nsec / US_TO_NS;
|
||||
|
||||
if (info) {
|
||||
struct timespec res;
|
||||
info->implementation = "clock_gettime(CLOCK_REALTIME)";
|
||||
info->monotonic = 0;
|
||||
info->adjustable = 1;
|
||||
if (clock_getres(CLOCK_REALTIME, &res) == 0)
|
||||
info->resolution = res.tv_sec + res.tv_nsec * 1e-9;
|
||||
else
|
||||
info->resolution = 1e-9;
|
||||
}
|
||||
#else /* HAVE_CLOCK_GETTIME */
|
||||
|
||||
/* test gettimeofday() */
|
||||
#ifdef GETTIMEOFDAY_NO_TZ
|
||||
err = gettimeofday(tp);
|
||||
#else
|
||||
err = gettimeofday(tp, (struct timezone *)NULL);
|
||||
#endif
|
||||
if (err) {
|
||||
if (raise)
|
||||
PyErr_SetFromErrno(PyExc_OSError);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (info) {
|
||||
info->implementation = "gettimeofday()";
|
||||
info->resolution = 1e-6;
|
||||
info->monotonic = 0;
|
||||
info->adjustable = 1;
|
||||
}
|
||||
#endif /* !HAVE_CLOCK_GETTIME */
|
||||
#endif /* !MS_WINDOWS */
|
||||
assert(0 <= tp->tv_usec && tp->tv_usec < SEC_TO_US);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
_PyTime_gettimeofday(_PyTime_timeval *tp)
|
||||
{
|
||||
if (pygettimeofday(tp, NULL, 0) < 0) {
|
||||
/* cannot happen, _PyTime_Init() checks that pygettimeofday() works */
|
||||
assert(0);
|
||||
tp->tv_sec = 0;
|
||||
tp->tv_usec = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
error_time_t_overflow(void)
|
||||
{
|
||||
|
@ -577,6 +477,20 @@ pygettimeofday_new(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
|
|||
return 0;
|
||||
}
|
||||
|
||||
_PyTime_t
|
||||
_PyTime_GetSystemClock(void)
|
||||
{
|
||||
_PyTime_t t;
|
||||
if (pygettimeofday_new(&t, NULL, 0) < 0) {
|
||||
/* should not happen, _PyTime_Init() checked the clock at startup */
|
||||
assert(0);
|
||||
|
||||
/* use a fixed value instead of a random value from the stack */
|
||||
t = 0;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
int
|
||||
_PyTime_GetSystemClockWithInfo(_PyTime_t *t, _Py_clock_info_t *info)
|
||||
{
|
||||
|
@ -715,13 +629,8 @@ _PyTime_GetMonotonicClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
|
|||
int
|
||||
_PyTime_Init(void)
|
||||
{
|
||||
_PyTime_timeval tv;
|
||||
_PyTime_t t;
|
||||
|
||||
/* ensure that the system clock works */
|
||||
if (pygettimeofday(&tv, NULL, 1) < 0)
|
||||
return -1;
|
||||
|
||||
/* ensure that the system clock works */
|
||||
if (_PyTime_GetSystemClockWithInfo(&t, NULL) < 0)
|
||||
return -1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue