Kaydet (Commit) f142e85d authored tarafından INADA Naoki's avatar INADA Naoki Kaydeden (comit) GitHub

bpo-31061: fix crash in asyncio speedup module (GH-2984)

(cherry picked from commit de34cbe9)
üst 48fcc72c
"""Tests for futures.py.""" """Tests for futures.py."""
import concurrent.futures import concurrent.futures
import gc
import re import re
import sys import sys
import threading import threading
...@@ -19,9 +20,11 @@ except ImportError: ...@@ -19,9 +20,11 @@ except ImportError:
def _fakefunc(f): def _fakefunc(f):
return f return f
def first_cb(): def first_cb():
pass pass
def last_cb(): def last_cb():
pass pass
...@@ -483,6 +486,15 @@ class BaseFutureTests: ...@@ -483,6 +486,15 @@ class BaseFutureTests:
Exception("elephant"), Exception("elephant")) Exception("elephant"), Exception("elephant"))
self.assertRaises(TypeError, fi.throw, list) 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'), @unittest.skipUnless(hasattr(futures, '_CFuture'),
'requires the C _asyncio module') 'requires the C _asyncio module')
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import collections import collections
import contextlib import contextlib
import functools import functools
import gc
import io import io
import os import os
import re import re
...@@ -92,6 +93,20 @@ class BaseTaskTests: ...@@ -92,6 +93,20 @@ class BaseTaskTests:
self.loop.set_task_factory(self.new_task) self.loop.set_task_factory(self.new_task)
self.loop.create_future = lambda: self.new_future(self.loop) 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): def test_other_loop_future(self):
other_loop = asyncio.new_event_loop() other_loop = asyncio.new_event_loop()
fut = self.new_future(other_loop) fut = self.new_future(other_loop)
......
...@@ -971,6 +971,8 @@ FutureObj_dealloc(PyObject *self) ...@@ -971,6 +971,8 @@ FutureObj_dealloc(PyObject *self)
} }
} }
PyObject_GC_UnTrack(self);
if (fut->fut_weakreflist != NULL) { if (fut->fut_weakreflist != NULL) {
PyObject_ClearWeakRefs(self); PyObject_ClearWeakRefs(self);
} }
...@@ -1845,6 +1847,8 @@ TaskObj_dealloc(PyObject *self) ...@@ -1845,6 +1847,8 @@ TaskObj_dealloc(PyObject *self)
} }
} }
PyObject_GC_UnTrack(self);
if (task->task_weakreflist != NULL) { if (task->task_weakreflist != NULL) {
PyObject_ClearWeakRefs(self); PyObject_ClearWeakRefs(self);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment