jim 98/12/10 07:14:10
Modified: src/main http_main.c Log: Add 'reset slot vhost' logic to the ap_update_child_status function and avoid the race as well. Revision Changes Path 1.409 +11 -9 apache-1.3/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/main/http_main.c,v retrieving revision 1.408 retrieving revision 1.409 diff -u -r1.408 -r1.409 --- http_main.c 1998/12/04 19:12:16 1.408 +++ http_main.c 1998/12/10 15:14:08 1.409 @@ -2069,6 +2069,17 @@ sizeof(ss->request)); } ss->vhostrec = r->server; + } else if (status == SERVER_STARTING) { + /* clean up the slot's vhostrec pointer (maybe re-used) + * and mark the slot as belonging to a new generation. + */ + ss->vhostrec = NULL; + ap_scoreboard_image->parent[child_num].generation = ap_my_generation; +#ifdef SCOREBOARD_FILE + lseek(scoreboard_fd, XtOffsetOf(scoreboard, parent[child_num]), 0); + force_write(scoreboard_fd, &ap_scoreboard_image->parent[child_num], + sizeof(parent_score)); +#endif } } put_scoreboard_info(child_num, ss); @@ -3917,15 +3928,6 @@ Explain1("Starting new child in slot %d", slot); (void) ap_update_child_status(slot, SERVER_STARTING, (request_rec *) NULL); - /* clean up the slot's vhostrec pointer now that it is being re-used, - * and mark the slot as beloging to a new generation. - */ - /* XXX: there's still a race condition here for file-based scoreboards... - * but... like, do we really care to spend yet another write() operation - * here? -djg - */ - ap_scoreboard_image->servers[slot].vhostrec = NULL; - ap_scoreboard_image->parent[slot].generation = ap_my_generation; #ifndef _OSD_POSIX if ((pid = fork()) == -1) {