X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=ocaml%2Fguestfs_c.c;h=deb1026a6c188ace2536e33d49adef38ea09607b;hb=5248114edea548d142d7c7ce644cea22f7957822;hp=1324fb6966f75a461db5c284e5e627184da5f19e;hpb=8d3e97679a698386980bd1e5e5833542412a56f6;p=libguestfs.git diff --git a/ocaml/guestfs_c.c b/ocaml/guestfs_c.c index 1324fb6..deb1026 100644 --- a/ocaml/guestfs_c.c +++ b/ocaml/guestfs_c.c @@ -225,8 +225,8 @@ clear_progress_callback (guestfs_h *g) } static void -progress_callback (guestfs_h *g ATTRIBUTE_UNUSED, void *root, - int proc_nr, int serial, uint64_t position, uint64_t total) +progress_callback_locked (guestfs_h *g ATTRIBUTE_UNUSED, void *root, + int proc_nr, int serial, uint64_t position, uint64_t total) { CAMLparam0 (); CAMLlocal5 (proc_nrv, serialv, positionv, totalv, rv); @@ -238,9 +238,7 @@ progress_callback (guestfs_h *g ATTRIBUTE_UNUSED, void *root, value args[4] = { proc_nrv, serialv, positionv, totalv }; - caml_leave_blocking_section (); rv = caml_callbackN_exn (*(value*)root, 4, args); - caml_enter_blocking_section (); /* Callbacks shouldn't throw exceptions. There's not much we can do * except to print it. @@ -251,3 +249,17 @@ progress_callback (guestfs_h *g ATTRIBUTE_UNUSED, void *root, CAMLreturn0; } + +static void +progress_callback (guestfs_h *g ATTRIBUTE_UNUSED, void *root, + int proc_nr, int serial, uint64_t position, uint64_t total) +{ + /* Ensure we are holding the GC lock before any GC operations are + * possible. (RHBZ#725824) + */ + caml_leave_blocking_section (); + + progress_callback_locked (g, root, proc_nr, serial, position, total); + + caml_enter_blocking_section (); +}