package async_unix

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file syscall.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
open Core
open Poly
module Unix = Core_unix
module Syscall_result = Unix.Syscall_result

let max_tries = 1000

let too_many_tries =
  Error.to_exn
    (Error.create "syscall interrupted too many times" max_tries [%sexp_of: int])
;;

let too_many_tries_error = Error too_many_tries

let syscall =
  let rec loop f n =
    if n >= max_tries
    then too_many_tries_error
    else (
      match f () with
      | x -> Ok x
      | exception Unix.Unix_error (EINTR, _, _) -> loop f (n + 1)
      | exception exn -> Error exn)
  in
  fun f -> loop f 0
;;

let is_eintr r = Syscall_result.is_error r && Syscall_result.error_exn r = EINTR

let syscall_result =
  let rec loop a f n =
    if n >= max_tries
    then raise too_many_tries
    else (
      let r = f a in
      if not (is_eintr r) then r else loop a f (n + 1))
  in
  fun a f -> loop a f 0
;;

let syscall_result2 =
  let rec loop a b f n =
    if n >= max_tries
    then raise too_many_tries
    else (
      let r = f a b in
      if not (is_eintr r) then r else loop a b f (n + 1))
  in
  fun a b f -> loop a b f 0
;;
OCaml

Innovation. Community. Security.