linol/submodules/lev
Simon Cruanes 7fbc187548 Squashed 'thirdparty/lsp/' content from commit aae69863
git-subtree-dir: thirdparty/lsp
git-subtree-split: aae6986391a8519de3da6a7a341f2bd3376e0d2f
2025-04-10 15:44:25 -04:00
..
.github/workflows Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
lev Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
lev-fiber Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
lev-fiber-csexp Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
.gitignore Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
.gitrepo Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
.ocamlformat Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
dune Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
dune-project Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
lev-fiber-csexp.opam Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
lev-fiber.opam Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
lev.opam Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
README.cpp.md Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00
README.md Squashed 'thirdparty/lsp/' content from commit aae69863 2025-04-10 15:44:25 -04:00

Lev - OCaml bindings to libev

Abstract

libev by Marc Lehmann is a minimal & portable event loop library. This repository contains two packages. The first is lev which offers low level bindings to this library. The bindings are designed to be minimal, low overhead, and easily embeddable in larger projects. The API is callback based so you need to BYOC (bring your own concurrency).

The second package is lev-fiber. It provides a more familiar, higher level API. It is based on dune's fiber library for structured concurrency.

Example

This example of the low level API lev api:

open Lev

let () =
  let loop = Loop.default () in
  let stdin, stdin_w = Unix.pipe ~cloexec:true () in
  let stdout_r, stdout = Unix.pipe ~cloexec:true () in
  let stderr_r, stderr = Unix.pipe ~cloexec:true () in
  Unix.close stdin_w;
  Unix.close stdout_r;
  Unix.close stderr_r;
  let pid =
    Unix.create_process "sh" [| "sh"; "-c"; "exit 42" |] stdin stdout stderr
  in
  let child =
    match Child.create with
    | Error `Unimplemented -> assert false
    | Ok create ->
        create
          (fun t ~pid status ->
            Child.stop t loop;
            match status with
            | Unix.WEXITED i -> Printf.printf "%d exited with status %d\n" pid i
            | _ -> assert false)
          (Pid pid) Terminate
  in
  Child.start child loop;
  Loop.run_until_done loop;
  Child.destroy child

Documentation

Lev's API is a thin wrapper around libev itself. So you should first and foremost refer to libev's extensive documentation. Lev itself will document where it differs from libev's conventions.

License

vendor/ is under Marc Lehmann's original terms (see vendor/LICENSE).

Everything else is offered under ISC (see src/LICENSE.md).