X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libtest%2Fport.cc;h=01e0e88b34426e1f014db5fd43346903d004570e;hb=cc47230b8dfe0bcd31d4f45ca84d2dd35ae360f0;hp=3ef6bd70f1f33ae53a99d94a67d810cb0452ed29;hpb=9139975f5fe7895259645117b1e0e9a6cb9c27cc;p=m6w6%2Flibmemcached diff --git a/libtest/port.cc b/libtest/port.cc index 3ef6bd70..01e0e88b 100644 --- a/libtest/port.cc +++ b/libtest/port.cc @@ -50,9 +50,11 @@ #include #include +#include +#include + #include -#include #include #ifndef __INTEL_COMPILER @@ -62,13 +64,31 @@ using namespace libtest; struct socket_st { - std::vector fd; + typedef std::vector< std::pair< int, in_port_t> > socket_port_t; + socket_port_t _pair; + + void release(in_port_t _arg) + { + for (socket_port_t::iterator iter= _pair.begin(); + iter != _pair.end(); + ++iter) + { + if ((*iter).second == _arg) + { + shutdown((*iter).first, SHUT_RDWR); + close((*iter).first); + } + } + } ~socket_st() { - for(std::vector::iterator iter= fd.begin(); iter != fd.end(); iter++) + for (socket_port_t::iterator iter= _pair.begin(); + iter != _pair.end(); + ++iter) { - close(*iter); + shutdown((*iter).first, SHUT_RDWR); + close((*iter).first); } } }; @@ -89,13 +109,18 @@ in_port_t default_port() return global_port; } +void release_port(in_port_t arg) +{ + all_socket_fd.release(arg); +} + in_port_t get_free_port() { in_port_t ret_port= in_port_t(0); int retries= 1024; - while (retries--) + while (--retries) { int sd; if ((sd= socket(AF_INET, SOCK_STREAM, 0)) != -1) @@ -120,7 +145,7 @@ in_port_t get_free_port() } } - all_socket_fd.fd.push_back(sd); + all_socket_fd._pair.push_back(std::make_pair(sd, ret_port)); } if (ret_port > 1024) @@ -130,11 +155,21 @@ in_port_t get_free_port() } // We handle the case where if we max out retries, we still abort. - if (ret_port <= 1024) + if (retries == 0) + { + fatal_message("No port could be found, exhausted retry"); + } + + if (ret_port == 0) { fatal_message("No port could be found"); } + if (ret_port <= 1024) + { + fatal_message("No port could be found, though some where available below or at 1024"); + } + return ret_port; }