-
Notifications
You must be signed in to change notification settings - Fork 73
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Eio_unix: add FD passing #522
Conversation
This is surprisingly clean, even with the type parameter! It doesnt add one to the actual socket type, which would be more difficult I think. Looks good to me... |
5fa3479
to
510f5e3
Compare
This is now on top of #549. The types will probably change again before Eio 0.11 due to the variants work, but I think it's best to get the functionality in now, and build the variants work on top of it to make sure that the new system can handle the extra complexity. |
Actually, I think this will work better as a PR on top of #553. |
5e829ef
to
2aabcb2
Compare
3a1b7e0
to
06cdb02
Compare
d74219b
to
35e8451
Compare
The normal ways of getting a socket don't include it anyway, and we can infer it from something being a Unix socket.
CHANGES: New features / API changes: - Replace objects with variants (@talex5 @patricoferris ocaml-multicore/eio#553 ocaml-multicore/eio#605 ocaml-multicore/eio#608, reviewed by @avsm). Some potential users found object types confusing, so we now use an alternative scheme for OS resources. For users of the resources, the only thing that changes is the types: - Instead of taking an argument of type `#foo`, you should now take `_ foo`. - Instead of returning a value of type `foo`, you should now return `foo_ty Eio.Resource.t`. To provide your own implementation of an interface, you now provide a module rather than an object. For example, to provide your own source flow, use `Eio.Flow.Pi.source (module My_source)`. If you want to define your own interfaces, see the `Eio.Resource` module documentation. - Add `Eio.Pool` (@talex5 @darrenldl ocaml-multicore/eio#602, reviewed by @patricoferris). A lock-free pool of resources. This is similar to `Lwt_pool`. - Add `Eio.Lazy` (@talex5 ocaml-multicore/eio#609, reviewed by @SGrondin). If one fiber tries to force a lazy value while another is already doing it, this will wait for the first one to finish rather than raising an exception (as `Stdlib.Lazy` does). - Add `Eio.Path.native` (@talex5 ocaml-multicore/eio#603, reviewed by @patricoferris). This is useful when interacting with non-Eio libraries, for spawning sub-processes, and for displaying paths to users. - Add `Flow.single_write` (@talex5 ocaml-multicore/eio#598). - Add `Eio.Flow.Pi.simple_copy` (@talex5 ocaml-multicore/eio#611). Provides an easy way to implement the `copy` operation when making your own sink. - Eio_unix: add FD passing (@talex5 ocaml-multicore/eio#522). Allows opening a file and passing the handle over a Unix-domain socket. - Add `Process.run ?is_success` to control definition of success (@SGrondin ocaml-multicore/eio#586, reviewed by @talex5). - Add `Eio_mock.Domain_manager` (@talex5 ocaml-multicore/eio#610). This mock domain manager runs everything in a single domain, allowing tests to remain deterministic. - Add `Eio.Debug.with_trace_prefix` (@talex5 ocaml-multicore/eio#610). Allows prefixing all `traceln` output. The mock domain manager uses this to indicate which fake domain is running. Bug fixes: - Fork actions must not allocate (@talex5 ocaml-multicore/eio#593). When using multiple domains, child processes could get stuck if they forked while another domain held the malloc lock. - eio_posix: ignore some errors writing to the wake-up pipe (@talex5 ocaml-multicore/eio#600). If the pipe is full or closed, the wake-up should simply be ignored. Build/test fixes: - Fix some MDX problems on Windows (@polytypic ocaml-multicore/eio#597). - The README depends on kcas (@talex5 ocaml-multicore/eio#606). - Clarify configuration for lib_eio_linux and enable tests on other arches (@dra27 ocaml-multicore/eio#592). - eio_linux tests: skip fixed buffer test if not available (@talex5 ocaml-multicore/eio#604). - eio_windows: update available line to win32 (@talex5 ocaml-multicore/eio#588 ocaml-multicore/eio#591).
CHANGES: New features / API changes: - Replace objects with variants (@talex5 @patricoferris ocaml-multicore/eio#553 ocaml-multicore/eio#605 ocaml-multicore/eio#608, reviewed by @avsm). Some potential users found object types confusing, so we now use an alternative scheme for OS resources. For users of the resources, the only thing that changes is the types: - Instead of taking an argument of type `#foo`, you should now take `_ foo`. - Instead of returning a value of type `foo`, you should now return `foo_ty Eio.Resource.t`. To provide your own implementation of an interface, you now provide a module rather than an object. For example, to provide your own source flow, use `Eio.Flow.Pi.source (module My_source)`. If you want to define your own interfaces, see the `Eio.Resource` module documentation. - Add `Eio.Pool` (@talex5 @darrenldl ocaml-multicore/eio#602, reviewed by @patricoferris). A lock-free pool of resources. This is similar to `Lwt_pool`. - Add `Eio.Lazy` (@talex5 ocaml-multicore/eio#609, reviewed by @SGrondin). If one fiber tries to force a lazy value while another is already doing it, this will wait for the first one to finish rather than raising an exception (as `Stdlib.Lazy` does). - Add `Eio.Path.native` (@talex5 ocaml-multicore/eio#603, reviewed by @patricoferris). This is useful when interacting with non-Eio libraries, for spawning sub-processes, and for displaying paths to users. - Add `Flow.single_write` (@talex5 ocaml-multicore/eio#598). - Add `Eio.Flow.Pi.simple_copy` (@talex5 ocaml-multicore/eio#611). Provides an easy way to implement the `copy` operation when making your own sink. - Eio_unix: add FD passing (@talex5 ocaml-multicore/eio#522). Allows opening a file and passing the handle over a Unix-domain socket. - Add `Process.run ?is_success` to control definition of success (@SGrondin ocaml-multicore/eio#586, reviewed by @talex5). - Add `Eio_mock.Domain_manager` (@talex5 ocaml-multicore/eio#610). This mock domain manager runs everything in a single domain, allowing tests to remain deterministic. - Add `Eio.Debug.with_trace_prefix` (@talex5 ocaml-multicore/eio#610). Allows prefixing all `traceln` output. The mock domain manager uses this to indicate which fake domain is running. Bug fixes: - Fork actions must not allocate (@talex5 ocaml-multicore/eio#593). When using multiple domains, child processes could get stuck if they forked while another domain held the malloc lock. - eio_posix: ignore some errors writing to the wake-up pipe (@talex5 ocaml-multicore/eio#600). If the pipe is full or closed, the wake-up should simply be ignored. Build/test fixes: - Fix some MDX problems on Windows (@polytypic ocaml-multicore/eio#597). - The README depends on kcas (@talex5 ocaml-multicore/eio#606). - Clarify configuration for lib_eio_linux and enable tests on other arches (@dra27 ocaml-multicore/eio#592). - eio_linux tests: skip fixed buffer test if not available (@talex5 ocaml-multicore/eio#604). - eio_windows: update available line to win32 (@talex5 ocaml-multicore/eio#588 ocaml-multicore/eio#591).
CHANGES: New features / API changes: - Replace objects with variants (@talex5 @patricoferris ocaml-multicore/eio#553 ocaml-multicore/eio#605 ocaml-multicore/eio#608, reviewed by @avsm). Some potential users found object types confusing, so we now use an alternative scheme for OS resources. For users of the resources, the only thing that changes is the types: - Instead of taking an argument of type `#foo`, you should now take `_ foo`. - Instead of returning a value of type `foo`, you should now return `foo_ty Eio.Resource.t`. To provide your own implementation of an interface, you now provide a module rather than an object. For example, to provide your own source flow, use `Eio.Flow.Pi.source (module My_source)`. If you want to define your own interfaces, see the `Eio.Resource` module documentation. - Add `Eio.Pool` (@talex5 @darrenldl ocaml-multicore/eio#602, reviewed by @patricoferris). A lock-free pool of resources. This is similar to `Lwt_pool`. - Add `Eio.Lazy` (@talex5 ocaml-multicore/eio#609, reviewed by @SGrondin). If one fiber tries to force a lazy value while another is already doing it, this will wait for the first one to finish rather than raising an exception (as `Stdlib.Lazy` does). - Add `Eio.Path.native` (@talex5 ocaml-multicore/eio#603, reviewed by @patricoferris). This is useful when interacting with non-Eio libraries, for spawning sub-processes, and for displaying paths to users. - Add `Flow.single_write` (@talex5 ocaml-multicore/eio#598). - Add `Eio.Flow.Pi.simple_copy` (@talex5 ocaml-multicore/eio#611). Provides an easy way to implement the `copy` operation when making your own sink. - Eio_unix: add FD passing (@talex5 ocaml-multicore/eio#522). Allows opening a file and passing the handle over a Unix-domain socket. - Add `Process.run ?is_success` to control definition of success (@SGrondin ocaml-multicore/eio#586, reviewed by @talex5). - Add `Eio_mock.Domain_manager` (@talex5 ocaml-multicore/eio#610). This mock domain manager runs everything in a single domain, allowing tests to remain deterministic. - Add `Eio.Debug.with_trace_prefix` (@talex5 ocaml-multicore/eio#610). Allows prefixing all `traceln` output. The mock domain manager uses this to indicate which fake domain is running. Bug fixes: - Fork actions must not allocate (@talex5 ocaml-multicore/eio#593). When using multiple domains, child processes could get stuck if they forked while another domain held the malloc lock. - eio_posix: ignore some errors writing to the wake-up pipe (@talex5 ocaml-multicore/eio#600). If the pipe is full or closed, the wake-up should simply be ignored. Build/test fixes: - Fix some MDX problems on Windows (@polytypic ocaml-multicore/eio#597). - The README depends on kcas (@talex5 ocaml-multicore/eio#606). - Clarify configuration for lib_eio_linux and enable tests on other arches (@dra27 ocaml-multicore/eio#592). - eio_linux tests: skip fixed buffer test if not available (@talex5 ocaml-multicore/eio#604). - eio_windows: update available line to win32 (@talex5 ocaml-multicore/eio#588 ocaml-multicore/eio#591).
Eio_unix.Net.stream_socket
now provides extra operations for sending and receiving FDs over Unix-domain sockets.This means that calling e.g.
connect
on anEio_unix.Net.t
now returns anEio_unix.Net.stream_socket
, not a plainEio.Net.stream_socket
. This is a problem for OCaml's row polymorphism, since#Net.t
only allows networks with extra methods, not sub-typing of existing ones.Originally, I added new
connect_unix
, etc, methods to get around that, but the problem is that generic functions likerun_server
andaccept_fork
then lose the extra type information.So instead I added a type parameter to
Eio.Net.t
. I thought this might be a bit messy, but it's not too bad. I only had to update one type annotation in the tests (changing#Eio.Net.t
to_ #Eio.Net.t
) and minor changes to capnp-rpc, so I think this is acceptable.This is needed for the Wayland port to Eio (https://github.com/talex5/ocaml-wayland/tree/eio).