Bläddra i källkod

Remove auto_delete in favor of std::unique_ptr

Tatsuhiro Tsujikawa 12 år sedan
förälder
incheckning
05d85e2965

+ 1 - 1
src/AppleTLSSession.cc

@@ -349,7 +349,7 @@ AppleTLSSession::AppleTLSSession(AppleTLSContext* ctx)
       state_ = st_error;
       return;
     }
-    auto_delete<const void*> del_certs(certs, CFRelease);
+    std::unique_ptr<void, decltype(&CFRelease)> del_certs(certs, CFRelease);
     lastError_ = SSLSetCertificate(sslCtx_, certs);
     if (lastError_ != noErr) {
       A2_LOG_ERROR(fmt("AppleTLS: Failed to set credentials: %s", getLastErrorString().c_str()));

+ 3 - 1
src/LibgnutlsTLSSession.cc

@@ -209,7 +209,9 @@ int GnuTLSSession::tlsConnect(const std::string& hostname,
     if(rv_ != GNUTLS_E_SUCCESS) {
       return TLS_ERR_ERROR;
     }
-    auto_delete<gnutls_x509_crt_t> certDeleter(cert, gnutls_x509_crt_deinit);
+    std::unique_ptr<std::remove_pointer<gnutls_x509_crt_t>::type,
+                    decltype(&gnutls_x509_crt_deinit)> certDeleter
+      (cert, gnutls_x509_crt_deinit);
     rv_ = gnutls_x509_crt_import(cert, &peerCerts[0], GNUTLS_X509_FMT_DER);
     if(rv_ != GNUTLS_E_SUCCESS) {
       return TLS_ERR_ERROR;

+ 4 - 3
src/LibsslTLSSession.cc

@@ -193,7 +193,8 @@ int OpenSSLTLSSession::tlsConnect(const std::string& hostname,
       handshakeErr = "certificate not found";
       return TLS_ERR_ERROR;
     }
-    auto_delete<X509*> certDeleter(peerCert, X509_free);
+    std::unique_ptr<X509, decltype(&X509_free)> certDeleter
+      (peerCert, X509_free);
     long verifyResult = SSL_get_verify_result(ssl_);
     if(verifyResult != X509_V_OK) {
       handshakeErr = X509_verify_cert_error_string(verifyResult);
@@ -206,8 +207,8 @@ int OpenSSLTLSSession::tlsConnect(const std::string& hostname,
     altNames = reinterpret_cast<GENERAL_NAMES*>
       (X509_get_ext_d2i(peerCert, NID_subject_alt_name, NULL, NULL));
     if(altNames) {
-      auto_delete<GENERAL_NAMES*> altNamesDeleter
-        (altNames, GENERAL_NAMES_free);
+      std::unique_ptr<GENERAL_NAMES, decltype(&GENERAL_NAMES_free)>
+        altNamesDeleter(altNames, GENERAL_NAMES_free);
       size_t n = sk_GENERAL_NAME_num(altNames);
       for(size_t i = 0; i < n; ++i) {
         const GENERAL_NAME* altName = sk_GENERAL_NAME_value(altNames, i);

+ 2 - 1
src/NameResolver.cc

@@ -58,7 +58,8 @@ void NameResolver::resolve(std::vector<std::string>& resolvedAddresses,
                            hostname.c_str(), gai_strerror(s)),
                        error_code::NAME_RESOLVE_ERROR);
   }
-  WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
+  std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
+    (res, freeaddrinfo);
   struct addrinfo* rp;
   for(rp = res; rp; rp = rp->ai_next) {
     std::pair<std::string, uint16_t> addressPort

+ 14 - 7
src/SocketCore.cc

@@ -250,7 +250,8 @@ static sock_t bindTo
     error = gai_strerror(s);
     return -1;
   }
-  WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
+  std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
+    (res, freeaddrinfo);
   struct addrinfo* rp;
   for(rp = res; rp; rp = rp->ai_next) {
     sock_t fd = bindInternal(rp->ai_family, rp->ai_socktype, rp->ai_protocol,
@@ -409,7 +410,8 @@ void SocketCore::establishConnection(const std::string& host, uint16_t port,
   if(s) {
     throw DL_ABORT_EX(fmt(EX_RESOLVE_HOSTNAME, host.c_str(), gai_strerror(s)));
   }
-  WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
+  std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
+    (res, freeaddrinfo);
   struct addrinfo* rp;
   int errNum;
   for(rp = res; rp; rp = rp->ai_next) {
@@ -888,7 +890,8 @@ ssize_t SocketCore::writeData(const void* data, size_t len,
   if(s) {
     throw DL_ABORT_EX(fmt(EX_SOCKET_SEND, gai_strerror(s)));
   }
-  WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
+  std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
+    (res, freeaddrinfo);
   struct addrinfo* rp;
   ssize_t r = -1;
   int errNum = 0;
@@ -1005,7 +1008,8 @@ void getInterfaceAddress
     A2_LOG_INFO(fmt(MSG_INTERFACE_NOT_FOUND,
                     iface.c_str(), errorMsg(errNum).c_str()));
   } else {
-    auto_delete<ifaddrs*> ifaddrDeleter(ifaddr, freeifaddrs);
+    std::unique_ptr<ifaddrs, decltype(&freeifaddrs)> ifaddrDeleter
+      (ifaddr, freeifaddrs);
     for(ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
       if(!ifa->ifa_addr) {
         continue;
@@ -1044,7 +1048,8 @@ void getInterfaceAddress
     if(s) {
       A2_LOG_INFO(fmt(MSG_INTERFACE_NOT_FOUND, iface.c_str(), gai_strerror(s)));
     } else {
-      WSAAPI_AUTO_DELETE<addrinfo*> resDeleter(res, freeaddrinfo);
+      std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
+        (res, freeaddrinfo);
       addrinfo* rp;
       for(rp = res; rp; rp = rp->ai_next) {
         // Try to bind socket with this address. If it fails, the
@@ -1156,7 +1161,8 @@ size_t getBinAddr(void* dest, const std::string& ip)
                      0, AI_NUMERICHOST, 0) != 0) {
     return len;
   }
-  WSAAPI_AUTO_DELETE<addrinfo*> resDeleter(res, freeaddrinfo);
+  std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
+    (res, freeaddrinfo);
   for(addrinfo* rp = res; rp; rp = rp->ai_next) {
     sockaddr_union su;
     memcpy(&su, rp->ai_addr, rp->ai_addrlen);
@@ -1309,7 +1315,8 @@ void checkAddrconfig()
     A2_LOG_INFO(fmt("getifaddrs failed. Cause: %s", errorMsg(errNum).c_str()));
     return;
   }
-  auto_delete<ifaddrs*> ifaddrDeleter(ifaddr, freeifaddrs);
+  std::unique_ptr<ifaddrs, decltype(&freeifaddrs)> ifaddrDeleter
+    (ifaddr, freeifaddrs);
   char host[NI_MAXHOST];
   sockaddr_union ad;
   for(ifaddrs* ifa = ifaddr; ifa; ifa = ifa->ifa_next) {

+ 0 - 27
src/a2functional.h

@@ -54,33 +54,6 @@ public:
   }
 };
 
-template<typename T>
-class auto_delete {
-private:
-  T obj_;
-  void (*deleter_)(T);
-public:
-  auto_delete(T obj, void (*deleter)(T)):obj_(obj), deleter_(deleter) {}
-
-  ~auto_delete()
-  {
-    deleter_(obj_);
-  }
-};
-
-template<typename T>
-class auto_delete_d {
-private:
-  T obj_;
-public:
-  auto_delete_d(T obj):obj_(obj) {}
-
-  ~auto_delete_d()
-  {
-    delete obj_;
-  }
-};
-
 template<typename T, typename R>
 class auto_delete_r {
 private:

+ 0 - 20
src/a2netcompat.h

@@ -108,26 +108,6 @@
 # endif // !SHUT_WR
 #endif // __MINGW32__
 
-#ifdef __MINGW32__
-template<typename T>
-class wsaapi_auto_delete {
-private:
-  T obj_;
-  void (WSAAPI*deleter_)(T);
-public:
-  wsaapi_auto_delete(T obj, void (WSAAPI*deleter)(T)):
-    obj_(obj), deleter_(deleter) {}
-
-  ~wsaapi_auto_delete()
-  {
-    deleter_(obj_);
-  }
-};
-# define WSAAPI_AUTO_DELETE wsaapi_auto_delete
-#else // !__MINGW32__
-# define WSAAPI_AUTO_DELETE auto_delete
-#endif // !__MINGW32__
-
 union sockaddr_union {
   sockaddr sa;
   sockaddr_storage storage;

+ 4 - 2
test/SocketCoreTest.cc

@@ -89,7 +89,8 @@ void SocketCoreTest::testInetNtop()
     addrinfo* res;
     CPPUNIT_ASSERT_EQUAL(0, callGetaddrinfo(&res, s.c_str(), 0, AF_INET,
                                             SOCK_STREAM, 0, 0));
-    WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
+    std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
+      (res, freeaddrinfo);
     sockaddr_in addr;
     memcpy(&addr, res->ai_addr, sizeof(addr));
     CPPUNIT_ASSERT_EQUAL(0, inetNtop(AF_INET, &addr.sin_addr,
@@ -101,7 +102,8 @@ void SocketCoreTest::testInetNtop()
     addrinfo* res;
     CPPUNIT_ASSERT_EQUAL(0, callGetaddrinfo(&res, s.c_str(), 0, AF_INET6,
                                             SOCK_STREAM, 0, 0));
-    WSAAPI_AUTO_DELETE<struct addrinfo*> resDeleter(res, freeaddrinfo);
+    std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> resDeleter
+      (res, freeaddrinfo);
     sockaddr_in6 addr;
     memcpy(&addr, res->ai_addr, sizeof(addr));
     CPPUNIT_ASSERT_EQUAL(0, inetNtop(AF_INET6, &addr.sin6_addr,