AP_DECLARE(void) ap_init_scoreboard(void *shared_score) { char *more_storage; int i; ap_calc_scoreboard_size(); ap_scoreboard_image = ap_calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *)); more_storage = shared_score; ap_scoreboard_image->global = (global_score *)more_storage; more_storage += sizeof(global_score); ap_scoreboard_image->parent = (process_score *)more_storage; more_storage += sizeof(process_score) * server_limit; ap_scoreboard_image->servers = (worker_score **)((char*)ap_scoreboard_image + sizeof(scoreboard)); for (i = 0; i < server_limit; i++) { ap_scoreboard_image->servers[i] = (worker_score *)more_storage; more_storage += thread_limit * sizeof(worker_score); } ap_assert(more_storage == (char*)shared_score + scoreboard_size); ap_scoreboard_image->global->server_limit = server_limit; ap_scoreboard_image->global->thread_limit = thread_limit; /* * ******* begin amiya 20140221 ******* */ //we initialize these in worker since ap_daemons_limit //is not defined until mpm_hook is run ap_scoreboard_image->global->running_maxclients = 0; ap_scoreboard_image->global->running_keepalivetimeout = 0; /* * ******* end amiya ******* */ }
/* Create or reinit an existing scoreboard. The MPM can control whether * the scoreboard is shared across multiple processes or not */ int ap_create_scoreboard(apr_pool_t *p, ap_scoreboard_e sb_type) { int i; #if APR_HAS_SHARED_MEMORY apr_status_t rv; #endif pfn_ap_logio_get_last_bytes = APR_RETRIEVE_OPTIONAL_FN(ap_logio_get_last_bytes); if (ap_scoreboard_image) { ap_scoreboard_image->global->restart_time = apr_time_now(); memset(ap_scoreboard_image->parent, 0, sizeof(process_score) * server_limit); for (i = 0; i < server_limit; i++) { memset(ap_scoreboard_image->servers[i], 0, sizeof(worker_score) * thread_limit); } return OK; } ap_calc_scoreboard_size(); #if APR_HAS_SHARED_MEMORY if (sb_type == SB_SHARED) { void *sb_shared; rv = open_scoreboard(p); if (rv || !(sb_shared = apr_shm_baseaddr_get(ap_scoreboard_shm))) { return HTTP_INTERNAL_SERVER_ERROR; } memset(sb_shared, 0, scoreboard_size); ap_init_scoreboard(sb_shared); } else #endif { /* A simple malloc will suffice */ void *sb_mem = ap_calloc(1, scoreboard_size); ap_init_scoreboard(sb_mem); } scoreboard_type = sb_type; ap_scoreboard_image->global->running_generation = 0; ap_scoreboard_image->global->restart_time = apr_time_now(); apr_pool_cleanup_register(p, NULL, ap_cleanup_scoreboard, apr_pool_cleanup_null); return OK; }
AP_DECLARE(void) ap_init_scoreboard(void *shared_score) { char *more_storage; int i; ap_calc_scoreboard_size(); ap_scoreboard_image = ap_calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *)); more_storage = shared_score; ap_scoreboard_image->global = (global_score *)more_storage; more_storage += sizeof(global_score); ap_scoreboard_image->parent = (process_score *)more_storage; more_storage += sizeof(process_score) * server_limit; ap_scoreboard_image->servers = (worker_score **)((char*)ap_scoreboard_image + sizeof(scoreboard)); for (i = 0; i < server_limit; i++) { ap_scoreboard_image->servers[i] = (worker_score *)more_storage; more_storage += thread_limit * sizeof(worker_score); } ap_assert(more_storage == (char*)shared_score + scoreboard_size); ap_scoreboard_image->global->server_limit = server_limit; ap_scoreboard_image->global->thread_limit = thread_limit; }