bpo-31415: Improve error handling and caching of the importtime option. (#4138)

This commit is contained in:
Serhiy Storchaka 2017-11-07 08:55:38 +02:00 committed by GitHub
parent 31af650ee2
commit 088929cf62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 13 deletions

View File

@ -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--;