| |
| |
| |
| |
| @@ -579,6 +579,21 @@ |
| sbh->thread_num); |
| } |
| |
| +AP_DECLARE(void) ap_copy_scoreboard_worker(worker_score *dest, |
| + int child_num, |
| + int thread_num) |
| +{ |
| + worker_score *ws = ap_get_scoreboard_worker_from_indexes(child_num, thread_num); |
| + |
| + memcpy(dest, ws, sizeof *ws); |
| + |
| + /* For extra safety, NUL-terminate the strings returned, though it |
| + * should be true those last bytes are always zero anyway. */ |
| + dest->client[sizeof(dest->client) - 1] = '\0'; |
| + dest->request[sizeof(dest->request) - 1] = '\0'; |
| + dest->vhost[sizeof(dest->vhost) - 1] = '\0'; |
| +} |
| + |
| AP_DECLARE(process_score *) ap_get_scoreboard_process(int x) |
| { |
| if ((x < 0) || (x >= server_limit)) { |
| |
| |
| |
| |
| @@ -194,7 +194,7 @@ |
| long req_time; |
| int short_report; |
| int no_table_report; |
| - worker_score *ws_record; |
| + worker_score *ws_record = apr_palloc(r->pool, sizeof *ws_record); |
| process_score *ps_record; |
| char *stat_buffer; |
| pid_t *pid_buffer, worker_pid; |
| @@ -306,7 +306,7 @@ |
| for (j = 0; j < thread_limit; ++j) { |
| int indx = (i * thread_limit) + j; |
| |
| - ws_record = ap_get_scoreboard_worker_from_indexes(i, j); |
| + ap_copy_scoreboard_worker(ws_record, i, j); |
| res = ws_record->status; |
| |
| if ((i >= max_servers || j >= threads_per_child) |
| @@ -637,7 +637,7 @@ |
| |
| for (i = 0; i < server_limit; ++i) { |
| for (j = 0; j < thread_limit; ++j) { |
| - ws_record = ap_get_scoreboard_worker_from_indexes(i, j); |
| + ap_copy_scoreboard_worker(ws_record, i, j); |
| |
| if (ws_record->access_count == 0 && |
| (ws_record->status == SERVER_READY || |
| |
| |
| |
| |
| @@ -1245,16 +1245,22 @@ |
| */ |
| static int lua_ap_scoreboard_worker(lua_State *L) |
| { |
| - int i, |
| - j; |
| - worker_score *ws_record; |
| + int i, j; |
| + worker_score *ws_record = NULL; |
| + request_rec *r = NULL; |
| |
| luaL_checktype(L, 1, LUA_TUSERDATA); |
| luaL_checktype(L, 2, LUA_TNUMBER); |
| luaL_checktype(L, 3, LUA_TNUMBER); |
| + |
| + r = ap_lua_check_request_rec(L, 1); |
| + if (!r) return 0; |
| + |
| i = lua_tointeger(L, 2); |
| j = lua_tointeger(L, 3); |
| - ws_record = ap_get_scoreboard_worker_from_indexes(i, j); |
| + ws_record = apr_palloc(r->pool, sizeof *ws_record); |
| + |
| + ap_copy_scoreboard_worker(ws_record, i, j); |
| if (ws_record) { |
| lua_newtable(L); |
| |
| |
| |
| |
| |
| @@ -183,8 +183,25 @@ |
| AP_DECLARE(void) ap_time_process_request(ap_sb_handle_t *sbh, int status); |
| |
| AP_DECLARE(worker_score *) ap_get_scoreboard_worker(ap_sb_handle_t *sbh); |
| + |
| +/** Return a pointer to the worker_score for a given child, thread pair. |
| + * @param child_num The child number. |
| + * @param thread_num The thread number. |
| + * @return A pointer to the worker_score structure. |
| + * @deprecated This function is deprecated, use ap_copy_scoreboard_worker instead. */ |
| AP_DECLARE(worker_score *) ap_get_scoreboard_worker_from_indexes(int child_num, |
| int thread_num); |
| + |
| +/** Copy the contents of a worker scoreboard entry. The contents of |
| + * the worker_score structure are copied verbatim into the dest |
| + * structure. |
| + * @param dest Output parameter. |
| + * @param child_num The child number. |
| + * @param thread_num The thread number. |
| + */ |
| +AP_DECLARE(void) ap_copy_scoreboard_worker(worker_score *dest, |
| + int child_num, int thread_num); |
| + |
| AP_DECLARE(process_score *) ap_get_scoreboard_process(int x); |
| AP_DECLARE(global_score *) ap_get_scoreboard_global(void); |
| |
| |