fix: global initialization logic is now hidden behind a mutex

This commit is contained in:
Simon Cruanes 2023-11-24 23:52:17 -05:00
parent 46dc012356
commit d41eb2ceb4

View file

@ -71,12 +71,19 @@ end
type t = Curl.t type t = Curl.t
let _init = let _init =
lazy let initialized = ref false in
(Curl.global_init Curl.CURLINIT_GLOBALALL; let mutex = Mutex.create () in
at_exit Curl.global_cleanup) fun () ->
Mutex.lock mutex;
if not !initialized then (
initialized := true;
Curl.global_init Curl.CURLINIT_GLOBALALL;
at_exit Curl.global_cleanup
);
Mutex.unlock mutex
let make ?(set_opts = fun _ -> ()) () : t = let make ?(set_opts = fun _ -> ()) () : t =
Lazy.force _init; _init ();
let c = Curl.init () in let c = Curl.init () in
Gc.finalise Curl.cleanup c; Gc.finalise Curl.cleanup c;
set_opts c; set_opts c;