about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRobert Clipsham <robert@octarineparrot.com>2014-07-11 10:11:14 +0100
committerRobert Clipsham <robert@octarineparrot.com>2014-07-15 15:17:03 +0100
commite1fc3a6f44b2081b3dc86b6569c3a4f15b9edd5d (patch)
treed14d1635f9f26d649353155e4ae24281f9db0029
parente11e094c0a90e1a518ea996f826abdf3ad0e4cbb (diff)
downloadrust-e1fc3a6f44b2081b3dc86b6569c3a4f15b9edd5d.tar.gz
rust-e1fc3a6f44b2081b3dc86b6569c3a4f15b9edd5d.zip
Add low level support for polling with librustuv.
 * Adds functions for using arbitrary sockets with libuv
 * Adds types and functions required to support this.
-rw-r--r--src/librustuv/uvll.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/librustuv/uvll.rs b/src/librustuv/uvll.rs
index 863536a4111..ba7ebee01a1 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,