10

I have an application which uses libuv library. it runs default loop:

uv_run(uv_default_loop());

How can the application be gracefully exited in case of a failure? Currently I am doing it like in the following example:

uv_tcp_t* tcp = malloc(sizeof(uv_tcp_t));
int r = uv_tcp_init(uv_default_loop(), tcp);

if (r) {
  free(tcp);
  uv_loop_delete(default_loop);
  exit(EXIT_FAILURE);
}

Should uv_loop_delete function be called? What does it do? Does it drop all pending callback functions? Does it close all currently opened TCP connections? Do I have to do it manually before exiting?

P.S.: Can't add the tag 'libuv' (less than 1500 reputation). Can somebody create and add it?

Prof. Falken
  • 24,226
  • 19
  • 100
  • 173
Andrei Sedoi
  • 1,534
  • 1
  • 15
  • 28
  • Can't see it here http://stackoverflow.com/tags/libuv/info – Prof. Falken Jan 31 '12 at 09:18
  • probably because stackoverflow crashed when I saved the description. Now it doesn't show me the link to edit wiki. Here is excerpt and description that I added: Excerpt: "platform layer for node.js" Description: "libuv is a platform layer for node.js. Its purpose is to abstract IOCP on Windows and libev on Unix systems. It is intended to eventually contain all platform differences in this library. [libuv on github][1] [1] https://github.com/joyent/libuv – Andrei Sedoi Jan 31 '12 at 09:26
  • Ah, I don't have tag the rep to edit tag descriptions either, I can only create tags. – Prof. Falken Jan 31 '12 at 09:31

1 Answers1

4

Declaration of uv_loop_delete is here and source code is here. It looks like this:

void uv_loop_delete(uv_loop_t* loop) {
  uv_ares_destroy(loop, loop->channel);
  ev_loop_destroy(loop->ev);
#if __linux__
  if (loop->inotify_fd == -1) return;
  ev_io_stop(loop->ev, &loop->inotify_read_watcher);
  close(loop->inotify_fd);
  loop->inotify_fd = -1;
#endif
#if HAVE_PORTS_FS
  if (loop->fs_fd != -1)
    close(loop->fs_fd);
#endif
}

It will, effectively, clean every file descriptor it's possible to clean. It will close TCP connection, Inotify connections, Socket used to read events, Pipe fds, etc, etc.

=> Yes, this function will close everything you have opened through libuv.

NB: Anyway, when your application exit, your Operating System will clean and close everything you have left open, without any mercy.

Coren
  • 5,517
  • 1
  • 21
  • 34
  • Sounds logical. OS should release all resources. Thanks Coren – Andrei Sedoi May 18 '12 at 18:54
  • Does this answer still apply for releases 1.x and beyond? – Dave Feb 07 '16 at 21:00
  • @dave yes. uv_loop_delete now calls uv_loop_close which is, in 1.x version, the main entry point for closing everything. – Coren Feb 08 '16 at 08:05
  • Os will release all resources only when you run uv loop in a standalone process. If you run uv loop in a thread, you have to stop the loop and free all resources correctly. – Yugy Jan 16 '23 at 07:59