unix: preserve loop->data across loop init/done
Libuv leaves loop->data unchanged in uv_loop_init() and uv_loop_done() on Windows but it clobbered it on UNIX platforms. This commit fixes that inconsistency. PR-URL: https://github.com/libuv/libuv/pull/951 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com>
This commit is contained in:
parent
f001a67e1d
commit
ff0ae10496
@ -28,11 +28,15 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
int uv_loop_init(uv_loop_t* loop) {
|
int uv_loop_init(uv_loop_t* loop) {
|
||||||
|
void* saved_data;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
uv__signal_global_once_init();
|
uv__signal_global_once_init();
|
||||||
|
|
||||||
|
saved_data = loop->data;
|
||||||
memset(loop, 0, sizeof(*loop));
|
memset(loop, 0, sizeof(*loop));
|
||||||
|
loop->data = saved_data;
|
||||||
|
|
||||||
heap_init((struct heap*) &loop->timer_heap);
|
heap_init((struct heap*) &loop->timer_heap);
|
||||||
QUEUE_INIT(&loop->wq);
|
QUEUE_INIT(&loop->wq);
|
||||||
QUEUE_INIT(&loop->active_reqs);
|
QUEUE_INIT(&loop->active_reqs);
|
||||||
|
|||||||
@ -613,6 +613,7 @@ uv_loop_t* uv_loop_new(void) {
|
|||||||
int uv_loop_close(uv_loop_t* loop) {
|
int uv_loop_close(uv_loop_t* loop) {
|
||||||
QUEUE* q;
|
QUEUE* q;
|
||||||
uv_handle_t* h;
|
uv_handle_t* h;
|
||||||
|
void* saved_data;
|
||||||
|
|
||||||
if (!QUEUE_EMPTY(&(loop)->active_reqs))
|
if (!QUEUE_EMPTY(&(loop)->active_reqs))
|
||||||
return UV_EBUSY;
|
return UV_EBUSY;
|
||||||
@ -626,7 +627,9 @@ int uv_loop_close(uv_loop_t* loop) {
|
|||||||
uv__loop_close(loop);
|
uv__loop_close(loop);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
|
saved_data = loop->data;
|
||||||
memset(loop, -1, sizeof(*loop));
|
memset(loop, -1, sizeof(*loop));
|
||||||
|
loop->data = saved_data;
|
||||||
#endif
|
#endif
|
||||||
if (loop == default_loop_ptr)
|
if (loop == default_loop_ptr)
|
||||||
default_loop_ptr = NULL;
|
default_loop_ptr = NULL;
|
||||||
|
|||||||
@ -34,7 +34,9 @@ TEST_IMPL(loop_close) {
|
|||||||
int r;
|
int r;
|
||||||
uv_loop_t loop;
|
uv_loop_t loop;
|
||||||
|
|
||||||
|
loop.data = &loop;
|
||||||
ASSERT(0 == uv_loop_init(&loop));
|
ASSERT(0 == uv_loop_init(&loop));
|
||||||
|
ASSERT(loop.data == (void*) &loop);
|
||||||
|
|
||||||
uv_timer_init(&loop, &timer_handle);
|
uv_timer_init(&loop, &timer_handle);
|
||||||
uv_timer_start(&timer_handle, timer_cb, 100, 100);
|
uv_timer_start(&timer_handle, timer_cb, 100, 100);
|
||||||
@ -47,7 +49,9 @@ TEST_IMPL(loop_close) {
|
|||||||
r = uv_run(&loop, UV_RUN_DEFAULT);
|
r = uv_run(&loop, UV_RUN_DEFAULT);
|
||||||
ASSERT(r == 0);
|
ASSERT(r == 0);
|
||||||
|
|
||||||
|
ASSERT(loop.data == (void*) &loop);
|
||||||
ASSERT(0 == uv_loop_close(&loop));
|
ASSERT(0 == uv_loop_close(&loop));
|
||||||
|
ASSERT(loop.data == (void*) &loop);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user