From b69fe9baf1baae957ed1aa78a1be502218bbc0aa Mon Sep 17 00:00:00 2001 From: Adam Simpkins Date: Tue, 28 May 2013 21:21:58 -0700 Subject: [PATCH] move addTakeoverListener() to the Server API Make addTakeoverListener() part of the top-level server API, instead of being specific to LibEventServerWithTakeover. Servers that don't support socket takeover simply ignore this call. This will allow future server implementations to support socket takeover. This also allows us to start making the server creation logic in HttpServer a bit more generic, since the code can always call addTakeoverListener() without having to know if it really has a LibEventServerWithTakeover or some other type of server. --- hphp/runtime/base/server/http_server.cpp | 4 ++-- hphp/runtime/base/server/http_server.h | 4 ++-- .../server/libevent_server_with_takeover.h | 12 ++---------- hphp/runtime/base/server/server.h | 18 ++++++++++++++++++ 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/hphp/runtime/base/server/http_server.cpp b/hphp/runtime/base/server/http_server.cpp index 3757474ad..e6b129dcd 100644 --- a/hphp/runtime/base/server/http_server.cpp +++ b/hphp/runtime/base/server/http_server.cpp @@ -99,10 +99,10 @@ HttpServer::HttpServer(void *sslCTX /* = NULL */) RuntimeOption::RequestTimeoutSeconds); maybeEnableThrottle(server.get()); server->setTransferFilename(RuntimeOption::TakeoverFilename); - server->addTakeoverListener(this); m_pageServer = server; } m_pageServer->setRequestHandlerFactory(); + m_pageServer->addTakeoverListener(this); if (RuntimeOption::EnableSSL && m_sslCTX) { assert(SSLInit::IsInited()); @@ -215,7 +215,7 @@ void HttpServer::onServerShutdown() { } } -void HttpServer::takeoverShutdown(LibEventServerWithTakeover* server) { +void HttpServer::takeoverShutdown(HPHP::Server* server) { assert(server == m_pageServer.get()); // We want to synchronously shut down our satellite servers to free up ports, // then asynchronously shut down everything else. diff --git a/hphp/runtime/base/server/http_server.h b/hphp/runtime/base/server/http_server.h index 5baf1e852..10e424c96 100644 --- a/hphp/runtime/base/server/http_server.h +++ b/hphp/runtime/base/server/http_server.h @@ -34,7 +34,7 @@ public: static time_t StartTime; public: - HttpServer(void *sslCTX = nullptr); + explicit HttpServer(void *sslCTX = nullptr); ~HttpServer(); void run(); @@ -47,7 +47,7 @@ public: void flushLog(); void watchDog(); - void takeoverShutdown(LibEventServerWithTakeover* server); + void takeoverShutdown(HPHP::Server* server); ServerPtr getPageServer() { return m_pageServer;} diff --git a/hphp/runtime/base/server/libevent_server_with_takeover.h b/hphp/runtime/base/server/libevent_server_with_takeover.h index 0ca2a1682..f5c22de4b 100644 --- a/hphp/runtime/base/server/libevent_server_with_takeover.h +++ b/hphp/runtime/base/server/libevent_server_with_takeover.h @@ -22,8 +22,6 @@ namespace HPHP { /////////////////////////////////////////////////////////////////////////////// -class TakeoverListener; - /** * LibEventServer that adds the ability to take over an accept socket * from another process, and give its accept socket up. @@ -42,10 +40,10 @@ public: m_transfer_fname = fname; } - void addTakeoverListener(TakeoverListener* lisener) { + virtual void addTakeoverListener(TakeoverListener* lisener) { m_takeover_listeners.insert(lisener); } - void removeTakeoverListener(TakeoverListener* lisener) { + virtual void removeTakeoverListener(TakeoverListener* lisener) { m_takeover_listeners.erase(lisener); } @@ -67,12 +65,6 @@ protected: bool m_took_over; }; -class TakeoverListener { -public: - virtual ~TakeoverListener(); - virtual void takeoverShutdown(LibEventServerWithTakeover* server) = 0; -}; - /////////////////////////////////////////////////////////////////////////////// } diff --git a/hphp/runtime/base/server/server.h b/hphp/runtime/base/server/server.h index 5c8bdb38c..e338bf650 100644 --- a/hphp/runtime/base/server/server.h +++ b/hphp/runtime/base/server/server.h @@ -85,6 +85,16 @@ public: virtual void handleRequest(Transport *transport) = 0; }; +/** + * A callback to be informed when a server is shutting down because its socket + * has been taken over by a new process. + */ +class TakeoverListener { +public: + virtual ~TakeoverListener(); + virtual void takeoverShutdown(Server* server) = 0; +}; + typedef std::function()> RequestHandlerFactory; typedef std::function URLChecker; @@ -146,6 +156,14 @@ public: m_urlChecker = checker; } + /** + * Add or remove a TakeoverListener to this server. + * + * This is a no-op for servers that do not support socket takeover. + */ + virtual void addTakeoverListener(TakeoverListener* lisener) {} + virtual void removeTakeoverListener(TakeoverListener* lisener) {} + /** * Informational. */