uvbook icon indicating copy to clipboard operation
uvbook copied to clipboard

(on Windows) the spawn example hangs

Open thehoglet opened this issue 8 years ago • 2 comments

Referring to this code...

Please also refer to this, which I think might be relevant.

After the call to uv_close() in the on_exit callback, the next time the following executes in core.c:498:

if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT) timeout = uv_backend_timeout(loop);

uv_backend_timeout returns INFINITE. When the next loop then reaches core.c:420 (uv_poll_ex):

success = pGetQueuedCompletionStatusEx(loop->iocp, overlappeds, ARRAY_SIZE(overlappeds), &count, timeout, FALSE);

the program (unsurprisingly) hangs.

Two possible workarounds that fix the issue are:

  1. call uv_stop(uv_default_loop()); after the call to uv_close(), or

  2. in the last line in main.c, replace this:

return uv_run(loop, UV_RUN_DEFAULT);

with

while (0 != uv_run(loop, UV_RUN_ONCE)); return 0;

I am new to libuv. If the above two options are incorrect or ill-advised, what is the correct fix for this?

thehoglet avatar Oct 20 '16 18:10 thehoglet

Thanks for raising this and investigating. joyent/libuv#796 is really old and closed so I'm not sure if that helps directly, but is useful context. @saghul Do you have any thoughts? Am I using uv_close() wrong? Thank you.

nikhilm avatar Oct 20 '16 19:10 nikhilm

@nikhilm No, I don't think you are using uv_close() wrongly. I just took the latest libuv source and rebuilt. The sample code now runs as expected, as do the unit tests for uv_spawn.

As you pointed out, the issue I cited was old and probably irrelevant. I should have been looking here:

History for libuv/src/win/core.c

where a revert took place recently to correct a break.

Thanks for the book. The book and code are very helpful.

thehoglet avatar Oct 22 '16 10:10 thehoglet