mirror of
https://github.com/c-cube/linol.git
synced 2025-12-12 14:00:47 -05:00
git-subtree-dir: thirdparty/lsp git-subtree-split: aae6986391a8519de3da6a7a341f2bd3376e0d2f
63 lines
1.8 KiB
OCaml
63 lines
1.8 KiB
OCaml
open! Stdune
|
|
open Fiber.O
|
|
open Lev_fiber
|
|
|
|
let () =
|
|
let current = Gc.get () in
|
|
Gc.set { current with max_overhead = 1000000; allocation_policy = 1 }
|
|
|
|
let response = "+PONG\r\n"
|
|
|
|
let pong o times =
|
|
Io.with_write o ~f:(fun writer ->
|
|
for _ = 1 to times do
|
|
Io.Writer.add_string writer response
|
|
done;
|
|
Io.Writer.flush writer)
|
|
|
|
let rec process_bytes buf pos len count =
|
|
if pos >= len then count
|
|
else
|
|
let c = Bytes.get buf pos in
|
|
let count = if c = '\n' then count + 1 else count in
|
|
process_bytes buf (pos + 1) len count
|
|
|
|
let rec read o reader =
|
|
match Io.Reader.Expert.available reader with
|
|
| `Eof -> Fiber.return ()
|
|
| `Ok 0 ->
|
|
let* () = Io.Reader.Expert.refill reader in
|
|
read o reader
|
|
| `Ok _ ->
|
|
let buf, { Io.Slice.pos; len } = Io.Reader.Expert.buffer reader in
|
|
let times = process_bytes buf pos len 0 in
|
|
Io.Reader.Expert.consume reader ~len;
|
|
let* () = pong o times in
|
|
read o reader
|
|
|
|
let serve session =
|
|
let* i, o = Socket.Server.Session.io session in
|
|
let+ () = Io.with_read i ~f:(fun reader -> read o reader) in
|
|
Io.close i;
|
|
Io.close o
|
|
|
|
let run sock_path =
|
|
let delete () = try Unix.unlink sock_path with Unix.Unix_error _ -> () in
|
|
delete ();
|
|
let socket =
|
|
let socket = Unix.socket ~cloexec:true Unix.PF_UNIX Unix.SOCK_STREAM 0 in
|
|
Lev_fiber.Fd.create socket (`Non_blocking false)
|
|
in
|
|
let addr = Unix.ADDR_UNIX sock_path in
|
|
let* server = Socket.Server.create ~backlog:128 socket addr in
|
|
at_exit delete;
|
|
let serve session =
|
|
Fiber.with_error_handler
|
|
(fun () -> serve session)
|
|
~on_error:(fun exn ->
|
|
Format.eprintf "%a@.%!" Exn_with_backtrace.pp_uncaught exn;
|
|
Exn_with_backtrace.reraise exn)
|
|
in
|
|
Socket.Server.serve server ~f:serve
|
|
|
|
let () = Lev_fiber.run (fun () -> run Sys.argv.(1)) |> Lev_fiber.Error.ok_exn
|