From 8c1eff86d14da8982fb292494ff613a14e3bae9e Mon Sep 17 00:00:00 2001 From: Amir Miron Date: Wed, 15 Apr 2015 18:40:05 +0300 Subject: [PATCH] deadlock on _sendlock caused by GC on netref --- rpyc/core/protocol.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rpyc/core/protocol.py b/rpyc/core/protocol.py index 640016c5..6e1e76b7 100644 --- a/rpyc/core/protocol.py +++ b/rpyc/core/protocol.py @@ -6,6 +6,7 @@ import itertools import socket import time +import gc from threading import Lock, RLock, Event from rpyc.lib.compat import pickle, next, is_py3k, maxint, select_error @@ -235,11 +236,19 @@ def _get_seq_id(self): def _send(self, msg, seq, args): data = brine.dump((msg, seq, args)) + # GC might run while sending data + # if so, a BaseNetref.__del__ might be called + # BaseNetref.__del__ must call asyncreq, + # which will cause a deadlock + is_gc_enabled = gc.isenabled() + gc.disable() self._sendlock.acquire() try: self._channel.send(data) finally: self._sendlock.release() + if is_gc_enabled: + gc.enable() def _send_request(self, seq, handler, args): self._send(consts.MSG_REQUEST, seq, (handler, self._box(args)))