Hi all,
I have made a new patch for the mpm_query functionality.
1) This patch extends the information that can be retrieved.
2) It also allows to return an MPM_TYPE which is a string.
This is used to provide some additional information
about the MPM used. It even could be used by an MPM
developper to provide an arbitrary human readable
string which can be used for management purposes.
3) The AP_MPMQ_IS_FORKED and AP_MPMQ_ISTHREADED now return
a capability. It now can return 3 values:
- NOT_SUPPORTED = 0
- STATIC = 1
- DYNAMIC = 2
This mechanism is to enable other module to figure
out the capabilities for threading and forking.
If one wants to have the same results as previous
(which was not more then a true/false) you can
consider value 0 (not supported) as false and
static and dyniamc true.
There is actually no need to make even a capabilities
value besides the IS_FORKED and IS_THREADED.
The patch is attached (in unified form and does not rely
on the previous mpm_query).
Harrie
--
phone: +39-3474932300
http://www.lisanza.net/
diff -r -u ../httpd-2_0_16-orig/include/ap_mpm.h ./include/ap_mpm.h
--- ../httpd-2_0_16-orig/include/ap_mpm.h Fri Mar 2 23:46:31 2001
+++ ./include/ap_mpm.h Thu Apr 12 14:42:11 2001
@@ -147,18 +147,36 @@
apr_procattr_t *attr,
apr_pool_t *p);
+/* A macro to do proper checks within mpm_query */
+#define MPM_QUERY_INT_CHECK(ptr, size) if ((ptr) && (size != sizeof(int))) \
+ return APR_EMISMATCH;
-#define AP_MPMQ_MAX_DAEMONS 1 /* Max # of daemons */
-#define AP_MPMQ_IS_THREADED 2 /* MPM can do threading */
-#define AP_MPMQ_IS_FORKED 3 /* MPM can do forking */
+/* Subtypes/Values for AP_MPMQ_IS_THREADED and AP_MPMQ_IS_FORKED */
+#define AP_MPMQ_NOT_SUPPORTED 0 /* This value specifies whether */
+ /* an MPM is capable of */
+ /* threading or forking. */
+#define AP_MPMQ_STATIC 1 /* This value specifies whether */
+ /* an MPM is using a static # */
+ /* threads or daemons. */
+#define AP_MPMQ_DYNAMIC 2 /* This value specifies whether */
+ /* an MPM is using a dynamic # */
+ /* threads or daemons. */
+
+#define AP_MPMQ_MPMTYPE 1 /* MPM type choosen */
+#define AP_MPMQ_IS_THREADED 2 /* MPM can do threading */
+#define AP_MPMQ_IS_FORKED 3 /* MPM can do forking */
+#define AP_MPMQ_HARD_LIMIT_DAEMONS 4 /* The compiled max # deamons */
+#define AP_MPMQ_HARD_LIMIT_THREADS 5 /* The compiled max # threads */
+#define AP_MPMQ_MAX_DAEMONS 6 /* Max # of daemons */
+#define AP_MPMQ_MAX_THREADS 7 /* Max # of threads */
/**
* Query a property of the current MPM.
* @param query_code One of APM_MPMQ_*
* @param result A location to place the result of the query
* @return APR_SUCCESS or APR_ENOTIMPL
- * @deffunc int ap_mpm_query(int query_code, int *result)
+ * @deffunc int ap_mpm_query(int query_code, void *result, size_t size)
*/
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result);
+AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, void *result, size_t size);
#endif
diff -r -u ../httpd-2_0_16-orig/modules/generators/mod_info.c
./modules/generators/mod_info.c
--- ../httpd-2_0_16-orig/modules/generators/mod_info.c Mon Mar 26 17:39:45 2001
+++ ./modules/generators/mod_info.c Thu Apr 12 14:30:53 2001
@@ -324,9 +324,9 @@
"<tt>connection: %d "
"keep-alive: %d</tt><br>",
serv->timeout, serv->keep_alive_timeout);
- ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons);
- ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded);
- ap_mpm_query(AP_MPMQ_IS_FORKED, &forked);
+ ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons, sizeof(max_daemons));
+ ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded, sizeof(threaded));
+ ap_mpm_query(AP_MPMQ_IS_FORKED, &forked, sizeof(forked));
ap_rprintf(r, "<strong>MPM Information:</strong> "
"<tt>Max Daemons: %d Threaded: %s Forked: %s</tt><br>\n",
max_daemons, threaded ? "yes" : "no",
diff -r -u ../httpd-2_0_16-orig/server/mpm/beos/beos.c ./server/mpm/beos/beos.c
--- ../httpd-2_0_16-orig/server/mpm/beos/beos.c Fri Mar 30 22:01:49 2001
+++ ./server/mpm/beos/beos.c Thu Apr 12 14:30:53 2001
@@ -650,17 +650,42 @@
}
}
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, void *result, size_t size)
{
+static char *type = __FILE__;
+int *int_ptr = result;
+
switch(query_code){
- case AP_MPMQ_MAX_DAEMONS:
- *result = ap_max_child_assigned;
+ case AP_MPMQ_MPMTYPE:
+ if ((result) && (size > 0)) {
+ result = type;
+ } else {
+ apr_cpystrn(result, type, size);
+ }
return APR_SUCCESS;
case AP_MPMQ_IS_THREADED:
- *result = 1;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_DYNAMIC;
return APR_SUCCESS;
case AP_MPMQ_IS_FORKED:
- *result = 0;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_NOT_SUPPORTED;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_SERVER_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_THREAD_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_max_child_assigned;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_threads_per_child;
return APR_SUCCESS;
}
return APR_ENOTIMPL;
diff -r -u ../httpd-2_0_16-orig/server/mpm/perchild/perchild.c
./server/mpm/perchild/perchild.c
--- ../httpd-2_0_16-orig/server/mpm/perchild/perchild.c Tue Apr 3 05:19:56 2001
+++ ./server/mpm/perchild/perchild.c Thu Apr 12 14:30:53 2001
@@ -215,17 +215,42 @@
static const char *lock_fname;
static apr_lock_t *thread_accept_mutex;
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, void *result, size_t size)
{
+static char *type = __FILE__;
+int *int_ptr = result;
+
switch(query_code){
- case AP_MPMQ_MAX_DAEMONS:
- *result = ap_max_daemons_limit;
+ case AP_MPMQ_MPMTYPE:
+ if ((result) && (size > 0)) {
+ result = type;
+ } else {
+ apr_cpystrn(result, type, size);
+ }
return APR_SUCCESS;
case AP_MPMQ_IS_THREADED:
- *result = 1;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_DYNAMIC;
return APR_SUCCESS;
case AP_MPMQ_IS_FORKED:
- *result = 1;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_STATIC;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_SERVER_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_THREAD_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_max_daemons_limit;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = max_threads;
return APR_SUCCESS;
}
return APR_ENOTIMPL;
diff -r -u ../httpd-2_0_16-orig/server/mpm/prefork/prefork.c
./server/mpm/prefork/prefork.c
--- ../httpd-2_0_16-orig/server/mpm/prefork/prefork.c Fri Mar 2 23:46:32 2001
+++ ./server/mpm/prefork/prefork.c Thu Apr 12 14:30:53 2001
@@ -302,17 +302,42 @@
#define SAFE_ACCEPT(stmt) do {stmt;} while(0)
#endif
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, void *result, size_t size)
{
+static char *type = __FILE__; /* This is the best we can do now */
+int *int_ptr = result;
+
switch(query_code){
- case AP_MPMQ_MAX_DAEMONS:
- *result = ap_daemons_limit;
+ case AP_MPMQ_MPMTYPE:
+ if ((result) && (size > 0)) {
+ result = type;
+ } else {
+ apr_cpystrn(result, type, size);
+ }
return APR_SUCCESS;
case AP_MPMQ_IS_THREADED:
- *result = 0;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_NOT_SUPPORTED;
return APR_SUCCESS;
case AP_MPMQ_IS_FORKED:
- *result = 1;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_DYNAMIC;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_SERVER_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_THREAD_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_daemons_limit;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_threads_per_child;
return APR_SUCCESS;
}
return APR_ENOTIMPL;
diff -r -u ../httpd-2_0_16-orig/server/mpm/spmt_os2/spmt_os2.c
./server/mpm/spmt_os2/spmt_os2.c
--- ../httpd-2_0_16-orig/server/mpm/spmt_os2/spmt_os2.c Fri Mar 2 23:46:32 2001
+++ ./server/mpm/spmt_os2/spmt_os2.c Thu Apr 12 14:30:53 2001
@@ -878,21 +878,46 @@
}
}
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, void *result, size_t size)
{
+static char *type = __FILE__; /* This is the best we can do now */
+int *int_ptr = result;
+
switch(query_code){
- case AP_MPMQ_MAX_DAEMONS:
- *result = max_daemons_limit;
+ case AP_MPMQ_MPMTYPE:
+ if ((result) && (size > 0)) {
+ result = type;
+ } else {
+ apr_cpystrn(result, type, size);
+ }
return APR_SUCCESS;
case AP_MPMQ_IS_THREADED:
- *result = 1;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_DYNAMIC;
return APR_SUCCESS;
case AP_MPMQ_IS_FORKED:
- *result = 0;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_NOT_SUPPORTED;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_SERVER_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_THREAD_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = max_daemons_limit;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_threads_per_child;
return APR_SUCCESS;
}
return APR_ENOTIMPL;
-}
+}
/*****************************************************************
* Executive routines.
diff -r -u ../httpd-2_0_16-orig/server/mpm/threaded/threaded.c
./server/mpm/threaded/threaded.c
--- ../httpd-2_0_16-orig/server/mpm/threaded/threaded.c Tue Apr 3 20:50:07 2001
+++ ./server/mpm/threaded/threaded.c Thu Apr 12 14:30:53 2001
@@ -171,17 +171,42 @@
#define SAFE_ACCEPT(stmt) (stmt)
#endif
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, void *result, size_t size)
{
+static char *type = __FILE__; /* This is the best we can do now */
+int *int_ptr = result;
+
switch(query_code){
- case AP_MPMQ_MAX_DAEMONS:
- *result = ap_max_daemons_limit;
+ case AP_MPMQ_MPMTYPE:
+ if ((result) && (size > 0)) {
+ result = type;
+ } else {
+ apr_cpystrn(result, type, size);
+ }
return APR_SUCCESS;
case AP_MPMQ_IS_THREADED:
- *result = 1;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_STATIC;
return APR_SUCCESS;
case AP_MPMQ_IS_FORKED:
- *result = 1;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_DYNAMIC;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_SERVER_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_THREAD_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_max_daemons_limit;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_threads_per_child;
return APR_SUCCESS;
}
return APR_ENOTIMPL;
diff -r -u ../httpd-2_0_16-orig/server/mpm/winnt/mpm_winnt.c
./server/mpm/winnt/mpm_winnt.c
--- ../httpd-2_0_16-orig/server/mpm/winnt/mpm_winnt.c Tue Apr 3 03:09:25 2001
+++ ./server/mpm/winnt/mpm_winnt.c Thu Apr 12 14:30:53 2001
@@ -1533,21 +1533,46 @@
* service after we preflight the config.
*/
-AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
+AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, void *result, size_t size)
{
+static char *type = __FILE__; /* This is the best we can do now */
+int *int_ptr = result;
+
switch(query_code){
- case AP_MPMQ_MAX_DAEMONS:
- *result = MAXIMUM_WAIT_OBJECTS;
+ case AP_MPMQ_MPMTYPE:
+ if ((result) && (size > 0)) {
+ result = type;
+ } else {
+ apr_cpystrn(result, type, size);
+ }
return APR_SUCCESS;
case AP_MPMQ_IS_THREADED:
- *result = 1;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_DYNAMIC;
return APR_SUCCESS;
case AP_MPMQ_IS_FORKED:
- *result = 0;
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = AP_MPMQ_NOT_SUPPORTED;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_SERVER_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_HARD_LIMIT_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = HARD_THREAD_LIMIT;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_DAEMONS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = MAXIMUM_WAIT_OBJECTS;
+ return APR_SUCCESS;
+ case AP_MPMQ_MAX_THREADS:
+ MPM_QUERY_INT_CHECK(int_ptr, size);
+ *int_ptr = ap_threads_per_child;
return APR_SUCCESS;
}
return APR_ENOTIMPL;
-}
+}
static apr_status_t service_to_start_success;
static int inst_argc;
diff -r -u ../httpd-2_0_16-orig/server/mpm_common.c ./server/mpm_common.c
--- ../httpd-2_0_16-orig/server/mpm_common.c Mon Mar 19 14:07:26 2001
+++ ./server/mpm_common.c Thu Apr 12 14:30:53 2001
@@ -96,7 +96,7 @@
int not_dead_yet;
int max_daemons;
- ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons);
+ ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons, sizeof(max_daemons));
MPM_SYNC_CHILD_TABLE();
for (tries = terminate ? 4 : 1; tries <= 9; ++tries) {
diff -r -u ../httpd-2_0_16-orig/server/scoreboard.c ./server/scoreboard.c
--- ../httpd-2_0_16-orig/server/scoreboard.c Fri Mar 9 21:30:34 2001
+++ ./server/scoreboard.c Thu Apr 12 14:30:53 2001
@@ -255,7 +255,7 @@
int i;
int max_daemons_limit;
- ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons_limit);
+ ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons_limit, sizeof(max_daemons_limit));
for (i = 0; i < max_daemons_limit; ++i)
if (ap_scoreboard_image->parent[i].pid == pid->pid)