Skip to content

Commit bf809d1

Browse files
authored
Merge branch 'main' into immortal_refcnt
2 parents 368f7f6 + 46dc1ba commit bf809d1

30 files changed

+281
-145
lines changed

.github/workflows/reusable-macos.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
run: |
4343
brew install pkg-config [email protected] xz gdbm tcl-tk@8 make
4444
# Because alternate versions are not symlinked into place by default:
45-
brew link tcl-tk@8
45+
brew link --overwrite tcl-tk@8
4646
- name: Configure CPython
4747
run: |
4848
GDBM_CFLAGS="-I$(brew --prefix gdbm)/include" \

Doc/library/asyncio-policy.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ for the current process:
4040

4141
Return the current process-wide policy.
4242

43+
.. deprecated:: next
44+
The :func:`get_event_loop_policy` function is deprecated and
45+
will be removed in Python 3.16.
46+
4347
.. function:: set_event_loop_policy(policy)
4448

4549
Set the current process-wide policy to *policy*.

Include/internal/pycore_critical_section.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ _PyCriticalSection_IsActive(uintptr_t tag)
109109
static inline void
110110
_PyCriticalSection_BeginMutex(PyCriticalSection *c, PyMutex *m)
111111
{
112-
if (PyMutex_LockFast(&m->_bits)) {
112+
if (PyMutex_LockFast(m)) {
113113
PyThreadState *tstate = _PyThreadState_GET();
114114
c->_cs_mutex = m;
115115
c->_cs_prev = tstate->critical_section;
@@ -170,8 +170,8 @@ _PyCriticalSection2_BeginMutex(PyCriticalSection2 *c, PyMutex *m1, PyMutex *m2)
170170
m2 = tmp;
171171
}
172172

173-
if (PyMutex_LockFast(&m1->_bits)) {
174-
if (PyMutex_LockFast(&m2->_bits)) {
173+
if (PyMutex_LockFast(m1)) {
174+
if (PyMutex_LockFast(m2)) {
175175
PyThreadState *tstate = _PyThreadState_GET();
176176
c->_cs_base._cs_mutex = m1;
177177
c->_cs_mutex2 = m2;

Include/internal/pycore_lock.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ extern "C" {
1818
#define _Py_ONCE_INITIALIZED 4
1919

2020
static inline int
21-
PyMutex_LockFast(uint8_t *lock_bits)
21+
PyMutex_LockFast(PyMutex *m)
2222
{
2323
uint8_t expected = _Py_UNLOCKED;
24+
uint8_t *lock_bits = &m->_bits;
2425
return _Py_atomic_compare_exchange_uint8(lock_bits, &expected, _Py_LOCKED);
2526
}
2627

Include/internal/pycore_opcode_metadata.h

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Include/internal/pycore_typeobject.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ typedef int (*_py_validate_type)(PyTypeObject *);
278278
// and if the validation is passed, it will set the ``tp_version`` as valid
279279
// tp_version_tag from the ``ty``.
280280
extern int _PyType_Validate(PyTypeObject *ty, _py_validate_type validate, unsigned int *tp_version);
281+
extern int _PyType_CacheGetItemForSpecialization(PyHeapTypeObject *ht, PyObject *descriptor, uint32_t tp_version);
281282

282283
#ifdef __cplusplus
283284
}

Include/internal/pycore_uop_metadata.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Lib/asyncio/events.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
'AbstractEventLoopPolicy',
99
'AbstractEventLoop', 'AbstractServer',
1010
'Handle', 'TimerHandle',
11+
'_get_event_loop_policy',
1112
'get_event_loop_policy',
1213
'_set_event_loop_policy',
1314
'set_event_loop_policy',
@@ -761,12 +762,15 @@ def _init_event_loop_policy():
761762
_event_loop_policy = DefaultEventLoopPolicy()
762763

763764

764-
def get_event_loop_policy():
765+
def _get_event_loop_policy():
765766
"""Get the current event loop policy."""
766767
if _event_loop_policy is None:
767768
_init_event_loop_policy()
768769
return _event_loop_policy
769770

771+
def get_event_loop_policy():
772+
warnings._deprecated('asyncio.get_event_loop_policy', remove=(3, 16))
773+
return _get_event_loop_policy()
770774

771775
def _set_event_loop_policy(policy):
772776
"""Set the current event loop policy.
@@ -778,7 +782,7 @@ def _set_event_loop_policy(policy):
778782
_event_loop_policy = policy
779783

780784
def set_event_loop_policy(policy):
781-
warnings._deprecated('set_event_loop_policy', remove=(3,16))
785+
warnings._deprecated('asyncio.set_event_loop_policy', remove=(3,16))
782786
_set_event_loop_policy(policy)
783787

784788
def get_event_loop():
@@ -794,17 +798,17 @@ def get_event_loop():
794798
current_loop = _get_running_loop()
795799
if current_loop is not None:
796800
return current_loop
797-
return get_event_loop_policy().get_event_loop()
801+
return _get_event_loop_policy().get_event_loop()
798802

799803

800804
def set_event_loop(loop):
801805
"""Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
802-
get_event_loop_policy().set_event_loop(loop)
806+
_get_event_loop_policy().set_event_loop(loop)
803807

804808

805809
def new_event_loop():
806810
"""Equivalent to calling get_event_loop_policy().new_event_loop()."""
807-
return get_event_loop_policy().new_event_loop()
811+
return _get_event_loop_policy().new_event_loop()
808812

809813

810814
# Alias pure-Python implementations for testing purposes.

Lib/tempfile.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -437,11 +437,19 @@ class _TemporaryFileCloser:
437437
cleanup_called = False
438438
close_called = False
439439

440-
def __init__(self, file, name, delete=True, delete_on_close=True):
440+
def __init__(
441+
self,
442+
file,
443+
name,
444+
delete=True,
445+
delete_on_close=True,
446+
warn_message="Implicitly cleaning up unknown file",
447+
):
441448
self.file = file
442449
self.name = name
443450
self.delete = delete
444451
self.delete_on_close = delete_on_close
452+
self.warn_message = warn_message
445453

446454
def cleanup(self, windows=(_os.name == 'nt'), unlink=_os.unlink):
447455
if not self.cleanup_called:
@@ -469,7 +477,10 @@ def close(self):
469477
self.cleanup()
470478

471479
def __del__(self):
480+
close_called = self.close_called
472481
self.cleanup()
482+
if not close_called:
483+
_warnings.warn(self.warn_message, ResourceWarning)
473484

474485

475486
class _TemporaryFileWrapper:
@@ -483,8 +494,17 @@ class _TemporaryFileWrapper:
483494
def __init__(self, file, name, delete=True, delete_on_close=True):
484495
self.file = file
485496
self.name = name
486-
self._closer = _TemporaryFileCloser(file, name, delete,
487-
delete_on_close)
497+
self._closer = _TemporaryFileCloser(
498+
file,
499+
name,
500+
delete,
501+
delete_on_close,
502+
warn_message=f"Implicitly cleaning up {self!r}",
503+
)
504+
505+
def __repr__(self):
506+
file = self.__dict__['file']
507+
return f"<{type(self).__name__} {file=}>"
488508

489509
def __getattr__(self, name):
490510
# Attribute lookups are delegated to the underlying file

Lib/test/test_asyncio/test_events.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2397,7 +2397,7 @@ def test_handle_repr_debug(self):
23972397
self.assertRegex(repr(h), regex)
23982398

23992399
def test_handle_source_traceback(self):
2400-
loop = asyncio.get_event_loop_policy().new_event_loop()
2400+
loop = asyncio.new_event_loop()
24012401
loop.set_debug(True)
24022402
self.set_event_loop(loop)
24032403

@@ -2759,24 +2759,31 @@ def test_set_event_loop(self):
27592759
old_loop.close()
27602760

27612761
def test_get_event_loop_policy(self):
2762-
policy = asyncio.get_event_loop_policy()
2763-
self.assertIsInstance(policy, asyncio.AbstractEventLoopPolicy)
2764-
self.assertIs(policy, asyncio.get_event_loop_policy())
2762+
with self.assertWarnsRegex(
2763+
DeprecationWarning, "'asyncio.get_event_loop_policy' is deprecated"):
2764+
policy = asyncio.get_event_loop_policy()
2765+
self.assertIsInstance(policy, asyncio.AbstractEventLoopPolicy)
2766+
self.assertIs(policy, asyncio.get_event_loop_policy())
27652767

27662768
def test_set_event_loop_policy(self):
27672769
with self.assertWarnsRegex(
2768-
DeprecationWarning, "'set_event_loop_policy' is deprecated"):
2770+
DeprecationWarning, "'asyncio.set_event_loop_policy' is deprecated"):
27692771
self.assertRaises(
27702772
TypeError, asyncio.set_event_loop_policy, object())
27712773

2772-
old_policy = asyncio.get_event_loop_policy()
2774+
with self.assertWarnsRegex(
2775+
DeprecationWarning, "'asyncio.get_event_loop_policy' is deprecated"):
2776+
old_policy = asyncio.get_event_loop_policy()
27732777

27742778
policy = asyncio.DefaultEventLoopPolicy()
27752779
with self.assertWarnsRegex(
2776-
DeprecationWarning, "'set_event_loop_policy' is deprecated"):
2780+
DeprecationWarning, "'asyncio.set_event_loop_policy' is deprecated"):
27772781
asyncio.set_event_loop_policy(policy)
2778-
self.assertIs(policy, asyncio.get_event_loop_policy())
2779-
self.assertIsNot(policy, old_policy)
2782+
2783+
with self.assertWarnsRegex(
2784+
DeprecationWarning, "'asyncio.get_event_loop_policy' is deprecated"):
2785+
self.assertIs(policy, asyncio.get_event_loop_policy())
2786+
self.assertIsNot(policy, old_policy)
27802787

27812788

27822789
class GetEventLoopTestsMixin:
@@ -2859,7 +2866,7 @@ class Policy(asyncio.DefaultEventLoopPolicy):
28592866
def get_event_loop(self):
28602867
raise TestError
28612868

2862-
old_policy = asyncio.get_event_loop_policy()
2869+
old_policy = asyncio._get_event_loop_policy()
28632870
try:
28642871
asyncio._set_event_loop_policy(Policy())
28652872
loop = asyncio.new_event_loop()
@@ -2899,7 +2906,7 @@ async def func():
28992906
self.assertIs(asyncio._get_running_loop(), None)
29002907

29012908
def test_get_event_loop_returns_running_loop2(self):
2902-
old_policy = asyncio.get_event_loop_policy()
2909+
old_policy = asyncio._get_event_loop_policy()
29032910
try:
29042911
asyncio._set_event_loop_policy(asyncio.DefaultEventLoopPolicy())
29052912
loop = asyncio.new_event_loop()

0 commit comments

Comments
 (0)