##// END OF EJS Templates
chg: let procutil maintain its own pagerpid...
Jun Wu -
r30692:23ddd43b default
parent child Browse files
Show More
@@ -431,15 +431,14 b' int main(int argc, const char *argv[], c'
431
431
432 setupsignalhandler(hgc_peerpid(hgc), hgc_peerpgid(hgc));
432 setupsignalhandler(hgc_peerpid(hgc), hgc_peerpgid(hgc));
433 const char *pagercmd = hgc_getpager(hgc, argv + 1, argc - 1);
433 const char *pagercmd = hgc_getpager(hgc, argv + 1, argc - 1);
434 pagerpid = setuppager(pagercmd);
434 pid_t pagerpid = setuppager(pagercmd);
435 if (pagerpid)
435 if (pagerpid)
436 hgc_attachio(hgc); /* reattach to pager */
436 hgc_attachio(hgc); /* reattach to pager */
437 int exitcode = hgc_runcommand(hgc, argv + 1, argc - 1);
437 int exitcode = hgc_runcommand(hgc, argv + 1, argc - 1);
438 restoresignalhandler();
438 restoresignalhandler();
439 hgc_close(hgc);
439 hgc_close(hgc);
440 freecmdserveropts(&opts);
440 freecmdserveropts(&opts);
441 if (pagerpid)
441 waitpager();
442 waitpager(pagerpid);
443
442
444 return exitcode;
443 return exitcode;
445 }
444 }
@@ -159,6 +159,7 b' error:'
159 * Return 0 if pager is not started, or pid of the pager */
159 * Return 0 if pager is not started, or pid of the pager */
160 static pid_t setuppager(const char *pagercmd)
160 static pid_t setuppager(const char *pagercmd)
161 {
161 {
162 assert(pagerpid == 0);
162 if (!pagercmd)
163 if (!pagercmd)
163 return 0;
164 return 0;
164
165
@@ -177,6 +178,7 b' static pid_t setuppager(const char *page'
177 goto error;
178 goto error;
178 }
179 }
179 close(pipefds[1]);
180 close(pipefds[1]);
181 pagerpid = pid;
180 return pid;
182 return pid;
181 } else {
183 } else {
182 dup2(pipefds[0], fileno(stdin));
184 dup2(pipefds[0], fileno(stdin));
@@ -197,13 +199,16 b' error:'
197 return 0;
199 return 0;
198 }
200 }
199
201
200 static void waitpager(pid_t pid)
202 static void waitpager(void)
201 {
203 {
204 if (pagerpid == 0)
205 return;
206
202 /* close output streams to notify the pager its input ends */
207 /* close output streams to notify the pager its input ends */
203 fclose(stdout);
208 fclose(stdout);
204 fclose(stderr);
209 fclose(stderr);
205 while (1) {
210 while (1) {
206 pid_t ret = waitpid(pid, NULL, 0);
211 pid_t ret = waitpid(pagerpid, NULL, 0);
207 if (ret == -1 && errno == EINTR)
212 if (ret == -1 && errno == EINTR)
208 continue;
213 continue;
209 break;
214 break;
General Comments 0
You need to be logged in to leave comments. Login now