]> granicus.if.org Git - pdns/commitdiff
Make `WebServer::d_server` a shared pointer
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 12 Jul 2017 12:02:04 +0000 (14:02 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 18 Jul 2017 15:38:24 +0000 (17:38 +0200)
pdns/webserver.cc
pdns/webserver.hh
pdns/ws-recursor.cc
pdns/ws-recursor.hh

index 1e08422f423845c827b0ed438a1214bbef592866..f6c77c06beb759d453c2153fd485b5e21cc2dc34 100644 (file)
@@ -331,7 +331,7 @@ catch(...) {
   L<<Logger::Error<<"HTTP: Unknown exception"<<endl;
 }
 
-WebServer::WebServer(const string &listenaddress, int port) : d_server(NULL)
+WebServer::WebServer(const string &listenaddress, int port) : d_server(nullptr)
 {
   d_listenaddress=listenaddress;
   d_port=port;
@@ -345,7 +345,7 @@ void WebServer::bind()
   }
   catch(NetworkError &e) {
     L<<Logger::Error<<"Listening on HTTP socket failed: "<<e.what()<<endl;
-    d_server = NULL;
+    d_server = nullptr;
   }
 }
 
index 3f1e5ac55a58baa7f1370b455836a7fe4d4dc0fb..d784cdf9f41962a41ed2141e7a109c9be356ea75 100644 (file)
@@ -122,6 +122,7 @@ public:
     d_server_socket.bind(d_local);
     d_server_socket.listen();
   }
+  virtual ~Server() { };
 
   ComboAddress d_local;
 
@@ -137,6 +138,7 @@ class WebServer : public boost::noncopyable
 {
 public:
   WebServer(const string &listenaddress, int port);
+  virtual ~WebServer() { };
   void bind();
   void go();
 
@@ -150,14 +152,14 @@ public:
 protected:
   void registerBareHandler(const string& url, HandlerFunction handler);
 
-  virtual Server* createServer() {
-    return new Server(d_listenaddress, d_port);
+  virtual std::shared_ptr<Server> createServer() {
+    return std::make_shared<Server>(d_listenaddress, d_port);
   }
 
   string d_listenaddress;
   int d_port;
   string d_password;
-  Server* d_server;
+  std::shared_ptr<Server> d_server;
 };
 
 #endif /* WEBSERVER_HH */
index 32b4657b50cd7e5cb31806c6482db73efaae337d..c495918d74457a08b1886b6c13df4ba0b4f22409 100644 (file)
@@ -609,5 +609,8 @@ catch(...) {
 void AsyncWebServer::go() {
   if (!d_server)
     return;
-  ((AsyncServer*)d_server)->asyncWaitForConnections(d_fdm, boost::bind(&AsyncWebServer::serveConnection, this, _1));
+  auto server = std::dynamic_pointer_cast<AsyncServer>(d_server);
+  if (!server)
+    return;
+  server->asyncWaitForConnections(d_fdm, boost::bind(&AsyncWebServer::serveConnection, this, _1));
 }
index 682e169dd5795eb4d4c300995ea905389b341ce1..f4a91cf7451512a3bcadf28d684d3cadfb0a9e74 100644 (file)
@@ -57,8 +57,8 @@ private:
   void serveConnection(Socket *socket);
 
 protected:
-  virtual Server* createServer() {
-    return new AsyncServer(d_listenaddress, d_port);
+  virtual std::shared_ptr<Server> createServer() override {
+    return std::make_shared<AsyncServer>(d_listenaddress, d_port);
   };
 };