I have made this patch to avoid having to fg-suspend-fg to get a slave
session back if I have initially suspended it for longer than one
second. I also find this behavior unpleasant because elinks loses its place in
my shell's job control queue as being the default process to foreground
without specifying a job number (because it is running in the background,
even though I did not tell it to do that).
It seems to me that automatically continuing suspended elinks sessions
unrequested behind the back of the user is a bit mysterious and initially
inexplicable for the naive user (like me ;) The following patch allows this
behavior to affect the master only, and be configurable even in that
case. Please let me know what you think. Thanks.
diff -ur elinks-0.12-20071028/src/config/options.inc
elinks-nosusp/src/config/options.inc
--- elinks-0.12-20071028/src/config/options.inc 2007-10-27
15:40:03.000000000 -0700
+++ elinks-nosusp/src/config/options.inc 2007-11-02 22:33:29.000000000
-0700
@@ -1280,6 +1280,17 @@
"sessions", OPT_SORT,
N_("Sessions settings.")),
+#if defined (SIGCONT) && defined(SIGTTOU)
+ /* XXX see comment in signals.c to understand this */
+ INIT_OPT_BOOL("ui.sessions", N_("Keep session master running"),
+ "keep_master_running", 0, 0,
+ N_("Cause a master suspended instance to revive itself\n"
+ "after 1s. Be aware that unsetting this option will\n"
+ "put the onus on the user to either keep the master\n"
+ "session running or start it in the background\n"
+ "and hangup the terminal.\n")),
+#endif
+
INIT_OPT_BOOL("ui.sessions", N_("Keep session active"),
"keep_session_active", 0, 0,
N_("Keep the session active even if the last terminal exits.")),
diff -ur elinks-0.12-20071028/src/osdep/signals.c
elinks-nosusp/src/osdep/signals.c
--- elinks-0.12-20071028/src/osdep/signals.c 2007-10-27 15:40:03.000000000
-0700
+++ elinks-nosusp/src/osdep/signals.c 2007-11-02 22:27:07.000000000 -0700
@@ -74,16 +74,40 @@
pid_t pid = getpid();
block_itrm();
+
#if defined (SIGCONT) && defined(SIGTTOU)
- if (!fork()) {
- sleep(1);
- kill(pid, SIGCONT);
- /* Use _exit() rather than exit(), so that atexit
- * functions are not called, and stdio output buffers
- * are not flushed. Any such things must have been
- * inherited from the parent process, which will take
- * care of them when appropriate. */
- _exit(0);
+ /*
+ * If the master session is suspended, all slave
+ * instances will block waiting for it to resume.
+ * The following code is intended to prevent this by
+ * causing any terminal-stopped instance to be
+ * resumed after one second by a short-lived child
+ * that continues its parent. This is really only
+ * needed by the session master, but we do it
+ * unconditionally based on the setting of the
+ * config option.
+ *
+ * This works out fine because load_config() is
+ * never called from slave instances, so they will
+ * only use the compiled-in default for the option;
+ * slaves can be suspended happily without blocking
+ * any other instances, so it shouldn't ever be
+ * needed to enable this behavior in slave
+ * instances.
+ */
+ if (get_opt_bool("ui.sessions.keep_master_running")) {
+ if (!fork()) {
+ sleep(1);
+ kill(pid, SIGCONT);
+ /* Use _exit() rather than exit(),
+ * so that atexit functions are not
+ * called, and stdio output buffers
+ * are not flushed. Any such things
+ * must have been inherited from the
+ * parent process, which will take
+ * care of them when appropriate. */
+ _exit(0);
+ }
}
#endif
raise(SIGSTOP);
_______________________________________________
elinks-dev mailing list
[email protected]
http://linuxfromscratch.org/mailman/listinfo/elinks-dev