package picos

  1. Overview
  2. Docs

Source file picos_fd.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
let report_leaks = ref true

include
  Picos_rc.Make
    (struct
      type t = Unix.file_descr

      let equal : t -> t -> bool = ( == )

      let hash (fd : t) =
        if Obj.is_int (Obj.repr fd) then Obj.magic fd else Hashtbl.hash fd

      let dispose = Unix.close
    end)
    ()

let () =
  Stdlib.at_exit @@ fun () ->
  if !report_leaks then
    infos ()
    |> Seq.iter @@ fun info ->
       if 0 < info.count && info.dispose then begin
         if Obj.is_int (Obj.repr info.resource) then
           Printf.eprintf "Leaked file descriptor (%d).\n%!"
             (Obj.magic info.resource)
         else Printf.eprintf "Leaked file descriptor.\n%!";
         match Printexc.backtrace_slots info.bt with
         | None -> ()
         | Some slots ->
             slots
             |> Array.iteri @@ fun i slot ->
                if i <> 0 then
                  Printexc.Slot.format i slot
                  |> Option.iter (Printf.eprintf "  %s\n%!")
       end
OCaml

Innovation. Community. Security.