Skip to content

Commit

Permalink
bpo-31061: fix crash in asyncio speedup module (pythonGH-2966)
Browse files Browse the repository at this point in the history
  • Loading branch information
thehesiod authored and methane committed Aug 2, 2017
1 parent 47320a6 commit de34cbe
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 0 deletions.
12 changes: 12 additions & 0 deletions Lib/test/test_asyncio/test_futures.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""Tests for futures.py."""

import concurrent.futures
import gc
import re
import sys
import threading
Expand All @@ -19,9 +20,11 @@
def _fakefunc(f):
return f


def first_cb():
pass


def last_cb():
pass

Expand Down Expand Up @@ -483,6 +486,15 @@ def test_future_iter_throw(self):
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')
Expand Down
15 changes: 15 additions & 0 deletions Lib/test/test_asyncio/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import collections
import contextlib
import functools
import gc
import io
import os
import re
Expand Down Expand Up @@ -91,6 +92,20 @@ def setUp(self):
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)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed a crash when using asyncio and threads.
4 changes: 4 additions & 0 deletions Modules/_asynciomodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -972,6 +972,8 @@ FutureObj_dealloc(PyObject *self)
}
}

PyObject_GC_UnTrack(self);

if (fut->fut_weakreflist != NULL) {
PyObject_ClearWeakRefs(self);
}
Expand Down Expand Up @@ -1846,6 +1848,8 @@ TaskObj_dealloc(PyObject *self)
}
}

PyObject_GC_UnTrack(self);

if (task->task_weakreflist != NULL) {
PyObject_ClearWeakRefs(self);
}
Expand Down

0 comments on commit de34cbe

Please sign in to comment.