Hi --

> for (i = 0; i < ap_threads_per_child; i++) {
>     if (status != SERVER_GRACEFUL && status != SERVER_DEAD) {
>         ap_update_child_status_from_indexes(slot, i, SERVER_INIT, NULL);
>     }
> }
[snip]
> ... after make_child() does its check for != GRACEFUL and != DEAD ...

   After heading back to bed I realized this should be, of course,

if (status == SERVER_GRACEFUL || status == SERVER_DEAD)

   Never cut-'n'-paste when you're tired!


   Re my option C, it also occurs to me that instead of squeezing
the worker MPM's start and listener threads into extra, internal
worker_score structures, it might be more appropriate to create a
new section of the scoreboard with non_worker_score structures.
These would just have pid, tid, and status fields only.

   The worker and event MPMs would use these to track their
non-worker threads; and the parent process for these MPMs could
monitor them as per option C to decide when the child process's
workers were ready to be counted.

   It would also solve an outstanding problem for me with a
module I maintain that uses its own private threads; there's
nowhere in the scoreboard that I know of where I can register
them.  That might also intersect with this conversation:

http://marc.theaimsgroup.com/?l=apache-httpd-dev&m=112902736905643&w=2

   A possible set of calls for managing these might be:

num = ap_register_non_worker_thread(slot, tid, status)
ap_update_non_worker_status_from_indexes(slot, num, status)
ap_unregister_non_worker_thread(slot, num)
ret = ap_get_scoreboard_non_worker(slot, num, &status)

   The child process registers its non-worker threads, making
sure that it registers one of them as STARTING immediately after
ap_reopen_scoreboard() so that it precedes ap_run_child_init().
This will be guaranteed to go into the [slot][0] structure.
It can then set that to READY once it's ready for its workers
to be counted individually.

   Then the parent process can monitor that structure's status
using ap_get_scoreboard_non_worker(), and do the "wait till
all workers are running" thing in p_i_s_m().  Meanwhile
mod_status can call ap_get_scoreboard_non_worker until it
returns an error code and then it'll know it's checked all
the registered non-workers; these can be displayed in the report.


   Finally, a question without checking the code first ... I notice
that worker.c has the following, taken from prefork.c:

    /* fork didn't succeed. Fix the scoreboard or else
     * it will say SERVER_STARTING forever and ever
     */
    ap_update_child_status_from_indexes(slot, 0, SERVER_DEAD, NULL);

Is that right?  Should it perhaps cycle through and set all
non-DEAD workers to DEAD?  I'm thinking that in prefork,
threads_limit is set to 1, so mod_status only checks the first
thread in a slot, but here it'll check all of them.

Chris.

-- 
GPG Key ID: 366A375B
GPG Key Fingerprint: 485E 5041 17E1 E2BB C263  E4DE C8E3 FA36 366A 375B

Reply via email to