Annotation of win32/apache22/include/scoreboard.h, revision 1.1

1.1     ! moko        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: /**
        !            18:  * @file  scoreboard.h
        !            19:  * @brief Apache scoreboard library
        !            20:  */
        !            21: 
        !            22: #ifndef APACHE_SCOREBOARD_H
        !            23: #define APACHE_SCOREBOARD_H
        !            24: 
        !            25: #ifdef __cplusplus
        !            26: extern "C" {
        !            27: #endif
        !            28: 
        !            29: #ifdef HAVE_SYS_TIMES_H
        !            30: #include <sys/time.h>
        !            31: #include <sys/times.h>
        !            32: #elif defined(TPF)
        !            33: #include <time.h>
        !            34: #endif
        !            35: 
        !            36: #include "ap_config.h"
        !            37: #include "apr_hooks.h"
        !            38: #include "apr_thread_proc.h"
        !            39: #include "apr_portable.h"
        !            40: #include "apr_shm.h"
        !            41: #include "apr_optional.h"
        !            42: 
        !            43: /* Scoreboard file, if there is one */
        !            44: #ifndef DEFAULT_SCOREBOARD
        !            45: #define DEFAULT_SCOREBOARD "logs/apache_runtime_status"
        !            46: #endif
        !            47: 
        !            48: /* Scoreboard info on a process is, for now, kept very brief --- 
        !            49:  * just status value and pid (the latter so that the caretaker process
        !            50:  * can properly update the scoreboard when a process dies).  We may want
        !            51:  * to eventually add a separate set of long_score structures which would
        !            52:  * give, for each process, the number of requests serviced, and info on
        !            53:  * the current, or most recent, request.
        !            54:  *
        !            55:  * Status values:
        !            56:  */
        !            57: 
        !            58: #define SERVER_DEAD 0
        !            59: #define SERVER_STARTING 1      /* Server Starting up */
        !            60: #define SERVER_READY 2         /* Waiting for connection (or accept() lock) */
        !            61: #define SERVER_BUSY_READ 3     /* Reading a client request */
        !            62: #define SERVER_BUSY_WRITE 4    /* Processing a client request */
        !            63: #define SERVER_BUSY_KEEPALIVE 5        /* Waiting for more requests via keepalive */
        !            64: #define SERVER_BUSY_LOG 6      /* Logging the request */
        !            65: #define SERVER_BUSY_DNS 7      /* Looking up a hostname */
        !            66: #define SERVER_CLOSING 8       /* Closing the connection */
        !            67: #define SERVER_GRACEFUL 9      /* server is gracefully finishing request */
        !            68: #define SERVER_IDLE_KILL 10     /* Server is cleaning up idle children. */
        !            69: #define SERVER_NUM_STATUS 11   /* number of status settings */
        !            70: 
        !            71: /* Type used for generation indicies.  Startup and every restart cause a
        !            72:  * new generation of children to be spawned.  Children within the same
        !            73:  * generation share the same configuration information -- pointers to stuff
        !            74:  * created at config time in the parent are valid across children.  However,
        !            75:  * this can't work effectively with non-forked architectures.  So while the
        !            76:  * arrays in the scoreboard never change between the parent and forked
        !            77:  * children, so they do not require shm storage, the contents of the shm
        !            78:  * may contain no pointers.
        !            79:  */
        !            80: typedef int ap_generation_t;
        !            81: 
        !            82: /* Is the scoreboard shared between processes or not? 
        !            83:  * Set by the MPM when the scoreboard is created.
        !            84:  */
        !            85: typedef enum {
        !            86:     SB_NOT_SHARED = 1,
        !            87:     SB_SHARED = 2
        !            88: } ap_scoreboard_e;
        !            89: 
        !            90: #define SB_WORKING  0  /* The server is busy and the child is useful. */
        !            91: #define SB_IDLE_DIE 1  /* The server is idle and the child is superfluous. */
        !            92:                        /*   The child should check for this and exit gracefully. */
        !            93: 
        !            94: /* stuff which is worker specific */
        !            95: /***********************WARNING***************************************/
        !            96: /* These are things that are used by mod_status. Do not put anything */
        !            97: /*   in here that you cannot live without. This structure will not   */
        !            98: /*   be available if mod_status is not loaded.                       */
        !            99: /*********************************************************************/
        !           100: typedef struct worker_score worker_score;
        !           101: 
        !           102: struct worker_score {
        !           103:     int thread_num;
        !           104: #if APR_HAS_THREADS
        !           105:     apr_os_thread_t tid;
        !           106: #endif
        !           107:     /* With some MPMs (e.g., worker), a worker_score can represent
        !           108:      * a thread in a terminating process which is no longer
        !           109:      * represented by the corresponding process_score.  These MPMs
        !           110:      * should set pid and generation fields in the worker_score.
        !           111:      */
        !           112:     pid_t pid;
        !           113:     ap_generation_t generation;
        !           114:     unsigned char status;
        !           115:     unsigned long access_count;
        !           116:     apr_off_t     bytes_served;
        !           117:     unsigned long my_access_count;
        !           118:     apr_off_t     my_bytes_served;
        !           119:     apr_off_t     conn_bytes;
        !           120:     unsigned short conn_count;
        !           121:     apr_time_t start_time;
        !           122:     apr_time_t stop_time;
        !           123: #ifdef HAVE_TIMES
        !           124:     struct tms times;
        !           125: #endif
        !           126:     apr_time_t last_used;
        !           127:     char client[32];           /* Keep 'em small... */
        !           128:     char request[64];          /* We just want an idea... */
        !           129:     char vhost[32];            /* What virtual host is being accessed? */
        !           130: };
        !           131: 
        !           132: typedef struct {
        !           133:     int             server_limit;
        !           134:     int             thread_limit;
        !           135:     ap_scoreboard_e sb_type;
        !           136:     ap_generation_t running_generation; /* the generation of children which
        !           137:                                          * should still be serving requests.
        !           138:                                          */
        !           139:     apr_time_t restart_time;
        !           140:     int             lb_limit;
        !           141: } global_score;
        !           142: 
        !           143: /* stuff which the parent generally writes and the children rarely read */
        !           144: typedef struct process_score process_score;
        !           145: struct process_score{
        !           146:     pid_t pid;
        !           147:     ap_generation_t generation;        /* generation of this child */
        !           148:     ap_scoreboard_e sb_type;
        !           149:     int quiescing;          /* the process whose pid is stored above is
        !           150:                              * going down gracefully
        !           151:                              */
        !           152: };
        !           153: 
        !           154: /* stuff which is lb specific */
        !           155: typedef struct lb_score lb_score;
        !           156: struct lb_score{
        !           157:     /* TODO: make a real stuct from this */
        !           158:     unsigned char data[1024];
        !           159: };
        !           160: 
        !           161: /* Scoreboard is now in 'local' memory, since it isn't updated once created,
        !           162:  * even in forked architectures.  Child created-processes (non-fork) will
        !           163:  * set up these indicies into the (possibly relocated) shmem records.
        !           164:  */
        !           165: typedef struct {
        !           166:     global_score *global;
        !           167:     process_score *parent;
        !           168:     worker_score **servers;
        !           169:     lb_score     *balancers;
        !           170: } scoreboard;
        !           171: 
        !           172: typedef struct ap_sb_handle_t ap_sb_handle_t;
        !           173: 
        !           174: AP_DECLARE(int) ap_exists_scoreboard_image(void);
        !           175: AP_DECLARE(void) ap_increment_counts(ap_sb_handle_t *sbh, request_rec *r);
        !           176: 
        !           177: int ap_create_scoreboard(apr_pool_t *p, ap_scoreboard_e t);
        !           178: apr_status_t ap_reopen_scoreboard(apr_pool_t *p, apr_shm_t **shm, int detached);
        !           179: void ap_init_scoreboard(void *shared_score);
        !           180: AP_DECLARE(int) ap_calc_scoreboard_size(void);
        !           181: apr_status_t ap_cleanup_scoreboard(void *d);
        !           182: 
        !           183: AP_DECLARE(void) ap_create_sb_handle(ap_sb_handle_t **new_sbh, apr_pool_t *p,
        !           184:                                      int child_num, int thread_num);
        !           185:     
        !           186: int find_child_by_pid(apr_proc_t *pid);
        !           187: AP_DECLARE(int) ap_update_child_status(ap_sb_handle_t *sbh, int status, request_rec *r);
        !           188: AP_DECLARE(int) ap_update_child_status_from_indexes(int child_num, int thread_num,
        !           189:                                                     int status, request_rec *r);
        !           190: void ap_time_process_request(ap_sb_handle_t *sbh, int status);
        !           191: 
        !           192: AP_DECLARE(worker_score *) ap_get_scoreboard_worker(int x, int y);
        !           193: AP_DECLARE(process_score *) ap_get_scoreboard_process(int x);
        !           194: AP_DECLARE(global_score *) ap_get_scoreboard_global(void);
        !           195: AP_DECLARE(lb_score *) ap_get_scoreboard_lb(int lb_num);
        !           196: 
        !           197: AP_DECLARE_DATA extern scoreboard *ap_scoreboard_image;
        !           198: AP_DECLARE_DATA extern const char *ap_scoreboard_fname;
        !           199: AP_DECLARE_DATA extern int ap_extended_status;
        !           200: AP_DECLARE_DATA extern int ap_mod_status_reqtail;
        !           201: 
        !           202: AP_DECLARE_DATA extern ap_generation_t volatile ap_my_generation;
        !           203: 
        !           204: /* Hooks */
        !           205: /**
        !           206:   * Hook for post scoreboard creation, pre mpm.
        !           207:   * @param p       Apache pool to allocate from.
        !           208:   * @param sb_type 
        !           209:   * @ingroup hooks
        !           210:   * @return OK or DECLINE on success; anything else is a error
        !           211:   */  
        !           212: AP_DECLARE_HOOK(int, pre_mpm, (apr_pool_t *p, ap_scoreboard_e sb_type))
        !           213: 
        !           214: /**
        !           215:   * proxy load balancer
        !           216:   * @return the number of load balancer workers.
        !           217:   */  
        !           218: APR_DECLARE_OPTIONAL_FN(int, ap_proxy_lb_workers,
        !           219:                         (void));
        !           220: 
        !           221: /* for time_process_request() in http_main.c */
        !           222: #define START_PREQUEST 1
        !           223: #define STOP_PREQUEST  2
        !           224: 
        !           225: #ifdef __cplusplus
        !           226: }
        !           227: #endif
        !           228: 
        !           229: #endif /* !APACHE_SCOREBOARD_H */

E-mail: