mirror of https://github.com/python/cpython
bpo-31415: Improve error handling and caching of the importtime option. (#4138)
This commit is contained in:
parent
31af650ee2
commit
088929cf62
|
@ -1667,45 +1667,52 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
static int ximporttime = 0;
|
/* 1 -- true, 0 -- false, -1 -- not initialized */
|
||||||
|
static int ximporttime = -1;
|
||||||
static int import_level;
|
static int import_level;
|
||||||
static _PyTime_t accumulated;
|
static _PyTime_t accumulated;
|
||||||
_Py_IDENTIFIER(importtime);
|
_Py_IDENTIFIER(importtime);
|
||||||
|
|
||||||
_PyTime_t t1 = 0, accumulated_copy = accumulated;
|
_PyTime_t t1 = 0, accumulated_copy = accumulated;
|
||||||
|
|
||||||
Py_XDECREF(mod);
|
|
||||||
|
|
||||||
/* XOptions is initialized after first some imports.
|
/* XOptions is initialized after first some imports.
|
||||||
* So we can't have negative cache.
|
* So we can't have negative cache before completed initialization.
|
||||||
* Anyway, importlib.__find_and_load is much slower than
|
* Anyway, importlib._find_and_load is much slower than
|
||||||
* _PyDict_GetItemId()
|
* _PyDict_GetItemIdWithError().
|
||||||
*/
|
*/
|
||||||
if (ximporttime == 0) {
|
if (ximporttime < 0) {
|
||||||
char *envoption = Py_GETENV("PYTHONPROFILEIMPORTTIME");
|
const char *envoption = Py_GETENV("PYTHONPROFILEIMPORTTIME");
|
||||||
if (envoption != NULL && strlen(envoption) > 0) {
|
if (envoption != NULL && *envoption != '\0') {
|
||||||
ximporttime = 1;
|
ximporttime = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PyObject *xoptions = PySys_GetXOptions();
|
PyObject *xoptions = PySys_GetXOptions();
|
||||||
|
PyObject *value = NULL;
|
||||||
if (xoptions) {
|
if (xoptions) {
|
||||||
PyObject *value = _PyDict_GetItemId(
|
value = _PyDict_GetItemIdWithError(
|
||||||
xoptions, &PyId_importtime);
|
xoptions, &PyId_importtime);
|
||||||
|
}
|
||||||
|
if (value == NULL && PyErr_Occurred()) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (value != NULL || Py_IsInitialized()) {
|
||||||
ximporttime = (value == Py_True);
|
ximporttime = (value == Py_True);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ximporttime) {
|
if (ximporttime > 0) {
|
||||||
fputs("import time: self [us] | cumulative | imported package\n",
|
fputs("import time: self [us] | cumulative | imported package\n",
|
||||||
stderr);
|
stderr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ximporttime) {
|
if (ximporttime > 0) {
|
||||||
import_level++;
|
import_level++;
|
||||||
t1 = _PyTime_GetPerfCounter();
|
t1 = _PyTime_GetPerfCounter();
|
||||||
accumulated = 0;
|
accumulated = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Py_XDECREF(mod);
|
||||||
|
|
||||||
if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
|
if (PyDTrace_IMPORT_FIND_LOAD_START_ENABLED())
|
||||||
PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
|
PyDTrace_IMPORT_FIND_LOAD_START(PyUnicode_AsUTF8(abs_name));
|
||||||
|
|
||||||
|
@ -1717,7 +1724,7 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
|
||||||
PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
|
PyDTrace_IMPORT_FIND_LOAD_DONE(PyUnicode_AsUTF8(abs_name),
|
||||||
mod != NULL);
|
mod != NULL);
|
||||||
|
|
||||||
if (ximporttime) {
|
if (ximporttime > 0) {
|
||||||
_PyTime_t cum = _PyTime_GetPerfCounter() - t1;
|
_PyTime_t cum = _PyTime_GetPerfCounter() - t1;
|
||||||
|
|
||||||
import_level--;
|
import_level--;
|
||||||
|
|
Loading…
Reference in New Issue