Use dup() instead of move semantics for Network::Socket

This commit is contained in:
Keith Winstein
2012-11-23 13:31:23 -05:00
parent 05ec364b7d
commit 6a16eecce0
2 changed files with 12 additions and 14 deletions
+11 -11
View File
@@ -140,8 +140,7 @@ void Connection::prune_sockets( void )
}
Connection::Socket::Socket()
: _fd( socket( AF_INET, SOCK_DGRAM, 0 ) ),
_moved( false )
: _fd( socket( AF_INET, SOCK_DGRAM, 0 ) )
{
if ( _fd < 0 ) {
throw NetworkException( "socket", errno );
@@ -570,25 +569,26 @@ uint64_t Connection::timeout( void ) const
Connection::Socket::~Socket()
{
if ( !_moved ) {
if ( close( _fd ) < 0 ) {
throw NetworkException( "close", errno );
}
if ( close( _fd ) < 0 ) {
throw NetworkException( "close", errno );
}
}
Connection::Socket::Socket( const Socket & other )
: _fd( other._fd ),
_moved( false )
: _fd( dup( other._fd ) )
{
other.move();
if ( _fd < 0 ) {
throw NetworkException( "socket", errno );
}
}
const Connection::Socket & Connection::Socket::operator=( const Socket & other )
{
_fd = other._fd;
_fd = dup( other._fd );
other.move();
if ( _fd < 0 ) {
throw NetworkException( "socket", errno );
}
return *this;
}
+1 -3
View File
@@ -107,11 +107,9 @@ namespace Network {
{
private:
int _fd;
mutable bool _moved;
public:
int fd( void ) const { assert( !_moved ); return _fd; }
void move( void ) const { assert( !_moved ); _moved = true; }
int fd( void ) const { return _fd; }
Socket();
~Socket();