[dunfell,1.46,1/5] server/process: Disable gc around critical section

Message ID 0784db7dd0fef6f0621ad8d74372f44e87fef950.1655835530.git.steve@sakoman.com
State Accepted, archived
Commit 0784db7dd0fef6f0621ad8d74372f44e87fef950
Headers show
Series [dunfell,1.46,1/5] server/process: Disable gc around critical section | expand

Commit Message

Steve Sakoman June 21, 2022, 6:20 p.m. UTC
From: Richard Purdie <richard.purdie@linuxfoundation.org>

The python gc can trigger whilst we're holding the event stream lock
and when cleaning up objects, they can trigger warnings. This translates
into a new event which would then need the lock and we can deadlock.

Disable gc whilst we hold that lock to avoid this unfortunate and
problematic situation.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 96a6303949cefd469bcf5ed250ff512271354357)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 lib/bb/server/process.py | 3 +++
 1 file changed, 3 insertions(+)

Patch

diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index 3c9ed706..4bdb84ae 100644
--- a/lib/bb/server/process.py
+++ b/lib/bb/server/process.py
@@ -25,6 +25,7 @@  import subprocess
 import errno
 import re
 import datetime
+import gc
 import bb.server.xmlrpcserver
 from bb import daemonize
 from multiprocessing import queues
@@ -671,8 +672,10 @@  class ConnectionWriter(object):
 
     def send(self, obj):
         obj = multiprocessing.reduction.ForkingPickler.dumps(obj)
+        gc.disable()
         with self.wlock:
             self.writer.send_bytes(obj)
+        gc.enable()
 
     def fileno(self):
         return self.writer.fileno()