mirror of
https://github.com/python/cpython.git
synced 2025-09-29 03:35:31 +00:00
bpo-31061: fix crash in asyncio speedup module (GH-2984)
(cherry picked from commit de34cbe9cd
)
This commit is contained in:
parent
48fcc72c83
commit
f142e85d22
4 changed files with 32 additions and 0 deletions
|
@ -1,6 +1,7 @@
|
|||
"""Tests for futures.py."""
|
||||
|
||||
import concurrent.futures
|
||||
import gc
|
||||
import re
|
||||
import sys
|
||||
import threading
|
||||
|
@ -19,9 +20,11 @@ except ImportError:
|
|||
def _fakefunc(f):
|
||||
return f
|
||||
|
||||
|
||||
def first_cb():
|
||||
pass
|
||||
|
||||
|
||||
def last_cb():
|
||||
pass
|
||||
|
||||
|
@ -483,6 +486,15 @@ class BaseFutureTests:
|
|||
Exception("elephant"), Exception("elephant"))
|
||||
self.assertRaises(TypeError, fi.throw, list)
|
||||
|
||||
def test_future_del_collect(self):
|
||||
class Evil:
|
||||
def __del__(self):
|
||||
gc.collect()
|
||||
|
||||
for i in range(100):
|
||||
fut = self._new_future(loop=self.loop)
|
||||
fut.set_result(Evil())
|
||||
|
||||
|
||||
@unittest.skipUnless(hasattr(futures, '_CFuture'),
|
||||
'requires the C _asyncio module')
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
import collections
|
||||
import contextlib
|
||||
import functools
|
||||
import gc
|
||||
import io
|
||||
import os
|
||||
import re
|
||||
|
@ -92,6 +93,20 @@ class BaseTaskTests:
|
|||
self.loop.set_task_factory(self.new_task)
|
||||
self.loop.create_future = lambda: self.new_future(self.loop)
|
||||
|
||||
def test_task_del_collect(self):
|
||||
class Evil:
|
||||
def __del__(self):
|
||||
gc.collect()
|
||||
|
||||
@asyncio.coroutine
|
||||
def run():
|
||||
return Evil()
|
||||
|
||||
self.loop.run_until_complete(
|
||||
asyncio.gather(*[
|
||||
self.new_task(self.loop, run()) for _ in range(100)
|
||||
], loop=self.loop))
|
||||
|
||||
def test_other_loop_future(self):
|
||||
other_loop = asyncio.new_event_loop()
|
||||
fut = self.new_future(other_loop)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fixed a crash when using asyncio and threads.
|
|
@ -971,6 +971,8 @@ FutureObj_dealloc(PyObject *self)
|
|||
}
|
||||
}
|
||||
|
||||
PyObject_GC_UnTrack(self);
|
||||
|
||||
if (fut->fut_weakreflist != NULL) {
|
||||
PyObject_ClearWeakRefs(self);
|
||||
}
|
||||
|
@ -1845,6 +1847,8 @@ TaskObj_dealloc(PyObject *self)
|
|||
}
|
||||
}
|
||||
|
||||
PyObject_GC_UnTrack(self);
|
||||
|
||||
if (task->task_weakreflist != NULL) {
|
||||
PyObject_ClearWeakRefs(self);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue