Apache HTTPD
scoreboard.c
Go to the documentation of this file.
1/* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "apr.h"
18#include "apr_strings.h"
19#include "apr_portable.h"
20#include "apr_lib.h"
21
22#define APR_WANT_STRFUNC
23#include "apr_want.h"
24
25#if APR_HAVE_SYS_TYPES_H
26#include <sys/types.h>
27#endif
28
29#include "ap_config.h"
30#include "httpd.h"
31#include "http_log.h"
32#include "http_main.h"
33#include "http_core.h"
34#include "http_config.h"
35#include "http_protocol.h"
36#include "ap_mpm.h"
37
38#include "scoreboard.h"
39
40/* we know core's module_index is 0 */
41#undef APLOG_MODULE_INDEX
42#define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX
43
47
48const char * ap_set_scoreboard(cmd_parms *cmd, void *dummy,
49 const char *arg)
50{
52 if (err != NULL) {
53 return err;
54 }
55
57 return NULL;
58}
59
60/* Default to false when mod_status is not loaded */
62
63const char *ap_set_extended_status(cmd_parms *cmd, void *dummy, int arg)
64{
66 if (err != NULL) {
67 return err;
68 }
70 return NULL;
71}
72
74
75const char *ap_set_reqtail(cmd_parms *cmd, void *dummy, int arg)
76{
78 if (err != NULL) {
79 return err;
80 }
82 return NULL;
83}
84
85#if APR_HAS_SHARED_MEMORY
86
87#include "apr_shm.h"
88
89#ifndef WIN32
90static /* but must be exported to mpm_winnt */
91#endif
93
94#endif
95
99
103
106
111
114
115/*
116 * ToDo:
117 * This function should be renamed to cleanup_shared
118 * and it should handle cleaning up a scoreboard shared
119 * between processes using any form of IPC (file, shared memory
120 * segment, etc.). Leave it as is now because it is being used
121 * by various MPMs.
122 */
124{
125#if APR_HAS_SHARED_MEMORY
129#endif
130 return APR_SUCCESS;
131}
132
133#define SIZE_OF_scoreboard APR_ALIGN_DEFAULT(sizeof(scoreboard))
134#define SIZE_OF_global_score APR_ALIGN_DEFAULT(sizeof(global_score))
135#define SIZE_OF_process_score APR_ALIGN_DEFAULT(sizeof(process_score))
136#define SIZE_OF_worker_score APR_ALIGN_DEFAULT(sizeof(worker_score))
137
149
178
184 const char *fname)
185{
186#if APR_HAS_SHARED_MEMORY
187 apr_status_t rv;
188
189 /* The shared memory file must not exist before we create the
190 * segment. */
191 apr_shm_remove(fname, pool); /* ignore errors */
192
194 if (rv != APR_SUCCESS) {
196 "unable to create or access scoreboard \"%s\" "
197 "(name-based shared memory failure)", fname);
198 return rv;
199 }
200#endif /* APR_HAS_SHARED_MEMORY */
201 return APR_SUCCESS;
202}
203
204/* ToDo: This function should be made to handle setting up
205 * a scoreboard shared between processes using any IPC technique,
206 * not just a shared memory segment
207 */
209{
210#if APR_HAS_SHARED_MEMORY
211 apr_status_t rv;
212 char *fname = NULL;
214
215 /* We don't want to have to recreate the scoreboard after
216 * restarts, so we'll create a global pool and never clean it.
217 */
219 if (rv != APR_SUCCESS) {
221 "Fatal error: unable to create global pool "
222 "for use by the scoreboard");
223 return rv;
224 }
225
226 /* The config says to create a name-based shmem */
228 /* make sure it's an absolute pathname */
230 if (!fname) {
232 "Fatal error: Invalid Scoreboard path %s",
234 return APR_EBADPATH;
235 }
237 }
238 else { /* config didn't specify, we get to choose shmem type */
240 global_pool); /* anonymous shared memory */
241 if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) {
243 "Unable to create or access scoreboard "
244 "(anonymous shared memory failure)");
245 return rv;
246 }
247 /* Make up a filename and do name-based shmem */
248 else if (rv == APR_ENOTIMPL) {
249 /* Make sure it's an absolute pathname */
252
254 }
255 }
256#endif /* APR_HAS_SHARED_MEMORY */
257 return APR_SUCCESS;
258}
259
260/* If detach is non-zero, this is a separate child process,
261 * if zero, it is a forked child.
262 */
264 int detached)
265{
266#if APR_HAS_SHARED_MEMORY
267 if (!detached) {
268 return APR_SUCCESS;
269 }
272 "Fatal error: shared scoreboard too small for child!");
275 return APR_EINVAL;
276 }
277 /* everything will be cleared shortly */
278 if (*shm) {
280 }
281#endif
282 return APR_SUCCESS;
283}
284
286{
287 if (ap_scoreboard_image == NULL) {
288 return APR_SUCCESS;
289 }
290 if (scoreboard_type == SB_SHARED) {
292 }
293 else {
297 }
298 return APR_SUCCESS;
299}
300
301/* Create or reinit an existing scoreboard. The MPM can control whether
302 * the scoreboard is shared across multiple processes or not
303 */
305{
306 int i;
307#if APR_HAS_SHARED_MEMORY
308 apr_status_t rv;
309#endif
310
315 for (i = 0; i < server_limit; i++) {
318 }
320 return OK;
321 }
322
324#if APR_HAS_SHARED_MEMORY
325 if (sb_type == SB_SHARED) {
326 void *sb_shared;
327 rv = open_scoreboard(p);
330 }
333 }
334 else
335#endif
336 {
337 /* A simple malloc will suffice */
338 void *sb_mem = ap_calloc(1, scoreboard_size);
340 }
341
345
347
348 return OK;
349}
350
351/* Routines called to deal with the scoreboard image
352 * --- note that we do *not* need write locks, since update_child_status
353 * only updates a *single* record in place, and only one process writes to
354 * a given scoreboard slot at a time (either the child process owning that
355 * slot, or the parent, noting that the child has died).
356 *
357 * As a final note --- setting the score entry to getpid() is always safe,
358 * since when the parent is writing an entry, it's only noting SERVER_DEAD
359 * anyway.
360 */
361
363{
364 return (ap_scoreboard_image ? 1 : 0);
365}
366
368 unsigned short conn_count)
369{
371
372 if (!sb)
373 return;
374
375 ws = &ap_scoreboard_image->servers[sb->child_num][sb->thread_num];
376 ws->conn_count = conn_count;
377}
378
380{
383
384 if (!sb)
385 return;
386
387 ws = &ap_scoreboard_image->servers[sb->child_num][sb->thread_num];
390 }
391 else if (r->method_number == M_GET && r->method && r->method[0] == 'H') {
392 bytes = 0;
393 }
394 else {
395 bytes = r->bytes_sent;
396 }
397
398#ifdef HAVE_TIMES
399 times(&ws->times);
400#endif
401 ws->access_count++;
402 ws->my_access_count++;
403 ws->conn_count++;
404 ws->bytes_served += bytes;
405 ws->my_bytes_served += bytes;
406 ws->conn_bytes += bytes;
407}
408
410{
411 int i;
412 int max_daemons_limit = 0;
413
414 ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons_limit);
415
416 for (i = 0; i < max_daemons_limit; ++i) {
417 if (ap_scoreboard_image->parent[i].pid == pid->pid) {
418 return i;
419 }
420 }
421
422 return -1;
423}
424
426 int child_num, int thread_num)
427{
428 sbh->child_num = child_num;
429 sbh->thread_num = thread_num;
430}
431
433 int child_num, int thread_num)
434{
436 ap_update_sb_handle(*new_sbh, child_num, thread_num);
437}
438
439static void copy_request(char *rbuf, apr_size_t rbuflen, request_rec *r)
440{
441 char *p;
442
443 if (r->the_request == NULL) {
444 apr_cpystrn(rbuf, "NULL", rbuflen);
445 return; /* short circuit below */
446 }
447
448 if (r->parsed_uri.password == NULL) {
449 p = r->the_request;
450 }
451 else {
452 /* Don't reveal the password in the server-status view */
453 p = apr_pstrcat(r->pool, r->method, " ",
456 r->assbackwards ? NULL : " ", r->protocol, NULL);
457 }
458
459 /* now figure out if we copy over the 1st rbuflen chars or the last */
461 apr_cpystrn(rbuf, p, rbuflen);
462 }
463 else {
464 apr_size_t slen = strlen(p);
465 if (slen < rbuflen) {
466 /* it all fits anyway */
467 apr_cpystrn(rbuf, p, rbuflen);
468 }
469 else {
470 apr_cpystrn(rbuf, p+(slen-rbuflen+1), rbuflen);
471 }
472 }
473}
474
475static int update_child_status_internal(int child_num,
476 int thread_num,
477 int status,
478 conn_rec *c,
479 server_rec *s,
480 request_rec *r,
481 const char *descr)
482{
483 int old_status;
485 int mpm_generation;
486
487 ws = &ap_scoreboard_image->servers[child_num][thread_num];
489 ws->status = status;
490
491 if (status == SERVER_READY
494 ws->thread_num = child_num * thread_limit + thread_num;
496 ps->generation = mpm_generation;
497 }
498
499 if (ap_extended_status) {
500 const char *val;
501
502 if (status == SERVER_READY || status == SERVER_DEAD) {
503 /*
504 * Reset individual counters
505 */
506 if (status == SERVER_DEAD) {
507 ws->my_access_count = 0L;
508 ws->my_bytes_served = 0L;
509#ifdef HAVE_TIMES
510 ws->times.tms_utime = 0;
511 ws->times.tms_stime = 0;
512 ws->times.tms_cutime = 0;
513 ws->times.tms_cstime = 0;
514#endif
515 }
516 ws->conn_count = 0;
517 ws->conn_bytes = 0;
518 ws->last_used = apr_time_now();
519 }
520
521 if (descr) {
522 apr_cpystrn(ws->request, descr, sizeof(ws->request));
523 }
524 else if (r) {
525 copy_request(ws->request, sizeof(ws->request), r);
526 }
527 else if (c) {
528 ws->request[0]='\0';
529 }
530
531 if (r && r->useragent_ip) {
533 apr_cpystrn(ws->client, r->useragent_ip, sizeof(ws->client)); /* DEPRECATE */
534 apr_cpystrn(ws->client64, r->useragent_ip, sizeof(ws->client64));
535 }
536 else {
537 apr_cpystrn(ws->client, val, sizeof(ws->client)); /* DEPRECATE */
538 apr_cpystrn(ws->client64, val, sizeof(ws->client64));
539 }
540 }
541 else if (c) {
542 if (!(val = ap_get_remote_host(c, c->base_server->lookup_defaults,
544 apr_cpystrn(ws->client, c->client_ip, sizeof(ws->client)); /* DEPRECATE */
545 apr_cpystrn(ws->client64, c->client_ip, sizeof(ws->client64));
546 }
547 else {
548 apr_cpystrn(ws->client, val, sizeof(ws->client)); /* DEPRECATE */
549 apr_cpystrn(ws->client64, val, sizeof(ws->client64));
550 }
551 }
552
553 if (s) {
554 if (c) {
555 apr_snprintf(ws->vhost, sizeof(ws->vhost), "%s:%d",
556 s->server_hostname, c->local_addr->port);
557 }
558 else {
559 apr_cpystrn(ws->vhost, s->server_hostname, sizeof(ws->vhost));
560 }
561 }
562 else if (c) {
563 ws->vhost[0]='\0';
564 }
565
566 if (c) {
568 apr_cpystrn(ws->protocol, val, sizeof(ws->protocol));
569 }
570 }
571
572 return old_status;
573}
574
576 int thread_num,
577 int status,
578 request_rec *r)
579{
580 if (child_num < 0) {
581 return -1;
582 }
583
584 return update_child_status_internal(child_num, thread_num, status,
585 r ? r->connection : NULL,
586 r ? r->server : NULL,
587 r, NULL);
588}
589
591 request_rec *r)
592{
593 if (!sbh || (sbh->child_num < 0))
594 return -1;
595
597 status,
598 r ? r->connection : NULL,
599 r ? r->server : NULL,
600 r, NULL);
601}
602
604 conn_rec *c)
605{
606 if (!sbh || (sbh->child_num < 0))
607 return -1;
608
610 status, c, NULL, NULL, NULL);
611}
612
615{
616 if (!sbh || (sbh->child_num < 0))
617 return -1;
618
620 status, c, s, NULL, NULL);
621}
622
624{
625 if (!sbh || (sbh->child_num < 0))
626 return -1;
627
630}
631
633{
635
636 if (!sbh)
637 return;
638
639 if (sbh->child_num < 0) {
640 return;
641 }
642
644
645 if (status == START_PREQUEST) {
646 ws->start_time = ws->last_used = apr_time_now();
647 }
648 else if (status == STOP_PREQUEST) {
649 ws->stop_time = ws->last_used = apr_time_now();
650 if (ap_extended_status) {
651 ws->duration += ws->stop_time - ws->start_time;
652 }
653 }
654}
655
657{
658#ifdef HAVE_TIMES
659 if (ap_scoreboard_image == NULL) {
660 return APR_SUCCESS;
661 }
663#endif
664 return APR_SUCCESS;
665}
666
668{
669 if (((x < 0) || (x >= server_limit)) ||
670 ((y < 0) || (y >= thread_limit))) {
671 return(NULL); /* Out of range */
672 }
673 return &ap_scoreboard_image->servers[x][y];
674}
675
677{
678 if (!sbh)
679 return NULL;
680
682 sbh->thread_num);
683}
684
686 int child_num,
687 int thread_num)
688{
689 worker_score *ws = ap_get_scoreboard_worker_from_indexes(child_num, thread_num);
690
691 memcpy(dest, ws, sizeof *ws);
692
693 /* For extra safety, NUL-terminate the strings returned, though it
694 * should be true those last bytes are always zero anyway. */
695 dest->client[sizeof(dest->client) - 1] = '\0';
696 dest->client64[sizeof(dest->client64) - 1] = '\0';
697 dest->request[sizeof(dest->request) - 1] = '\0';
698 dest->vhost[sizeof(dest->vhost) - 1] = '\0';
699 dest->protocol[sizeof(dest->protocol) - 1] = '\0';
700}
701
703{
704 if ((x < 0) || (x >= server_limit)) {
705 return(NULL); /* Out of range */
706 }
707 return &ap_scoreboard_image->parent[x];
708}
709
Symbol export macros and hook functions.
#define AP_DECLARE_DATA
Definition ap_config.h:89
#define AP_DECLARE(type)
Definition ap_config.h:67
#define AP_IMPLEMENT_HOOK_RUN_ALL(ret, name, args_decl, args_use, ok, decline)
Definition ap_hooks.h:117
Apache Multi-Processing Module library.
APR general purpose library routines.
static apr_pool_t * global_pool
Definition apr_pools.c:616
APR Portability Routines.
APR Shared Memory Routines.
apr_size_t const unsigned char unsigned int unsigned int d
Definition apr_siphash.h:72
APR Strings library.
APR Standard Headers Support.
static apr_pool_t * pconf
Definition event.c:441
char * ap_server_root_relative(apr_pool_t *p, const char *fname)
Definition config.c:1594
const char server_rec server_rec ** ps
request_rec * r
#define DECLINED
Definition httpd.h:457
#define OK
Definition httpd.h:456
#define APLOGNO(n)
Definition http_log.h:117
#define ap_log_error
Definition http_log.h:370
#define APLOG_MARK
Definition http_log.h:283
#define APLOG_CRIT
Definition http_log.h:66
server_rec * ap_server_conf
Definition config.c:62
const char * ap_get_protocol(conn_rec *c)
Definition protocol.c:2397
void * dummy
Definition http_vhost.h:62
void const char * arg
Definition http_vhost.h:63
#define APR_EBADPATH
Definition apr_errno.h:332
#define APR_ENOTIMPL
Definition apr_errno.h:476
#define APR_EINVAL
Definition apr_errno.h:711
const char apr_ssize_t slen
Definition apr_encode.h:168
#define APR_HOOK_LINK(name)
Definition apr_hooks.h:139
#define APR_HOOK_STRUCT(members)
Definition apr_hooks.h:135
#define APR_RETRIEVE_OPTIONAL_FN(name)
#define APR_OPTIONAL_FN_TYPE(name)
#define APR_URI_UNP_OMITPASSWORD
Definition apr_uri.h:68
#define HTTP_INTERNAL_SERVER_ERROR
Definition httpd.h:535
#define M_GET
Definition httpd.h:592
void * ap_calloc(size_t nelem, size_t size) __attribute__((malloc))
Definition util.c:3160
#define ap_assert(exp)
Definition httpd.h:2271
#define GLOBAL_ONLY
const char * ap_check_cmd_context(cmd_parms *cmd, unsigned forbidden)
Definition core.c:1301
apr_size_t size
apr_uint32_t val
Definition apr_atomic.h:66
const char int apr_pool_t * pool
Definition apr_cstr.h:84
#define APR_SUCCESS
Definition apr_errno.h:225
int apr_status_t
Definition apr_errno.h:44
const char * fname
apr_vformatter_buff_t * c
Definition apr_lib.h:175
#define apr_pool_create(newpool, parent)
Definition apr_pools.h:322
apr_shm_t * shm
const void apr_size_t bytes
Definition apr_random.h:91
const char * s
Definition apr_strings.h:95
apr_int32_t apr_int32_t apr_int32_t err
apr_cmdtype_e cmd
int int status
const char * ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip)
Definition core.c:957
const char * ap_get_useragent_host(request_rec *req, int type, int *str_is_ip)
Definition core.c:1036
#define REMOTE_NOLOOKUP
Definition http_core.h:111
apr_status_t ap_mpm_query(int query_code, int *result)
Definition mpm_common.c:421
#define AP_MPMQ_MAX_DAEMON_USED
Definition ap_mpm.h:150
#define AP_MPMQ_HARD_LIMIT_THREADS
Definition ap_mpm.h:158
#define AP_MPMQ_GENERATION
Definition ap_mpm.h:178
#define AP_MPMQ_HARD_LIMIT_DAEMONS
Definition ap_mpm.h:156
Apache Configuration.
CORE HTTP Daemon.
Apache Logging library.
Command line options.
HTTP protocol handling.
HTTP Daemon routines.
apr_pool_t * p
Definition md_event.c:32
static apr_off_t ap_logio_get_last_bytes(conn_rec *c)
Definition mod_logio.c:89
return NULL
Definition mod_so.c:359
int i
Definition mod_so.c:347
void ap_create_sb_handle(ap_sb_handle_t **new_sbh, apr_pool_t *p, int child_num, int thread_num)
Definition scoreboard.c:432
#define SIZE_OF_process_score
Definition scoreboard.c:135
void ap_set_conn_count(ap_sb_handle_t *sb, request_rec *r, unsigned short conn_count)
Definition scoreboard.c:367
int ap_mod_status_reqtail
Definition scoreboard.c:73
static int server_limit
Definition scoreboard.c:112
#define SIZE_OF_global_score
Definition scoreboard.c:134
static apr_status_t open_scoreboard(apr_pool_t *pconf)
Definition scoreboard.c:208
void ap_update_sb_handle(ap_sb_handle_t *sbh, int child_num, int thread_num)
Definition scoreboard.c:425
static apr_status_t ap_cleanup_shared_mem(void *d)
Definition scoreboard.c:123
worker_score * ap_get_scoreboard_worker_from_indexes(int x, int y)
Definition scoreboard.c:667
static int update_child_status_internal(int child_num, int thread_num, int status, conn_rec *c, server_rec *s, request_rec *r, const char *descr)
Definition scoreboard.c:475
apr_status_t ap_cleanup_scoreboard(void *d)
Definition scoreboard.c:285
void ap_time_process_request(ap_sb_handle_t *sbh, int status)
Definition scoreboard.c:632
scoreboard * ap_scoreboard_image
Definition scoreboard.c:44
int ap_update_child_status_from_server(ap_sb_handle_t *sbh, int status, conn_rec *c, server_rec *s)
Definition scoreboard.c:613
const char * ap_scoreboard_fname
Definition scoreboard.c:45
void ap_init_scoreboard(void *shared_score)
Definition scoreboard.c:150
void ap_increment_counts(ap_sb_handle_t *sb, request_rec *r)
Definition scoreboard.c:379
void ap_copy_scoreboard_worker(worker_score *dest, int child_num, int thread_num)
Definition scoreboard.c:685
int ap_create_scoreboard(apr_pool_t *p, ap_scoreboard_e sb_type)
Definition scoreboard.c:304
int ap_exists_scoreboard_image(void)
Definition scoreboard.c:362
int ap_extended_status
Definition scoreboard.c:61
apr_status_t ap_reopen_scoreboard(apr_pool_t *p, apr_shm_t **shm, int detached)
Definition scoreboard.c:263
int ap_update_child_status(ap_sb_handle_t *sbh, int status, request_rec *r)
Definition scoreboard.c:590
#define SIZE_OF_worker_score
Definition scoreboard.c:136
static apr_OFN_ap_logio_get_last_bytes_t * pfn_ap_logio_get_last_bytes
Definition scoreboard.c:105
static apr_size_t scoreboard_size
Definition scoreboard.c:113
static int thread_limit
Definition scoreboard.c:112
static ap_scoreboard_e scoreboard_type
Definition scoreboard.c:46
int ap_update_global_status(void)
Definition scoreboard.c:656
int ap_update_child_status_descr(ap_sb_handle_t *sbh, int status, const char *descr)
Definition scoreboard.c:623
#define SIZE_OF_scoreboard
Definition scoreboard.c:133
int ap_calc_scoreboard_size(void)
Definition scoreboard.c:138
int ap_update_child_status_from_indexes(int child_num, int thread_num, int status, request_rec *r)
Definition scoreboard.c:575
const char * ap_set_scoreboard(cmd_parms *cmd, void *dummy, const char *arg)
Definition scoreboard.c:48
int ap_find_child_by_pid(apr_proc_t *pid)
Definition scoreboard.c:409
int ap_update_child_status_from_conn(ap_sb_handle_t *sbh, int status, conn_rec *c)
Definition scoreboard.c:603
const char * ap_set_extended_status(cmd_parms *cmd, void *dummy, int arg)
Definition scoreboard.c:63
worker_score * ap_get_scoreboard_worker(ap_sb_handle_t *sbh)
Definition scoreboard.c:676
global_score * ap_get_scoreboard_global(void)
Definition scoreboard.c:710
process_score * ap_get_scoreboard_process(int x)
Definition scoreboard.c:702
const char * ap_set_reqtail(cmd_parms *cmd, void *dummy, int arg)
Definition scoreboard.c:75
static void copy_request(char *rbuf, apr_size_t rbuflen, request_rec *r)
Definition scoreboard.c:439
static apr_status_t create_namebased_scoreboard(apr_pool_t *pool, const char *fname)
Definition scoreboard.c:183
Apache scoreboard library.
#define SERVER_STARTING
Definition scoreboard.h:57
#define DEFAULT_SCOREBOARD
Definition scoreboard.h:43
#define START_PREQUEST
Definition scoreboard.h:249
ap_scoreboard_e
Definition scoreboard.h:83
@ SB_SHARED
Definition scoreboard.h:85
#define SERVER_DEAD
Definition scoreboard.h:56
#define STOP_PREQUEST
Definition scoreboard.h:250
#define SERVER_READY
Definition scoreboard.h:58
char * password
Definition apr_uri.h:93
Structure to store things which are per connection.
Definition httpd.h:1152
ap_generation_t running_generation
Definition scoreboard.h:126
apr_time_t restart_time
Definition scoreboard.h:129
A structure that represents the current request.
Definition httpd.h:845
apr_off_t bytes_sent
Definition httpd.h:931
char * useragent_ip
Definition httpd.h:1101
int assbackwards
Definition httpd.h:868
char * the_request
Definition httpd.h:866
int method_number
Definition httpd.h:898
apr_pool_t * pool
Definition httpd.h:847
apr_uri_t parsed_uri
Definition httpd.h:1092
conn_rec * connection
Definition httpd.h:849
char * protocol
Definition httpd.h:879
server_rec * server
Definition httpd.h:851
const char * method
Definition httpd.h:900
worker_score ** servers
Definition scoreboard.h:163
process_score * parent
Definition scoreboard.h:162
global_score * global
Definition scoreboard.h:161
A structure to store information for each virtual server.
Definition httpd.h:1322
unsigned char status
Definition scoreboard.h:102
unsigned short conn_count
Definition scoreboard.h:103
apr_time_t start_time
Definition scoreboard.h:109