diff --git a/hphp/runtime/base/program_functions.cpp b/hphp/runtime/base/program_functions.cpp index 77a20e6c3..9891017d4 100644 --- a/hphp/runtime/base/program_functions.cpp +++ b/hphp/runtime/base/program_functions.cpp @@ -76,8 +76,9 @@ extern char **environ; namespace HPHP { extern InitFiniNode *extra_process_init, *extra_process_exit; +extern InitFiniNode *extra_server_init, *extra_server_exit; - void initialize_repo(); +void initialize_repo(); /* * XXX: VM process initialization is handled through a function @@ -680,7 +681,13 @@ static int start_server(const std::string &username) { } } + for (InitFiniNode *in = extra_server_init; in; in = in->next) { + in->func(); + } HttpServer::Server->run(); + for (InitFiniNode *in = extra_server_exit; in; in = in->next) { + in->func(); + } return 0; } diff --git a/hphp/runtime/base/thread_init_fini.cpp b/hphp/runtime/base/thread_init_fini.cpp index 6826c69bf..6154f1377 100644 --- a/hphp/runtime/base/thread_init_fini.cpp +++ b/hphp/runtime/base/thread_init_fini.cpp @@ -35,13 +35,15 @@ namespace HPHP { /////////////////////////////////////////////////////////////////////////////// InitFiniNode *extra_init, *extra_fini, *extra_process_init, *extra_process_exit; +InitFiniNode *extra_server_init, *extra_server_exit; InitFiniNode::InitFiniNode(void(*f)(), When init) { InitFiniNode *&ifn = init == When::ThreadInit ? extra_init : init == When::ThreadFini ? extra_fini : - init == When::ProcessInit ? extra_process_init : extra_process_exit; - + init == When::ProcessInit ? extra_process_init : + init == When::ProcessExit ? extra_process_exit : + init == When::ServerInit ? extra_server_init : extra_server_exit; func = f; next = ifn; ifn = this; diff --git a/hphp/runtime/base/thread_init_fini.h b/hphp/runtime/base/thread_init_fini.h index d67a93022..03e114582 100644 --- a/hphp/runtime/base/thread_init_fini.h +++ b/hphp/runtime/base/thread_init_fini.h @@ -32,7 +32,9 @@ struct InitFiniNode { ThreadInit, ThreadFini, ProcessInit, - ProcessExit + ProcessExit, + ServerInit, + ServerExit }; InitFiniNode(void(*f)(), When when); void (*func)();