diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2010-08-09 20:39:54 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-08-09 20:39:54 (GMT) |
commit | 6e451df800af66eefe68ea15938bd65029af06c5 (patch) | |
tree | 3a94bf3c48a965f464f1f112d384076103a4676a | |
parent | 30e86a47676d2175901af29445aec5bd7967ef76 (diff) | |
download | cpython-6e451df800af66eefe68ea15938bd65029af06c5.zip cpython-6e451df800af66eefe68ea15938bd65029af06c5.tar.gz cpython-6e451df800af66eefe68ea15938bd65029af06c5.tar.bz2 |
Followup to r83869 and issue #8524: rename socket.forget() to socket.detach()
and make it return the file descriptor.
-rw-r--r-- | Doc/library/socket.rst | 17 | ||||
-rw-r--r-- | Doc/whatsnew/3.2.rst | 2 | ||||
-rw-r--r-- | Lib/ssl.py | 2 | ||||
-rw-r--r-- | Lib/test/test_socket.py | 14 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/socketmodule.c | 16 |
6 files changed, 29 insertions, 24 deletions
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 2b43266..f340920 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -538,6 +538,15 @@ correspond to Unix system calls applicable to sockets. connects. +.. method:: socket.detach() + + Put the socket object into closed state without actually closing the + underlying file descriptor. The file descriptor is returned, and can + be reused for other purposes. + + .. versionadded:: 3.2 + + .. method:: socket.fileno() Return the socket's file descriptor (a small integer). This is useful with @@ -548,14 +557,6 @@ correspond to Unix system calls applicable to sockets. this limitation. -.. method:: socket.forget() - - Put the socket object into closed state without actually closing the - underlying file descriptor. This allows the latter to be reused. - - .. versionadded:: 3.2 - - .. method:: socket.getpeername() Return the remote address to which the socket is connected. This is useful to diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 487298f..bc31764 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -136,7 +136,7 @@ New, Improved, and Deprecated Modules (Contributed by Tarek Ziadé.) -* Socket objects now have a :meth:`~socket.socket.forget()` method which +* Socket objects now have a :meth:`~socket.socket.detach()` method which puts the socket into closed state without actually closing the underlying file descriptor. The latter can then be reused for other purposes. @@ -157,7 +157,7 @@ class SSLSocket(socket): raise else: connected = True - sock.forget() + sock.detach() elif fileno is not None: socket.__init__(self, fileno=fileno) else: diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index ae34c11..a95e743 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -655,17 +655,21 @@ class BasicTCPTest(SocketConnectedTest): self.serv_conn.send(MSG) self.serv_conn.shutdown(2) - def testForget(self): - # Testing forget() - f = self.cli_conn.fileno() - self.cli_conn.forget() + def testDetach(self): + # Testing detach() + fileno = self.cli_conn.fileno() + f = self.cli_conn.detach() + self.assertEqual(f, fileno) + # cli_conn cannot be used anymore... self.assertRaises(socket.error, self.cli_conn.recv, 1024) self.cli_conn.close() + # ...but we can create another socket using the (still open) + # file descriptor sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f) msg = sock.recv(1024) self.assertEqual(msg, MSG) - def _testForget(self): + def _testDetach(self): self.serv_conn.send(MSG) @unittest.skipUnless(thread, 'Threading required for this test.') @@ -30,7 +30,7 @@ Core and Builtins Extensions ---------- -- Issue #8524: Add a forget() method to socket objects, so as to put the +- Issue #8524: Add a detach() method to socket objects, so as to put the socket into the closed state without closing the underlying file descriptor. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index fc671e0..b1a616e 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1870,19 +1870,19 @@ PyDoc_STRVAR(close_doc, Close the socket. It cannot be used after this call."); static PyObject * -sock_forget(PySocketSockObject *s) +sock_detach(PySocketSockObject *s) { + SOCKET_T fd = s->sock_fd; s->sock_fd = -1; - Py_INCREF(Py_None); - return Py_None; + return PyLong_FromSocket_t(fd); } -PyDoc_STRVAR(forget_doc, -"forget()\n\ +PyDoc_STRVAR(detach_doc, +"detach()\n\ \n\ Close the socket object without closing the underlying file descriptor.\ The object cannot be used after this call, but the file descriptor\ -can be reused for other purposes."); +can be reused for other purposes. The file descriptor is returned."); static int internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, @@ -2772,10 +2772,10 @@ static PyMethodDef sock_methods[] = { connect_doc}, {"connect_ex", (PyCFunction)sock_connect_ex, METH_O, connect_ex_doc}, + {"detach", (PyCFunction)sock_detach, METH_NOARGS, + detach_doc}, {"fileno", (PyCFunction)sock_fileno, METH_NOARGS, fileno_doc}, - {"forget", (PyCFunction)sock_forget, METH_NOARGS, - forget_doc}, #ifdef HAVE_GETPEERNAME {"getpeername", (PyCFunction)sock_getpeername, METH_NOARGS, getpeername_doc}, |