From: Konstantin Osipov <kostja.osipov@gmail.com> To: Cyrill Gorcunov <gorcunov@gmail.com> Cc: tml <tarantool-patches@dev.tarantool.org> Subject: Re: [Tarantool-patches] [PATCH v6 2/4] popen: Introduce a backend engine Date: Fri, 20 Dec 2019 11:11:59 +0300 [thread overview] Message-ID: <20191220081159.GG30445@atlas> (raw) In-Reply-To: <20191217125420.20881-3-gorcunov@gmail.com> * Cyrill Gorcunov <gorcunov@gmail.com> [19/12/17 15:57]: > +/* Children pids map popen_handle map */ map popen_handle map? Even if I remove double "map" I don't undesrtand the ocmment. Is it pid -> popen_handle() map? How is it used? For waitpid? Please explain in the comment. > +static struct mh_i32ptr_t *popen_pids_map = NULL; > + > +/* All popen handles to be able to cleanup them on exit */ at exit > +static RLIST_HEAD(popen_head); > + > +/* /dev/null to be used inside children if requested */ This is a bit too sketchy. Please explain: how it is requested, what it is used for, etc. I can of course guess that it's used as children stdin/stdout, if there is an option to popen(), but that's it. > +static int dev_null_fd_ro = -1; > +static int dev_null_fd_wr = -1; > +/** > + * handle_free - free memory allocated for a handle > + * @handle: popen handle to free > + * > + * Just to match handle_new(). > + */ > +static void > +handle_free(struct popen_handle *handle) > +{ > + say_debug("popen: handle %p free %p", handle); > + free(handle); > +} I don't understand who owns char *command and why it's not freed here. Could you please clarify? > + return coio_write_fd_timeout(handle->fds[idx], > + buf, count, timeout); You could store struct coio for each child stream in the handle, it's pretty cheap. I don't have a strong opinion on this, your implementation looks tidy (although has some overhead). > +/** > + * popen_notify_sigchld - notify popen subsistem about SIGCHLD event subsystem > + if (WIFEXITED(wstatus) || WIFSIGNALED(wstatus)) { > + assert(handle->pid == pid); > + /* > + * libev calls for waitpid by self so > + * we don't have to wait here. > + */ > + popen_unregister(handle); > + /* > + * Since SIGCHLD may come to us not > + * due to exit/kill reason (consider > + * a case when someone stopped a child > + * process) we should continue wathcing > + * state changes, thus we stop monitoring > + * dead children only. > + */ > + say_debug("popen: ev_child_stop %d", handle->pid); > + ev_child_stop(EV_DEFAULT_ &handle->ev_sigchld); > + handle->pid = -1; > + } I don't understand how the code matches the comment. You write "we should continue watching state changes" inside a branch that handles termination. How is this comment relevant to what you are doing in this branch? Why do you have to cast handle->ev_sigchld to EV_DEFAULT_? > +} > + > +/** > + * ev_sigchld_cb - handle SIGCHLD from a child process > + * @w: a child exited > + * @revents: unused > + */ > +static void > +ev_sigchld_cb(EV_P_ ev_child *w, int revents) > +{ > + (void)revents; > + /* > + * Stop watching this child, libev will > + * remove it from own hashtable. > + */ > + ev_child_stop(EV_A_ w); > + > + /* > + * The reason for a separate helper is that > + * we might need to notify more subsystems > + * in future. > + */ > + popen_notify_sigchld(w->rpid, w->rstatus); I think ev_sigchld_cb is a too general name. Besides, why do you need two functions, and call one from another? > + if (handle->flags & POPEN_FLAGS_SETSID) { > + if (signo == SIGKILL || signo == SIGTERM) { > + say_debug("popen: killpg %d signo %d", > + handle->pid, signo); > + ret = killpg(handle->pid, signo); I don't understand why you need to use killpg() here. Could you please explain? I suspect that you don't, you're just trying to be safe, and there is no need to. > + if (handle->fds[i] != -1) { > + /* > + * We might did some i/o on > + * this fd, so make sure > + * libev removed it from > + * watching before close. > + * > + * Calling coio_close on > + * fd which never been watched > + * if safe. > + */ > + coio_close(handle->fds[i]); Ugh. This definitely suggests you need a coio object in popen_handle(), this coio_close() looks like a hack. -- Konstantin Osipov, Moscow, Russia
next prev parent reply other threads:[~2019-12-20 8:12 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-12-17 12:54 [Tarantool-patches] [PATCH v6 0/4] popen: Add ability to run external process Cyrill Gorcunov 2019-12-17 12:54 ` [Tarantool-patches] [PATCH v6 1/4] coio: Export helpers and provide coio_read_fd_timeout Cyrill Gorcunov 2019-12-20 7:48 ` Konstantin Osipov 2019-12-20 14:50 ` Cyrill Gorcunov 2019-12-17 12:54 ` [Tarantool-patches] [PATCH v6 2/4] popen: Introduce a backend engine Cyrill Gorcunov 2019-12-20 8:11 ` Konstantin Osipov [this message] 2019-12-20 11:52 ` Cyrill Gorcunov 2019-12-20 12:04 ` Konstantin Osipov 2019-12-20 12:10 ` Cyrill Gorcunov 2019-12-20 12:11 ` Alexander Turenko 2019-12-26 7:14 ` Konstantin Osipov 2019-12-26 7:19 ` Cyrill Gorcunov 2020-01-09 11:23 ` Cyrill Gorcunov 2019-12-17 12:54 ` [Tarantool-patches] [PATCH v6 3/4] popen/lua: Add popen module Cyrill Gorcunov 2019-12-20 15:41 ` Maxim Melentiev 2019-12-17 12:54 ` [Tarantool-patches] [PATCH v6 4/4] popen/test: Add base test cases Cyrill Gorcunov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20191220081159.GG30445@atlas \ --to=kostja.osipov@gmail.com \ --cc=gorcunov@gmail.com \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v6 2/4] popen: Introduce a backend engine' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox