mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
Merge remote-tracking branch 'upstream/3.10' into 3.10
This commit is contained in:
commit
30300f4113
5 changed files with 40 additions and 1 deletions
|
|
@ -282,6 +282,13 @@ It is possible to provide a setup statement that is executed only once at the be
|
|||
$ python -m timeit -s 'text = "sample string"; char = "g"' 'text.find(char)'
|
||||
1000000 loops, best of 5: 0.342 usec per loop
|
||||
|
||||
In the output, there are three fields. The loop count, which tells you how many
|
||||
times the statement body was run per timing loop repetition. The repetition
|
||||
count ('best of 5') which tells you how many times the timing loop was
|
||||
repeated, and finally the time the statement body took on average within the
|
||||
best repetition of the timing loop. That is, the time the fastest repetition
|
||||
took divided by the loop count.
|
||||
|
||||
::
|
||||
|
||||
>>> import timeit
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
:c:func:`Py_EndInterpreter` now explicitly untracks all objects currently
|
||||
tracked by the GC. Previously, if an object was used later by another
|
||||
interpreter, calling :c:func:`PyObject_GC_UnTrack` on the object crashed if the
|
||||
previous or the next object of the :c:type:`PyGC_Head` structure became a
|
||||
dangling pointer. Patch by Victor Stinner.
|
||||
|
|
@ -883,7 +883,7 @@ py_evp_fromname(PyObject *module, const char *digestname, PyObject *data_obj,
|
|||
goto exit;
|
||||
}
|
||||
|
||||
#if defined(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW) && OPENSSL_VERSION_NUMBER >= 0x30000000L
|
||||
#if defined(EVP_MD_CTX_FLAG_NON_FIPS_ALLOW) && OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||
// In OpenSSL 1.1.1 the non FIPS allowed flag is context specific while
|
||||
// in 3.0.0 it is a different EVP_MD provider.
|
||||
if (!usedforsecurity) {
|
||||
|
|
|
|||
|
|
@ -1241,6 +1241,9 @@ tracemalloc_copy_domain(_Py_hashtable_t *domains,
|
|||
_Py_hashtable_t *traces = (_Py_hashtable_t *)value;
|
||||
|
||||
_Py_hashtable_t *traces2 = tracemalloc_copy_traces(traces);
|
||||
if (traces2 == NULL) {
|
||||
return -1;
|
||||
}
|
||||
if (_Py_hashtable_set(domains2, TO_PTR(domain), traces2) < 0) {
|
||||
_Py_hashtable_destroy(traces2);
|
||||
return -1;
|
||||
|
|
|
|||
|
|
@ -2162,12 +2162,36 @@ _PyGC_DumpShutdownStats(PyInterpreterState *interp)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gc_fini_untrack(PyGC_Head *list)
|
||||
{
|
||||
PyGC_Head *gc;
|
||||
for (gc = GC_NEXT(list); gc != list; gc = GC_NEXT(list)) {
|
||||
PyObject *op = FROM_GC(gc);
|
||||
_PyObject_GC_UNTRACK(op);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_PyGC_Fini(PyInterpreterState *interp)
|
||||
{
|
||||
GCState *gcstate = &interp->gc;
|
||||
Py_CLEAR(gcstate->garbage);
|
||||
Py_CLEAR(gcstate->callbacks);
|
||||
|
||||
if (!_Py_IsMainInterpreter(interp)) {
|
||||
// bpo-46070: Explicitly untrack all objects currently tracked by the
|
||||
// GC. Otherwise, if an object is used later by another interpreter,
|
||||
// calling PyObject_GC_UnTrack() on the object crashs if the previous
|
||||
// or the next object of the PyGC_Head structure became a dangling
|
||||
// pointer.
|
||||
for (int i = 0; i < NUM_GENERATIONS; i++) {
|
||||
PyGC_Head *gen = GEN_HEAD(gcstate, i);
|
||||
gc_fini_untrack(gen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* for debugging */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue