Just to kick this further along. I've put together the proposal in patch form.
Anyone game to test the SMP support is working properly with "-M foreground" when this is applied? I'm also beginning to think we are needing to add getopts_long() support and just use "--foreground" for the no-daemon mode. If the attached patch actually works regardign SMP and we agree on the user-visible bit I'm happy to add that update for the command line and commit. Amos
=== modified file 'src/WinSvc.cc' --- src/WinSvc.cc 2014-01-24 01:57:15 +0000 +++ src/WinSvc.cc 2014-02-14 11:28:40 +0000 @@ -944,7 +944,7 @@ } else { WIN32_run_mode = _WIN_SQUID_RUN_MODE_INTERACTIVE; opt_no_daemon = 1; - + opt_daemon_type = 1; // always foreground interactive services. return SquidMain(argc, argv); } === modified file 'src/globals.h' --- src/globals.h 2014-01-24 01:57:15 +0000 +++ src/globals.h 2014-02-14 11:29:03 +0000 @@ -142,6 +142,7 @@ extern const char *external_acl_message; /* NULL */ extern int opt_send_signal; /* -1 */ extern int opt_no_daemon; /* 0 */ +extern int opt_daemon_type; /* 0 */ extern int opt_parse_cfg_only; /* 0 */ /// current Squid process number (e.g., 4). === modified file 'src/ipc.cc' --- src/ipc.cc 2013-10-25 00:13:46 +0000 +++ src/ipc.cc 2014-02-14 11:29:34 +0000 @@ -399,7 +399,7 @@ close(x); #if HAVE_SETSID - if (opt_no_daemon) + if (opt_daemon_type == 1) setsid(); #endif === modified file 'src/main.cc' --- src/main.cc 2014-01-24 01:57:15 +0000 +++ src/main.cc 2014-02-14 11:55:14 +0000 @@ -281,7 +281,7 @@ usage(void) { fprintf(stderr, - "Usage: %s [-cdhvzCFNRVYX] [-n name] [-s | -l facility] [-f config-file] [-[au] port] [-k signal]" + "Usage: %s [-cdhvzCFNRVYX] [-M mode] [-n name] [-s | -l facility] [-f config-file] [-[au] port] [-k signal]" #if USE_WIN32_SERVICE "[-ir] [-O CommandLine]" #endif @@ -310,7 +310,14 @@ " -C Do not catch fatal signals.\n" " -D OBSOLETE. Scheduled for removal.\n" " -F Don't serve any requests until store is rebuilt.\n" - " -N No daemon mode.\n" + " -M mode Operational mode for the service daemon.\n" + " Modes:\n" + " background - run as a background service with a\n" + " master process for auto-restart.\n" + " This is the default mode.\n" + " foreground - run in foreground. Rely on calling process\n" + " for error recovery on process failures.\n" + " -N Deprecated. Disables SMP support and implies '-M foreground'.\n" #if USE_WIN32_SERVICE " -O options\n" " Set Windows Service Command line options in Registry.\n" @@ -336,9 +343,9 @@ int c; #if USE_WIN32_SERVICE - while ((c = getopt(argc, argv, "CDFNO:RSVYXa:d:f:hik:m::n:rsl:u:vz?")) != -1) + while ((c = getopt(argc, argv, "CDFM:NO:RSVYXa:d:f:hik:m::n:rsl:u:vz?")) != -1) #else - while ((c = getopt(argc, argv, "CDFNRSYXa:d:f:hk:m::n:sl:u:vz?")) != -1) + while ((c = getopt(argc, argv, "CDFM:NRSYXa:d:f:hk:m::n:sl:u:vz?")) != -1) #endif { @@ -362,10 +369,26 @@ opt_foreground_rebuild = 1; break; + case 'M': + /** \par M + * Set global option for daemon to run in foreground or background mode. + * opt_daemon_type = 0 - fork into background process + * opt_daemon_type = 1 - run in foreground, with SMP support. + */ + if (!strcmp(optarg, "foreground")) + opt_daemon_type = 1; + else if (!strcmp(optarg, "background")) // not really needed, but accept. + opt_daemon_type = 0; + else + debugs(1, DBG_CRITICAL, "WARNING: Unknown commmand option '-M " << optarg << "'."); + break; + case 'N': /** \par N - * Set global option for 'no_daemon' mode. opt_no_daemon */ + * Set global option for 'no_daemon' mode. Disables SMP support. opt_no_daemon */ opt_no_daemon = 1; + opt_daemon_type = 1; + debugs(1, DBG_CRITICAL, "WARNING: -N command is deprecated. Use '-M foreground' instead."); break; #if USE_WIN32_SERVICE @@ -1448,7 +1471,7 @@ ActivateRegistered(rrAfterConfig); enter_suid(); - if (!opt_no_daemon && Config.workers > 0) + if (opt_daemon_type != 1 && Config.workers > 0) watch_child(argv); if (opt_create_swap_dirs) { @@ -1472,6 +1495,7 @@ comm_init(); if (opt_no_daemon) { + // TODO: move from opt_no_daemon to a debug option. /* we have to init fdstat here. */ fd_open(0, FD_LOG, "stdin"); fd_open(1, FD_LOG, "stdout"); @@ -1924,6 +1948,7 @@ #if !XMALLOC_TRACE if (opt_no_daemon) { + // TODO: move from opt_no_daemon to a debug option file_close(0); file_close(1); file_close(2); === modified file 'src/tools.cc' --- src/tools.cc 2013-10-25 00:13:46 +0000 +++ src/tools.cc 2014-02-14 11:30:51 +0000 @@ -769,7 +769,7 @@ bool InDaemonMode() { - return !opt_no_daemon && Config.workers > 0; + return opt_daemon_type != 1 && Config.workers > 0; } bool