From e1fc3a6f44b2081b3dc86b6569c3a4f15b9edd5d Mon Sep 17 00:00:00 2001 From: Robert Clipsham Date: Fri, 11 Jul 2014 10:11:14 +0100 Subject: [PATCH] Add low level support for polling with librustuv. * Adds functions for using arbitrary sockets with libuv * Adds types and functions required to support this. --- src/librustuv/uvll.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/librustuv/uvll.rs b/src/librustuv/uvll.rs index 863536a411101..ba7ebee01a14f 100644 --- a/src/librustuv/uvll.rs +++ b/src/librustuv/uvll.rs @@ -107,6 +107,9 @@ pub struct uv_buf_t { pub len: uv_buf_len_t, } +#[cfg(unix)] +pub type uv_os_socket_t = c_int; + // see libuv/include/uv-win.h #[cfg(windows)] pub struct uv_buf_t { @@ -114,6 +117,9 @@ pub struct uv_buf_t { pub base: *mut u8, } +#[cfg(windows)] +pub type uv_os_socket_t = libc::SOCKET; + #[repr(C)] pub enum uv_run_mode { RUN_DEFAULT = 0, @@ -121,6 +127,12 @@ pub enum uv_run_mode { RUN_NOWAIT, } +#[repr(C)] +pub enum uv_poll_event { + UV_READABLE = 1, + UV_WRITABLE = 2, +} + pub struct uv_process_options_t { pub exit_cb: uv_exit_cb, pub file: *const libc::c_char, @@ -148,6 +160,7 @@ pub type uv_loop_t = c_void; pub type uv_idle_t = c_void; pub type uv_tcp_t = c_void; pub type uv_udp_t = c_void; +pub type uv_poll_t = c_void; pub type uv_connect_t = c_void; pub type uv_connection_t = c_void; pub type uv_write_t = c_void; @@ -231,6 +244,9 @@ pub type uv_udp_recv_cb = extern "C" fn(handle: *mut uv_udp_t, addr: *const sockaddr, flags: c_uint); pub type uv_close_cb = extern "C" fn(handle: *mut uv_handle_t); +pub type uv_poll_cb = extern "C" fn(handle: *mut uv_poll_t, + status: c_int, + events: c_int); pub type uv_walk_cb = extern "C" fn(handle: *mut uv_handle_t, arg: *mut c_void); pub type uv_async_cb = extern "C" fn(handle: *mut uv_async_t); @@ -649,6 +665,11 @@ extern { pub fn uv_fs_lstat(handle: *mut uv_loop_t, req: *mut uv_fs_t, file: *const c_char, cb: uv_fs_cb) -> c_int; + // poll bindings + pub fn uv_poll_init_socket(l: *mut uv_loop_t, h: *mut uv_poll_t, s: uv_os_socket_t) -> c_int; + pub fn uv_poll_start(h: *mut uv_poll_t, events: c_int, cb: uv_poll_cb) -> c_int; + pub fn uv_poll_stop(h: *mut uv_poll_t) -> c_int; + // getaddrinfo pub fn uv_getaddrinfo(loop_: *mut uv_loop_t, req: *mut uv_getaddrinfo_t, getaddrinfo_cb: uv_getaddrinfo_cb,