unix, windows: add uv_loop_configure() function
The only supported option right now is UV_LOOP_BLOCK_SIGNAL, which only supports the SIGPROF signal and only on UNIX platforms. So yes, it is kind of limited right now. But everything has to start somewhere. Refs strongloop/strong-agent#3 and strongloop-internal/scrum-cs#37. PR-URL: https://github.com/libuv/libuv/pull/15 Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
This commit is contained in:
parent
2daf9448b1
commit
9da5fd443e
19
include/uv.h
19
include/uv.h
@ -226,6 +226,16 @@ typedef struct uv_work_s uv_work_t;
|
|||||||
typedef struct uv_cpu_info_s uv_cpu_info_t;
|
typedef struct uv_cpu_info_s uv_cpu_info_t;
|
||||||
typedef struct uv_interface_address_s uv_interface_address_t;
|
typedef struct uv_interface_address_s uv_interface_address_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
/* Block a signal when polling for new events. The second argument to
|
||||||
|
* uv_loop_configure() is the signal number.
|
||||||
|
*
|
||||||
|
* This operation is currently only implemented for SIGPROF signals,
|
||||||
|
* to suppress unnecessary wakeups when using a sampling profiler.
|
||||||
|
* Requesting other signals will fail with UV_EINVAL.
|
||||||
|
*/
|
||||||
|
UV_LOOP_BLOCK_SIGNAL
|
||||||
|
} uv_loop_option;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
UV_RUN_DEFAULT = 0,
|
UV_RUN_DEFAULT = 0,
|
||||||
@ -264,6 +274,15 @@ UV_EXTERN void uv_loop_delete(uv_loop_t*);
|
|||||||
*/
|
*/
|
||||||
UV_EXTERN uv_loop_t* uv_default_loop(void);
|
UV_EXTERN uv_loop_t* uv_default_loop(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set additional loop options. You should normally call this before the
|
||||||
|
* first call to uv_run() unless mentioned otherwise.
|
||||||
|
*
|
||||||
|
* Returns 0 on success or a UV_E* error code on failure. Be prepared to
|
||||||
|
* handle UV_ENOSYS; it means the loop option is not supported by the platform.
|
||||||
|
*/
|
||||||
|
UV_EXTERN int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function runs the event loop. It will act differently depending on the
|
* This function runs the event loop. It will act differently depending on the
|
||||||
* specified mode:
|
* specified mode:
|
||||||
|
|||||||
@ -112,3 +112,15 @@ void uv__loop_delete(uv_loop_t* loop) {
|
|||||||
loop->watchers = NULL;
|
loop->watchers = NULL;
|
||||||
loop->nwatchers = 0;
|
loop->nwatchers = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap) {
|
||||||
|
if (option != UV_LOOP_BLOCK_SIGNAL)
|
||||||
|
return UV_ENOSYS;
|
||||||
|
|
||||||
|
if (va_arg(ap, int) != SIGPROF)
|
||||||
|
return UV_EINVAL;
|
||||||
|
|
||||||
|
loop->flags |= UV_LOOP_BLOCK_SIGPROF;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stddef.h> /* NULL */
|
#include <stddef.h> /* NULL */
|
||||||
#include <stdlib.h> /* malloc */
|
#include <stdlib.h> /* malloc */
|
||||||
#include <string.h> /* memset */
|
#include <string.h> /* memset */
|
||||||
@ -434,3 +435,16 @@ void uv_stop(uv_loop_t* loop) {
|
|||||||
uint64_t uv_now(uv_loop_t* loop) {
|
uint64_t uv_now(uv_loop_t* loop) {
|
||||||
return loop->time;
|
return loop->time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...) {
|
||||||
|
va_list ap;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
va_start(ap, option);
|
||||||
|
/* Any platform-agnostic options should be handled here. */
|
||||||
|
err = uv__loop_configure(loop, option, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
#define UV_COMMON_H_
|
#define UV_COMMON_H_
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1600
|
#if defined(_MSC_VER) && _MSC_VER < 1600
|
||||||
@ -77,6 +78,7 @@ int uv__set_artificial_error(uv_loop_t* loop, uv_err_code code);
|
|||||||
uv_err_t uv__new_sys_error(int sys_error);
|
uv_err_t uv__new_sys_error(int sys_error);
|
||||||
uv_err_t uv__new_artificial_error(uv_err_code code);
|
uv_err_t uv__new_artificial_error(uv_err_code code);
|
||||||
|
|
||||||
|
int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap);
|
||||||
int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr);
|
int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr);
|
||||||
int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr);
|
int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr);
|
||||||
|
|
||||||
|
|||||||
@ -174,6 +174,11 @@ void uv_loop_delete(uv_loop_t* loop) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap) {
|
||||||
|
return UV_ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int uv_backend_fd(const uv_loop_t* loop) {
|
int uv_backend_fd(const uv_loop_t* loop) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user