mirror of
https://github.com/python/cpython
synced 2026-09-28 03:33:18 +03:00
gh-110850: Use public PyTime functions (#115746)
Replace private _PyTime functions with public PyTime functions. random_seed_time_pid() now reports errors to its caller.
This commit is contained in:
parent
52d1477566
commit
145bc2d638
12 changed files with 39 additions and 55 deletions
|
|
@ -321,7 +321,6 @@ extern int _PyTime_PerfCounterWithInfo(
|
||||||
// Alias for backward compatibility
|
// Alias for backward compatibility
|
||||||
#define _PyTime_MIN PyTime_MIN
|
#define _PyTime_MIN PyTime_MIN
|
||||||
#define _PyTime_MAX PyTime_MAX
|
#define _PyTime_MAX PyTime_MAX
|
||||||
#define _PyTime_AsSecondsDouble PyTime_AsSecondsDouble
|
|
||||||
|
|
||||||
|
|
||||||
// --- _PyDeadline -----------------------------------------------------------
|
// --- _PyDeadline -----------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -5133,7 +5133,11 @@ datetime_from_timestamp(PyObject *cls, TM_FUNC f, PyObject *timestamp,
|
||||||
static PyObject *
|
static PyObject *
|
||||||
datetime_best_possible(PyObject *cls, TM_FUNC f, PyObject *tzinfo)
|
datetime_best_possible(PyObject *cls, TM_FUNC f, PyObject *tzinfo)
|
||||||
{
|
{
|
||||||
PyTime_t ts = _PyTime_TimeUnchecked();
|
PyTime_t ts;
|
||||||
|
if (PyTime_Time(&ts) < 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
time_t secs;
|
time_t secs;
|
||||||
int us;
|
int us;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
#include "pycore_ceval.h" // Py_MakePendingCalls()
|
#include "pycore_ceval.h" // Py_MakePendingCalls()
|
||||||
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "pycore_parking_lot.h"
|
#include "pycore_parking_lot.h"
|
||||||
#include "pycore_time.h" // PyTime_t
|
#include "pycore_time.h" // _PyTime_FromSecondsObject()
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h> // offsetof()
|
#include <stddef.h> // offsetof()
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,6 @@
|
||||||
#include "pycore_modsupport.h" // _PyArg_NoKeywords()
|
#include "pycore_modsupport.h" // _PyArg_NoKeywords()
|
||||||
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
#include "pycore_moduleobject.h" // _PyModule_GetState()
|
||||||
#include "pycore_pylifecycle.h" // _PyOS_URandomNonblock()
|
#include "pycore_pylifecycle.h" // _PyOS_URandomNonblock()
|
||||||
#include "pycore_time.h" // _PyTime_TimeUnchecked()
|
|
||||||
|
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
# include <unistd.h> // getpid()
|
# include <unistd.h> // getpid()
|
||||||
|
|
@ -260,13 +259,15 @@ random_seed_urandom(RandomObject *self)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
random_seed_time_pid(RandomObject *self)
|
random_seed_time_pid(RandomObject *self)
|
||||||
{
|
{
|
||||||
PyTime_t now;
|
PyTime_t now;
|
||||||
uint32_t key[5];
|
if (PyTime_Time(&now) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
now = _PyTime_TimeUnchecked();
|
uint32_t key[5];
|
||||||
key[0] = (uint32_t)(now & 0xffffffffU);
|
key[0] = (uint32_t)(now & 0xffffffffU);
|
||||||
key[1] = (uint32_t)(now >> 32);
|
key[1] = (uint32_t)(now >> 32);
|
||||||
|
|
||||||
|
|
@ -278,11 +279,14 @@ random_seed_time_pid(RandomObject *self)
|
||||||
key[2] = 0;
|
key[2] = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
now = _PyTime_MonotonicUnchecked();
|
if (PyTime_Monotonic(&now) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
key[3] = (uint32_t)(now & 0xffffffffU);
|
key[3] = (uint32_t)(now & 0xffffffffU);
|
||||||
key[4] = (uint32_t)(now >> 32);
|
key[4] = (uint32_t)(now >> 32);
|
||||||
|
|
||||||
init_by_array(self, key, Py_ARRAY_LENGTH(key));
|
init_by_array(self, key, Py_ARRAY_LENGTH(key));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -300,7 +304,9 @@ random_seed(RandomObject *self, PyObject *arg)
|
||||||
|
|
||||||
/* Reading system entropy failed, fall back on the worst entropy:
|
/* Reading system entropy failed, fall back on the worst entropy:
|
||||||
use the current time and process identifier. */
|
use the current time and process identifier. */
|
||||||
random_seed_time_pid(self);
|
if (random_seed_time_pid(self) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@
|
||||||
|
|
||||||
#include "parts.h"
|
#include "parts.h"
|
||||||
|
|
||||||
#include "pycore_time.h"
|
#include "pycore_time.h" // _PyTime_FromSeconds()
|
||||||
|
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
# include <winsock2.h> // struct timeval
|
# include <winsock2.h> // struct timeval
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@
|
||||||
//#include <time.h>
|
//#include <time.h>
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_namespace.h" // _PyNamespace_New()
|
#include "pycore_namespace.h" // _PyNamespace_New()
|
||||||
#include "pycore_time.h" // PyTime_t
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
@ -71,13 +70,13 @@ _set_initialized(PyTime_t *initialized)
|
||||||
{
|
{
|
||||||
/* We go strictly monotonic to ensure each time is unique. */
|
/* We go strictly monotonic to ensure each time is unique. */
|
||||||
PyTime_t prev;
|
PyTime_t prev;
|
||||||
if (_PyTime_MonotonicWithInfo(&prev, NULL) != 0) {
|
if (PyTime_Monotonic(&prev) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* We do a busy sleep since the interval should be super short. */
|
/* We do a busy sleep since the interval should be super short. */
|
||||||
PyTime_t t;
|
PyTime_t t;
|
||||||
do {
|
do {
|
||||||
if (_PyTime_MonotonicWithInfo(&t, NULL) != 0) {
|
if (PyTime_Monotonic(&t) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} while (t == prev);
|
} while (t == prev);
|
||||||
|
|
@ -136,7 +135,7 @@ init_module(PyObject *module, module_state *state)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
double d = _PyTime_AsSecondsDouble(state->initialized);
|
double d = PyTime_AsSecondsDouble(state->initialized);
|
||||||
if (PyModule_Add(module, "_module_initialized", PyFloat_FromDouble(d)) < 0) {
|
if (PyModule_Add(module, "_module_initialized", PyFloat_FromDouble(d)) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -157,7 +156,7 @@ common_state_initialized(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
if (state == NULL) {
|
if (state == NULL) {
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
double d = _PyTime_AsSecondsDouble(state->initialized);
|
double d = PyTime_AsSecondsDouble(state->initialized);
|
||||||
return PyFloat_FromDouble(d);
|
return PyFloat_FromDouble(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1948,7 +1948,7 @@ thread_module_exec(PyObject *module)
|
||||||
|
|
||||||
// TIMEOUT_MAX
|
// TIMEOUT_MAX
|
||||||
double timeout_max = (double)PY_TIMEOUT_MAX * 1e-6;
|
double timeout_max = (double)PY_TIMEOUT_MAX * 1e-6;
|
||||||
double time_max = _PyTime_AsSecondsDouble(_PyTime_MAX);
|
double time_max = PyTime_AsSecondsDouble(_PyTime_MAX);
|
||||||
timeout_max = Py_MIN(timeout_max, time_max);
|
timeout_max = Py_MIN(timeout_max, time_max);
|
||||||
// Round towards minus infinity
|
// Round towards minus infinity
|
||||||
timeout_max = floor(timeout_max);
|
timeout_max = floor(timeout_max);
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "pycore_fileutils.h" // _Py_set_inheritable()
|
#include "pycore_fileutils.h" // _Py_set_inheritable()
|
||||||
#include "pycore_import.h" // _PyImport_GetModuleAttrString()
|
#include "pycore_import.h" // _PyImport_GetModuleAttrString()
|
||||||
#include "pycore_time.h" // PyTime_t
|
#include "pycore_time.h" // _PyTime_FromSecondsObject()
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h> // offsetof()
|
#include <stddef.h> // offsetof()
|
||||||
|
|
|
||||||
|
|
@ -3113,7 +3113,7 @@ sock_gettimeout(PySocketSockObject *s, PyObject *Py_UNUSED(ignored))
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
|
double seconds = PyTime_AsSecondsDouble(s->sock_timeout);
|
||||||
return PyFloat_FromDouble(seconds);
|
return PyFloat_FromDouble(seconds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6917,7 +6917,7 @@ socket_getdefaulttimeout(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
double seconds = _PyTime_AsSecondsDouble(state->defaulttimeout);
|
double seconds = PyTime_AsSecondsDouble(state->defaulttimeout);
|
||||||
return PyFloat_FromDouble(seconds);
|
return PyFloat_FromDouble(seconds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,24 +98,16 @@ get_time_state(PyObject *module)
|
||||||
static PyObject*
|
static PyObject*
|
||||||
_PyFloat_FromPyTime(PyTime_t t)
|
_PyFloat_FromPyTime(PyTime_t t)
|
||||||
{
|
{
|
||||||
double d = _PyTime_AsSecondsDouble(t);
|
double d = PyTime_AsSecondsDouble(t);
|
||||||
return PyFloat_FromDouble(d);
|
return PyFloat_FromDouble(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_system_time(PyTime_t *t)
|
|
||||||
{
|
|
||||||
// Avoid _PyTime_TimeUnchecked() which silently ignores errors.
|
|
||||||
return _PyTime_TimeWithInfo(t, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
time_time(PyObject *self, PyObject *unused)
|
time_time(PyObject *self, PyObject *unused)
|
||||||
{
|
{
|
||||||
PyTime_t t;
|
PyTime_t t;
|
||||||
if (get_system_time(&t) < 0) {
|
if (PyTime_Time(&t) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return _PyFloat_FromPyTime(t);
|
return _PyFloat_FromPyTime(t);
|
||||||
|
|
@ -132,7 +124,7 @@ static PyObject *
|
||||||
time_time_ns(PyObject *self, PyObject *unused)
|
time_time_ns(PyObject *self, PyObject *unused)
|
||||||
{
|
{
|
||||||
PyTime_t t;
|
PyTime_t t;
|
||||||
if (get_system_time(&t) < 0) {
|
if (PyTime_Time(&t) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return _PyTime_AsNanosecondsObject(t);
|
return _PyTime_AsNanosecondsObject(t);
|
||||||
|
|
@ -1156,19 +1148,11 @@ should not be relied on.");
|
||||||
#endif /* HAVE_WORKING_TZSET */
|
#endif /* HAVE_WORKING_TZSET */
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_monotonic(PyTime_t *t)
|
|
||||||
{
|
|
||||||
// Avoid _PyTime_MonotonicUnchecked() which silently ignores errors.
|
|
||||||
return _PyTime_MonotonicWithInfo(t, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
time_monotonic(PyObject *self, PyObject *unused)
|
time_monotonic(PyObject *self, PyObject *unused)
|
||||||
{
|
{
|
||||||
PyTime_t t;
|
PyTime_t t;
|
||||||
if (get_monotonic(&t) < 0) {
|
if (PyTime_Monotonic(&t) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return _PyFloat_FromPyTime(t);
|
return _PyFloat_FromPyTime(t);
|
||||||
|
|
@ -1183,7 +1167,7 @@ static PyObject *
|
||||||
time_monotonic_ns(PyObject *self, PyObject *unused)
|
time_monotonic_ns(PyObject *self, PyObject *unused)
|
||||||
{
|
{
|
||||||
PyTime_t t;
|
PyTime_t t;
|
||||||
if (get_monotonic(&t) < 0) {
|
if (PyTime_Monotonic(&t) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return _PyTime_AsNanosecondsObject(t);
|
return _PyTime_AsNanosecondsObject(t);
|
||||||
|
|
@ -1195,19 +1179,11 @@ PyDoc_STRVAR(monotonic_ns_doc,
|
||||||
Monotonic clock, cannot go backward, as nanoseconds.");
|
Monotonic clock, cannot go backward, as nanoseconds.");
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_perf_counter(PyTime_t *t)
|
|
||||||
{
|
|
||||||
// Avoid _PyTime_PerfCounterUnchecked() which silently ignores errors.
|
|
||||||
return _PyTime_PerfCounterWithInfo(t, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
time_perf_counter(PyObject *self, PyObject *unused)
|
time_perf_counter(PyObject *self, PyObject *unused)
|
||||||
{
|
{
|
||||||
PyTime_t t;
|
PyTime_t t;
|
||||||
if (get_perf_counter(&t) < 0) {
|
if (PyTime_PerfCounter(&t) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return _PyFloat_FromPyTime(t);
|
return _PyFloat_FromPyTime(t);
|
||||||
|
|
@ -1223,7 +1199,7 @@ static PyObject *
|
||||||
time_perf_counter_ns(PyObject *self, PyObject *unused)
|
time_perf_counter_ns(PyObject *self, PyObject *unused)
|
||||||
{
|
{
|
||||||
PyTime_t t;
|
PyTime_t t;
|
||||||
if (get_perf_counter(&t) < 0) {
|
if (PyTime_PerfCounter(&t) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return _PyTime_AsNanosecondsObject(t);
|
return _PyTime_AsNanosecondsObject(t);
|
||||||
|
|
@ -2190,7 +2166,7 @@ pysleep(PyTime_t timeout)
|
||||||
PyTime_t deadline, monotonic;
|
PyTime_t deadline, monotonic;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (get_monotonic(&monotonic) < 0) {
|
if (PyTime_Monotonic(&monotonic) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
deadline = monotonic + timeout;
|
deadline = monotonic + timeout;
|
||||||
|
|
@ -2243,7 +2219,7 @@ pysleep(PyTime_t timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HAVE_CLOCK_NANOSLEEP
|
#ifndef HAVE_CLOCK_NANOSLEEP
|
||||||
if (get_monotonic(&monotonic) < 0) {
|
if (PyTime_Monotonic(&monotonic) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
timeout = deadline - monotonic;
|
timeout = deadline - monotonic;
|
||||||
|
|
|
||||||
|
|
@ -1428,7 +1428,7 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
|
||||||
debug_cycle("uncollectable", FROM_GC(gc));
|
debug_cycle("uncollectable", FROM_GC(gc));
|
||||||
}
|
}
|
||||||
if (gcstate->debug & _PyGC_DEBUG_STATS) {
|
if (gcstate->debug & _PyGC_DEBUG_STATS) {
|
||||||
double d = _PyTime_AsSecondsDouble(_PyTime_PerfCounterUnchecked() - t1);
|
double d = PyTime_AsSecondsDouble(_PyTime_PerfCounterUnchecked() - t1);
|
||||||
PySys_WriteStderr(
|
PySys_WriteStderr(
|
||||||
"gc: done, %zd unreachable, %zd uncollectable, %.4fs elapsed\n",
|
"gc: done, %zd unreachable, %zd uncollectable, %.4fs elapsed\n",
|
||||||
n+m, n, d);
|
n+m, n, d);
|
||||||
|
|
|
||||||
|
|
@ -1136,7 +1136,7 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason)
|
||||||
n = state.uncollectable;
|
n = state.uncollectable;
|
||||||
|
|
||||||
if (gcstate->debug & _PyGC_DEBUG_STATS) {
|
if (gcstate->debug & _PyGC_DEBUG_STATS) {
|
||||||
double d = _PyTime_AsSecondsDouble(_PyTime_PerfCounterUnchecked() - t1);
|
double d = PyTime_AsSecondsDouble(_PyTime_PerfCounterUnchecked() - t1);
|
||||||
PySys_WriteStderr(
|
PySys_WriteStderr(
|
||||||
"gc: done, %zd unreachable, %zd uncollectable, %.4fs elapsed\n",
|
"gc: done, %zd unreachable, %zd uncollectable, %.4fs elapsed\n",
|
||||||
n+m, n, d);
|
n+m, n, d);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue