[Libguestfs] [PATCH libguestfs 2/2] Only leave/enter blocking_section when OCaml lock is not held

Jürgen Hötzel juergen at archlinux.org
Sat May 27 13:35:38 UTC 2023


Fixes deadlocks on OCaml5 when trying to get the lock that is already
held:

Fatal error during lock: Resource deadlock avoided
---
 ocaml/guestfs-c.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/ocaml/guestfs-c.c b/ocaml/guestfs-c.c
index 3888c9456..bcf8e6ab3 100644
--- a/ocaml/guestfs-c.c
+++ b/ocaml/guestfs-c.c
@@ -395,12 +395,16 @@ event_callback_wrapper (guestfs_h *g,
   /* Ensure we are holding the GC lock before any GC operations are
    * possible. (RHBZ#725824)
    */
-  caml_leave_blocking_section ();
+  bool in_blocking_section = (caml_state == NULL);
+
+  if (in_blocking_section)
+    caml_leave_blocking_section ();
 
   event_callback_wrapper_locked (g, data, event, event_handle, flags,
                                  buf, buf_len, array, array_len);
 
-  caml_enter_blocking_section ();
+  if (in_blocking_section)
+    caml_enter_blocking_section ();
 }
 
 value
-- 
2.40.1



More information about the Libguestfs mailing list