Skip to content

Instantly share code, notes, and snippets.

@piscisaureus piscisaureus/uv_poll_t.patch Secret
Created Mar 30, 2012

What would you like to do?
From 46c0dbf392f6262e59f38b1afbbdacfeee7d4683 Mon Sep 17 00:00:00 2001
From: Bert Belder <>
Date: Fri, 30 Mar 2012 18:49:41 +0200
Subject: [PATCH 1/1] Api for polling external sockets
include/uv.h | 37 +++++++++++++++++++++++++++++++++++++
1 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/include/uv.h b/include/uv.h
index 77c6029..1ffdee6 100644
--- a/include/uv.h
+++ b/include/uv.h
@@ -178,6 +178,7 @@ typedef struct uv_tcp_s uv_tcp_t;
typedef struct uv_udp_s uv_udp_t;
typedef struct uv_pipe_s uv_pipe_t;
typedef struct uv_tty_s uv_tty_t;
+typedef struct uv_poll_s uv_poll_t;
typedef struct uv_timer_s uv_timer_t;
typedef struct uv_prepare_s uv_prepare_t;
typedef struct uv_check_s uv_check_t;
@@ -277,6 +278,8 @@ typedef void (*uv_connect_cb)(uv_connect_t* req, int status);
typedef void (*uv_shutdown_cb)(uv_shutdown_t* req, int status);
typedef void (*uv_connection_cb)(uv_stream_t* server, int status);
typedef void (*uv_close_cb)(uv_handle_t* handle);
+typedef void (*uv_poll_cb)(uv_poll_t* handle, int status, int readable,
+ int writable);
typedef void (*uv_timer_cb)(uv_timer_t* handle, int status);
/* TODO: do these really need a status argument? */
typedef void (*uv_async_cb)(uv_async_t* handle, int status);
@@ -888,6 +891,40 @@ UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count);
+ * uv_poll_t is a subclass of uv_handle_t.
+ *
+ * The uv_poll watcher is used to watch file descriptors for readability and
+ * writability, similar to the purpose of poll(2). The purpose of this is to
+ * enable integrating external libraries that rely on on the event loop to
+ * signal it about the socket status changes, like c-ares or libssh2. Using
+ * uv_poll_t for any other other purpose is not recommended; uv_tcp_t, uv_udp_t
+ * etc. provide an implementation that is faster and more scalable than what
+ * you can achieve with uv_poll_t, especially on Windows. Note that on windows
+ * only sockets can be polled with uv_poll. On unix any file descriptor that
+ * would be accepted by poll(2) can be used with uv_poll.
+ */
+struct uv_poll_s {
+/* Initialize the poll watcher using a file descriptor. */
+UV_EXTERN int uv_poll_init(uv_poll_t* handle, int fd);
+/* Initialize the poll watcher using a socket descriptor. On unix this is */
+/* identical to uv_poll_init. On windows it takes a SOCKET handle. */
+UV_EXTERN int uv_poll_init_socket(uv_poll_t* handle,
+ uv_platform_socket_t sock);
+/* Starts polling the file descriptor. */
+UV_EXTERN int uv_poll_start(uv_poll_t*, int readable, int writable,
+ uv_poll_cb cb);
+/* Stops polling the file descriptor. */
+UV_EXTERN int uv_poll_stop(uv_poll_t*);
* uv_prepare_t is a subclass of uv_handle_t.
* libev wrapper. Every active prepare handle gets its callback called
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.