From 213d585629b8874a7cbe7c3e625c6f8f6aa8667d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Proust?= Date: Wed, 18 Feb 2026 14:27:55 +0100 Subject: [PATCH 1/6] compatibility with lwt.6 --- devkit.opam | 3 ++- lwt_engines.ml | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/devkit.opam b/devkit.opam index 525ec03..5c73067 100644 --- a/devkit.opam +++ b/devkit.opam @@ -17,7 +17,8 @@ depends: [ "ounit2" "camlzip" "libevent" {>= "0.8.0"} - "ocurl" {>= "0.7.2"} + "curl" {>= "0.10.0"} + "curl_lwt" "pcre2" {>= "8.0.3"} "trace" {>= "0.12"} "extunix" {>= "0.1.4"} diff --git a/lwt_engines.ml b/lwt_engines.ml index 3802e29..9cf06c4 100644 --- a/lwt_engines.ml +++ b/lwt_engines.ml @@ -30,6 +30,8 @@ method poll fds timeout = l end +type Lwt_engine.engine_id += Engine_id__Devkit_libevent + (** libevent-based engine for lwt *) class libevent = let once_block = Ev.[ONCE] in @@ -37,6 +39,8 @@ let once_nonblock = Ev.[ONCE;NONBLOCK] in object(self) inherit Lwt_engine.abstract + method id = Engine_id__Devkit_libevent + val events_ = Ev.init () val mutable pid = Unix.getpid () method events = From 0e2a76b13e1d060a6e11077b68ac107493683e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Proust?= Date: Wed, 18 Feb 2026 14:47:38 +0100 Subject: [PATCH 2/6] engine selection is based on lwt reporting its engine --- prelude.ml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/prelude.ml b/prelude.ml index ec457e2..c13e44a 100644 --- a/prelude.ml +++ b/prelude.ml @@ -61,6 +61,13 @@ let call_me_maybe f x = and poll is guaranteed to be available without the fd limitation. *) let () = - if not (Lwt_config._HAVE_LIBEV && Lwt_config.libev_default) then begin + match Lwt_engine.id () with + | Lwt_engine.Engine_id__libev _ -> () + | Lwt_engine.Engine_id__select -> + (* Otherwise, prefer poll over select, because select can only monitor fds up to 1024, + and poll is guaranteed to be available without the fd limitation. *) Lwt_engine.set @@ new Lwt_engines.poll - end + | Lwt_engine.Engine_id__poll -> () + | lwteng -> + eprintfn "Unknown Lwt engine (%s) in use, leaving as is" Obj.Extension_constructor.(name (of_val lwteng)); + () From 048634d2cd9cd7f78ec36f56faf7211d53302753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Proust?= Date: Wed, 18 Feb 2026 15:20:29 +0100 Subject: [PATCH 3/6] incompatible with lwt<6 --- devkit.opam | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devkit.opam b/devkit.opam index 5c73067..e1d82d2 100644 --- a/devkit.opam +++ b/devkit.opam @@ -22,7 +22,7 @@ depends: [ "pcre2" {>= "8.0.3"} "trace" {>= "0.12"} "extunix" {>= "0.1.4"} - "lwt" {>= "5.7.0"} + "lwt" {>= "6.0.0"} "lwt_ppx" "base-bytes" "base-unix" From ce8acf69c349ecf9a6e8c70b3f1751ac567d5726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Proust?= Date: Tue, 8 Sep 2026 09:44:31 +0200 Subject: [PATCH 4/6] suppress method override warning in engine's id --- lwt_engines.ml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lwt_engines.ml b/lwt_engines.ml index 9cf06c4..98940d3 100644 --- a/lwt_engines.ml +++ b/lwt_engines.ml @@ -39,8 +39,9 @@ let once_nonblock = Ev.[ONCE;NONBLOCK] in object(self) inherit Lwt_engine.abstract - method id = Engine_id__Devkit_libevent - + (* suppressing warning 7: for compatibility with both lwt.5.10 and lwt.6 + once we move fully to lwt.6 and drop compat with 5.10, we can remove the attribute *) + method[@warning "-7"] id = Engine_id__Devkit_libevent val events_ = Ev.init () val mutable pid = Unix.getpid () method events = From f1b574412d304a641f241a3a7e62887c7be7bc23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Proust?= Date: Tue, 8 Sep 2026 09:56:03 +0200 Subject: [PATCH 5/6] opam constraint for lwt: 5.10 --- devkit.opam | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devkit.opam b/devkit.opam index e1d82d2..63621af 100644 --- a/devkit.opam +++ b/devkit.opam @@ -22,7 +22,7 @@ depends: [ "pcre2" {>= "8.0.3"} "trace" {>= "0.12"} "extunix" {>= "0.1.4"} - "lwt" {>= "6.0.0"} + "lwt" {>= "5.10"} "lwt_ppx" "base-bytes" "base-unix" From 3b7fcdd2e07ac55f222a03127b699531a9bac867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Proust?= Date: Thu, 10 Sep 2026 14:26:17 +0200 Subject: [PATCH 6/6] prelude: fix log emission when checking lwt engine --- prelude.ml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/prelude.ml b/prelude.ml index c13e44a..66f25a1 100644 --- a/prelude.ml +++ b/prelude.ml @@ -64,10 +64,11 @@ let () = match Lwt_engine.id () with | Lwt_engine.Engine_id__libev _ -> () | Lwt_engine.Engine_id__select -> - (* Otherwise, prefer poll over select, because select can only monitor fds up to 1024, + (* prefer poll over select, because select can only monitor fds up to 1024, and poll is guaranteed to be available without the fd limitation. *) + eprintfn "Switching Lwt engine from select to poll to avoid fd limitations"; Lwt_engine.set @@ new Lwt_engines.poll | Lwt_engine.Engine_id__poll -> () - | lwteng -> - eprintfn "Unknown Lwt engine (%s) in use, leaving as is" Obj.Extension_constructor.(name (of_val lwteng)); + | _ -> + (* unknown engine*) ()