This is the patch I promised a couple weeks ago. It changes the way we create the scoreboard to be more friendly with 3rd party apps/processes that want access to the scoreboard while maintaining the ability to have an anonymous scoreboard. The logic was discussed on-list a week or two ago, but I'll reproduce it here anyway:
if config specifies ScoreBoardFile create name-based shared memory, errors are fatal else /* we get to choose */ create anonymous shared memory if ENOTIMPL create name-based shared memory from DEFAULT_SCOREBOARD else errors are fatal I had to modify the MPMs so they wouldn't try to set ap_scoreboard_fname any more. This #define is now fully owned by the scoreboard.c file. (Might we want to namespace-protect that #define? I don't know.) I'm posting this here for feedback because it is a big change and could use some testing on other platform/MPM combos, but I'd also like to wait until the current release process finishes. -aaron p.s. this removes 99% of the #ifdef WIN32 stuff from scoreboard.c. Index: server/scoreboard.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/scoreboard.c,v retrieving revision 1.55 diff -u -u -r1.55 scoreboard.c --- server/scoreboard.c 1 Feb 2002 18:07:08 -0000 1.55 +++ server/scoreboard.c 7 Feb 2002 19:46:52 -0000 @@ -161,6 +161,31 @@ ap_assert(more_storage == (char*)shared_score + scoreboard_size); } +/** + * Create a name-based scoreboard in the given pool using the + * given filename. + */ +static apr_status_t create_namebased_scoreboard(apr_pool_t *pool, + const char *fname) +{ +#if APR_HAS_SHARED_MEMORY + apr_status_t rv; + + /* The shared memory file must not exist before we create the + * segment. */ + apr_file_remove(fname, pool); /* ignore errors */ + + rv = apr_shm_create(&ap_scoreboard_shm, scoreboard_size, fname, pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "unable to create scoreboard " + "(name-based shared memory failure)"); + return rv; + } +#endif /* APR_HAS_SHARED_MEMORY */ + return APR_SUCCESS; +} + /* ToDo: This function should be made to handle setting up * a scoreboard shared between processes using any IPC technique, * not just a shared memory segment @@ -183,35 +208,32 @@ return rv; } -#ifndef WIN32 - rv = apr_shm_create(&ap_scoreboard_shm, scoreboard_size, fname, - global_pool); - if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) { - ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, - "Fatal error: could not create scoreboard " - "(using anonymous shared memory)"); - return rv; + /* The config says to create a name-based shmem */ + if (ap_scoreboard_fname) { + /* make sure it's an absolute pathname */ + fname = ap_server_root_relative(pconf, ap_scoreboard_fname); + + return create_namebased_scoreboard(global_pool, fname); } - if (rv == APR_ENOTIMPL) { -#else - { -#endif - if (ap_scoreboard_fname) { - fname = ap_server_root_relative(global_pool, ap_scoreboard_fname); - /* make sure the file doesn't exist before trying - * to create the segment. */ - apr_file_remove(fname, global_pool); - } - rv = apr_shm_create(&ap_scoreboard_shm, scoreboard_size, fname, - global_pool); - if (rv != APR_SUCCESS) { + else { /* config didn't specify, we get to choose shmem type */ + rv = apr_shm_create(&ap_scoreboard_shm, scoreboard_size, NULL, + global_pool); /* anonymous shared memory */ + if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) { ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, - "Fatal error: could not open(create) scoreboard"); + "Unable to create scoreboard " + "(anonymous shared memory failure)"); return rv; } + /* Make up a filename and do name-based shmem */ + else if (rv == APR_ENOTIMPL) { + /* Make sure it's an absolute pathname */ + ap_scoreboard_fname = DEFAULT_SCOREBOARD; + fname = ap_server_root_relative(pconf, ap_scoreboard_fname); + + return create_namebased_scoreboard(global_pool, fname); + } } - /* everything will be cleared shortly */ -#endif +#endif /* APR_HAS_SHARED_MEMORY */ return APR_SUCCESS; } Index: include/scoreboard.h =================================================================== RCS file: /home/cvs/httpd-2.0/include/scoreboard.h,v retrieving revision 1.39 diff -u -u -r1.39 scoreboard.h --- include/scoreboard.h 30 Jan 2002 22:35:56 -0000 1.39 +++ include/scoreboard.h 7 Feb 2002 19:46:53 -0000 @@ -58,6 +58,7 @@ #ifndef APACHE_SCOREBOARD_H #define APACHE_SCOREBOARD_H + #ifdef __cplusplus extern "C" { #endif @@ -74,6 +75,11 @@ #include "apr_thread_proc.h" #include "apr_portable.h" #include "apr_shm.h" + +/* Scoreboard file, if there is one */ +#ifndef DEFAULT_SCOREBOARD +#define DEFAULT_SCOREBOARD "logs/apache_runtime_status" +#endif /* Scoreboard info on a process is, for now, kept very brief --- * just status value and pid (the latter so that the caretaker process Index: server/mpm/beos/beos.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/beos/beos.c,v retrieving revision 1.83 diff -u -u -r1.83 beos.c --- server/mpm/beos/beos.c 1 Feb 2002 22:16:31 -0000 1.83 +++ server/mpm/beos/beos.c 7 Feb 2002 19:46:56 -0000 @@ -762,8 +762,6 @@ pconf = _pconf; ap_server_conf = s; - ap_scoreboard_fname = DEFAULT_SCOREBOARD; - /* Increase the available pool of fd's. This code from * Joe Kloss <[EMAIL PROTECTED]> */ @@ -1032,7 +1030,6 @@ ap_thread_limit = HARD_THREAD_LIMIT; ap_pid_fname = DEFAULT_PIDLOG; ap_max_requests_per_thread = DEFAULT_MAX_REQUESTS_PER_THREAD; - ap_scoreboard_fname = DEFAULT_SCOREBOARD; apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); Index: server/mpm/beos/mpm_default.h =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/beos/mpm_default.h,v retrieving revision 1.6 diff -u -u -r1.6 mpm_default.h --- server/mpm/beos/mpm_default.h 18 Dec 2001 13:48:53 -0000 1.6 +++ server/mpm/beos/mpm_default.h 7 Feb 2002 19:46:56 -0000 @@ -101,11 +101,6 @@ #define DEFAULT_PIDLOG "logs/httpd.pid" #endif -/* Scoreboard file, if there is one */ -#ifndef DEFAULT_SCOREBOARD -#define DEFAULT_SCOREBOARD "logs/apache_runtime_status" -#endif - /* * Interval, in microseconds, between scoreboard maintenance. */ Index: server/mpm/netware/mpm_netware.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/netware/mpm_netware.c,v retrieving revision 1.32 diff -u -u -r1.32 mpm_netware.c --- server/mpm/netware/mpm_netware.c 6 Feb 2002 21:13:57 -0000 1.32 +++ server/mpm/netware/mpm_netware.c 7 Feb 2002 19:46:59 -0000 @@ -970,7 +970,6 @@ ap_threads_min_free = DEFAULT_MIN_FREE_THREADS; ap_threads_max_free = DEFAULT_MAX_FREE_THREADS; ap_threads_limit = HARD_THREAD_LIMIT; - ap_scoreboard_fname = DEFAULT_SCOREBOARD; ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; ap_extended_status = 0; Index: server/mpm/netware/mpm_default.h =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/netware/mpm_default.h,v retrieving revision 1.5 diff -u -u -r1.5 mpm_default.h --- server/mpm/netware/mpm_default.h 19 Dec 2001 16:23:34 -0000 1.5 +++ server/mpm/netware/mpm_default.h 7 Feb 2002 19:46:59 -0000 @@ -122,11 +122,6 @@ #endif */ -/* Scoreboard file, if there is one */ -#ifndef DEFAULT_SCOREBOARD -#define DEFAULT_SCOREBOARD "logs/apache_runtime_status" -#endif - /* Where the main/parent process's pid is logged */ /*#ifndef DEFAULT_PIDLOG #define DEFAULT_PIDLOG "logs/httpd.pid" Index: server/mpm/perchild/perchild.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/perchild/perchild.c,v retrieving revision 1.108 diff -u -u -r1.108 perchild.c --- server/mpm/perchild/perchild.c 5 Feb 2002 22:18:49 -0000 1.108 +++ server/mpm/perchild/perchild.c 7 Feb 2002 19:47:04 -0000 @@ -1493,7 +1493,6 @@ max_spare_threads = DEFAULT_MAX_SPARE_THREAD; max_threads = thread_limit; ap_pid_fname = DEFAULT_PIDLOG; - ap_scoreboard_fname = DEFAULT_SCOREBOARD; ap_lock_fname = DEFAULT_LOCKFILE; max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; curr_child_num = 0; Index: server/mpm/perchild/mpm_default.h =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/perchild/mpm_default.h,v retrieving revision 1.8 diff -u -u -r1.8 mpm_default.h --- server/mpm/perchild/mpm_default.h 18 Dec 2001 13:48:53 -0000 1.8 +++ server/mpm/perchild/mpm_default.h 7 Feb 2002 19:47:05 -0000 @@ -91,11 +91,6 @@ #define DEFAULT_LOCKFILE "logs/accept.lock" #endif -/* Scoreboard file, if there is one */ -#ifndef DEFAULT_SCOREBOARD -#define DEFAULT_SCOREBOARD "logs/apache_runtime_status" -#endif - /* Where the main/parent process's pid is logged */ #ifndef DEFAULT_PIDLOG #define DEFAULT_PIDLOG "logs/httpd.pid" Index: server/mpm/prefork/prefork.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/prefork/prefork.c,v retrieving revision 1.239 diff -u -u -r1.239 prefork.c --- server/mpm/prefork/prefork.c 4 Feb 2002 18:41:46 -0000 1.239 +++ server/mpm/prefork/prefork.c 7 Feb 2002 19:47:08 -0000 @@ -1247,7 +1247,6 @@ ap_daemons_max_free = DEFAULT_MAX_FREE_DAEMON; ap_daemons_limit = server_limit; ap_pid_fname = DEFAULT_PIDLOG; - ap_scoreboard_fname = DEFAULT_SCOREBOARD; ap_lock_fname = DEFAULT_LOCKFILE; ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; ap_extended_status = 0; Index: server/mpm/prefork/mpm_default.h =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/prefork/mpm_default.h,v retrieving revision 1.7 diff -u -u -r1.7 mpm_default.h --- server/mpm/prefork/mpm_default.h 18 Dec 2001 13:48:53 -0000 1.7 +++ server/mpm/prefork/mpm_default.h 7 Feb 2002 19:47:08 -0000 @@ -85,11 +85,6 @@ #define DEFAULT_LOCKFILE "logs/accept.lock" #endif -/* Scoreboard file, if there is one */ -#ifndef DEFAULT_SCOREBOARD -#define DEFAULT_SCOREBOARD "logs/apache_runtime_status" -#endif - /* Where the main/parent process's pid is logged */ #ifndef DEFAULT_PIDLOG #define DEFAULT_PIDLOG "logs/httpd.pid" Index: server/mpm/worker/worker.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/worker/worker.c,v retrieving revision 1.72 diff -u -u -r1.72 worker.c --- server/mpm/worker/worker.c 5 Feb 2002 23:17:22 -0000 1.72 +++ server/mpm/worker/worker.c 7 Feb 2002 19:47:13 -0000 @@ -1544,7 +1544,6 @@ ap_daemons_limit = server_limit; ap_threads_per_child = DEFAULT_THREADS_PER_CHILD; ap_pid_fname = DEFAULT_PIDLOG; - ap_scoreboard_fname = DEFAULT_SCOREBOARD; ap_lock_fname = DEFAULT_LOCKFILE; ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; ap_extended_status = 0; Index: server/mpm/worker/mpm_default.h =================================================================== RCS file: /home/cvs/httpd-2.0/server/mpm/worker/mpm_default.h,v retrieving revision 1.3 diff -u -u -r1.3 mpm_default.h --- server/mpm/worker/mpm_default.h 18 Dec 2001 13:48:54 -0000 1.3 +++ server/mpm/worker/mpm_default.h 7 Feb 2002 19:47:13 -0000 @@ -89,11 +89,6 @@ #define DEFAULT_LOCKFILE "logs/accept.lock" #endif -/* Scoreboard file, if there is one */ -#ifndef DEFAULT_SCOREBOARD -#define DEFAULT_SCOREBOARD "logs/apache_runtime_status" -#endif - /* Where the main/parent process's pid is logged */ #ifndef DEFAULT_PIDLOG #define DEFAULT_PIDLOG "logs/httpd.pid"