From 0334f84d7012e2930aa3d735e3c95f156bb3a679 Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Wed, 26 Nov 2014 21:40:17 +0000 Subject: Simplify the mparse_open()/mparse_wait() interface. Don't bother the user with the PID of the child process, store it inside the opaque mparse handle. --- TODO | 5 ++++- main.c | 12 ++++-------- mandoc.3 | 14 ++------------ mandoc.h | 7 +++---- mandocdb.c | 9 +++------ read.c | 19 +++++++++++-------- 6 files changed, 27 insertions(+), 39 deletions(-) diff --git a/TODO b/TODO index b6322622..98cb687e 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,6 @@ ************************************************************************ * Official mandoc TODO. -* $Id: TODO,v 1.188 2014/11/20 02:21:27 schwarze Exp $ +* $Id: TODO,v 1.189 2014/11/26 21:40:17 schwarze Exp $ ************************************************************************ Many issues are annotated for difficulty as follows: @@ -564,6 +564,9 @@ Several areas can be cleaned up to make mandoc even faster. These are * structural issues ************************************************************************ +- Use libz directly instead of forking gunzip(1). + Suggested by bapt at FreeBSD among others. + - We use the input line number at several places to distinguish same-line from different-line input. That plainly doesn't work with user-defined macros, leading to random breakage. diff --git a/main.c b/main.c index 63ac45e8..34784994 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.199 2014/11/11 19:04:55 schwarze Exp $ */ +/* $Id: main.c,v 1.200 2014/11/26 21:40:17 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010, 2011, 2012, 2014 Ingo Schwarze @@ -115,7 +115,6 @@ main(int argc, char *argv[]) #endif enum mandoclevel rc; enum outmode outmode; - pid_t child_pid; int fd; int show_usage; int use_pager; @@ -388,8 +387,7 @@ main(int argc, char *argv[]) while (argc) { #if HAVE_SQLITE3 if (resp != NULL) { - rc = mparse_open(curp.mp, &fd, resp->file, - &child_pid); + rc = mparse_open(curp.mp, &fd, resp->file); if (fd == -1) /* nothing */; else if (resp->form & FORM_SRC) { @@ -403,14 +401,12 @@ main(int argc, char *argv[]) } else #endif { - rc = mparse_open(curp.mp, &fd, *argv++, - &child_pid); + rc = mparse_open(curp.mp, &fd, *argv++); if (fd != -1) parse(&curp, fd, argv[-1], &rc); } - if (child_pid && - mparse_wait(curp.mp, child_pid) != MANDOCLEVEL_OK) + if (mparse_wait(curp.mp) != MANDOCLEVEL_OK) rc = MANDOCLEVEL_SYSERR; if (MANDOCLEVEL_OK != rc && curp.wstop) diff --git a/mandoc.3 b/mandoc.3 index f03b0307..08a0d168 100644 --- a/mandoc.3 +++ b/mandoc.3 @@ -1,4 +1,4 @@ -.\" $Id: mandoc.3,v 1.27 2014/10/28 17:36:19 schwarze Exp $ +.\" $Id: mandoc.3,v 1.28 2014/11/26 21:40:17 schwarze Exp $ .\" .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons .\" Copyright (c) 2010 Ingo Schwarze @@ -15,7 +15,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: October 28 2014 $ +.Dd $Mdocdate: November 26 2014 $ .Dt MANDOC 3 .Os .Sh NAME @@ -81,7 +81,6 @@ .Fa "struct mparse *parse" .Fa "int *fd" .Fa "const char *fname" -.Fa "pid_t *child_pid" .Fc .Ft "enum mandoclevel" .Fo mparse_readfd @@ -111,7 +110,6 @@ .Ft "enum mandoclevel" .Fo mparse_wait .Fa "struct mparse *parse" -.Fa "pid_t child_pid" .Fc .In sys/types.h .In mandoc.h @@ -404,14 +402,6 @@ or -1 on failure. It can be passed to .Fn mparse_readfd or used directly. -If applicable, return the -.Xr gunzip 1 -child process ID in -.Fa child_pid , -or otherwise 0. -If non-zero, it should be passed to -.Fn mparse_wait -after completing the parse sequence. Declared in .In mandoc.h , implemented in diff --git a/mandoc.h b/mandoc.h index f3dff946..80a7bfc1 100644 --- a/mandoc.h +++ b/mandoc.h @@ -1,4 +1,4 @@ -/* $Id: mandoc.h,v 1.168 2014/10/29 00:17:43 schwarze Exp $ */ +/* $Id: mandoc.h,v 1.169 2014/11/26 21:40:17 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -436,8 +436,7 @@ struct mparse *mparse_alloc(int, enum mandoclevel, mandocmsg, const struct mchars *, const char *); void mparse_free(struct mparse *); void mparse_keep(struct mparse *); -enum mandoclevel mparse_open(struct mparse *, int *, const char *, - pid_t *); +enum mandoclevel mparse_open(struct mparse *, int *, const char *); enum mandoclevel mparse_readfd(struct mparse *, int, const char *); enum mandoclevel mparse_readmem(struct mparse *, const void *, size_t, const char *); @@ -447,7 +446,7 @@ void mparse_result(struct mparse *, const char *mparse_getkeep(const struct mparse *); const char *mparse_strerror(enum mandocerr); const char *mparse_strlevel(enum mandoclevel); -enum mandoclevel mparse_wait(struct mparse *, pid_t); +enum mandoclevel mparse_wait(struct mparse *); __END_DECLS diff --git a/mandocdb.c b/mandocdb.c index 7d9caf23..7377d847 100644 --- a/mandocdb.c +++ b/mandocdb.c @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.169 2014/11/19 20:40:51 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.170 2014/11/26 21:40:17 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -1084,7 +1084,6 @@ mpages_merge(struct mchars *mc, struct mparse *mp) struct man *man; char *sodest; char *cp; - pid_t child_pid; int fd; unsigned int pslot; enum mandoclevel lvl; @@ -1112,9 +1111,8 @@ mpages_merge(struct mchars *mc, struct mparse *mp) mdoc = NULL; man = NULL; sodest = NULL; - child_pid = 0; - mparse_open(mp, &fd, mpage->mlinks->file, &child_pid); + mparse_open(mp, &fd, mpage->mlinks->file); if (fd == -1) { say(mpage->mlinks->file, "&open"); goto nextpage; @@ -1231,8 +1229,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp) dbadd(mpage, mc); nextpage: - if (child_pid && - mparse_wait(mp, child_pid) != MANDOCLEVEL_OK) { + if (mparse_wait(mp) != MANDOCLEVEL_OK) { exitcode = (int)MANDOCLEVEL_SYSERR; say(mpage->mlinks->file, "&wait gunzip"); } diff --git a/read.c b/read.c index 5bd5de57..cad96e2d 100644 --- a/read.c +++ b/read.c @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.96 2014/11/01 06:03:13 schwarze Exp $ */ +/* $Id: read.c,v 1.97 2014/11/26 21:40:17 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -64,6 +64,7 @@ struct mparse { int filenc; /* encoding of the current file */ int reparse_count; /* finite interp. stack */ int line; /* line number in the file */ + pid_t child; /* the gunzip(1) process */ }; static void choose_parser(struct mparse *); @@ -823,8 +824,7 @@ mparse_readfd(struct mparse *curp, int fd, const char *file) } enum mandoclevel -mparse_open(struct mparse *curp, int *fd, const char *file, - pid_t *child_pid) +mparse_open(struct mparse *curp, int *fd, const char *file) { int pfd[2]; char *cp; @@ -834,7 +834,7 @@ mparse_open(struct mparse *curp, int *fd, const char *file, curp->file = file; if ((cp = strrchr(file, '.')) == NULL || strcmp(cp + 1, "gz")) { - *child_pid = 0; + curp->child = 0; if ((*fd = open(file, O_RDONLY)) == -1) { err = MANDOCERR_SYSOPEN; goto out; @@ -847,7 +847,7 @@ mparse_open(struct mparse *curp, int *fd, const char *file, goto out; } - switch (*child_pid = fork()) { + switch (curp->child = fork()) { case -1: err = MANDOCERR_SYSFORK; close(pfd[0]); @@ -871,7 +871,7 @@ mparse_open(struct mparse *curp, int *fd, const char *file, out: *fd = -1; - *child_pid = 0; + curp->child = 0; curp->file_status = MANDOCLEVEL_SYSERR; if (curp->mmsg) (*curp->mmsg)(err, curp->file_status, file, @@ -882,11 +882,14 @@ out: } enum mandoclevel -mparse_wait(struct mparse *curp, pid_t child_pid) +mparse_wait(struct mparse *curp) { int status; - if (waitpid(child_pid, &status, 0) == -1) { + if (curp->child == 0) + return(MANDOCLEVEL_OK); + + if (waitpid(curp->child, &status, 0) == -1) { mandoc_msg(MANDOCERR_SYSWAIT, curp, 0, 0, strerror(errno)); curp->file_status = MANDOCLEVEL_SYSERR; -- cgit v1.2.3-56-ge451