mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
bpo-32373: Add socket.getblocking() method. (#4926)
This commit is contained in:
parent
631fd38dbf
commit
f11b460d87
4 changed files with 119 additions and 4 deletions
|
@ -136,6 +136,7 @@ sendall(data[, flags]) -- send all data\n\
|
|||
send(data[, flags]) -- send data, may not send all of it\n\
|
||||
sendto(data[, flags], addr) -- send data to a given address\n\
|
||||
setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
|
||||
getblocking() -- return True if socket is blocking, False if non-blocking\n\
|
||||
setsockopt(level, optname, value[, optlen]) -- set socket options\n\
|
||||
settimeout(None | float) -- set or clear the timeout\n\
|
||||
shutdown(how) -- shut down traffic in one or both directions\n\
|
||||
|
@ -2525,6 +2526,27 @@ Set the socket to blocking (flag is true) or non-blocking (false).\n\
|
|||
setblocking(True) is equivalent to settimeout(None);\n\
|
||||
setblocking(False) is equivalent to settimeout(0.0).");
|
||||
|
||||
/* s.getblocking() method.
|
||||
Returns True if socket is in blocking mode,
|
||||
False if it is in non-blocking mode.
|
||||
*/
|
||||
static PyObject *
|
||||
sock_getblocking(PySocketSockObject *s)
|
||||
{
|
||||
if (s->sock_timeout) {
|
||||
Py_RETURN_TRUE;
|
||||
}
|
||||
else {
|
||||
Py_RETURN_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(getblocking_doc,
|
||||
"getblocking()\n\
|
||||
\n\
|
||||
Returns True if socket is in blocking mode, or False if it\n\
|
||||
is in non-blocking mode.");
|
||||
|
||||
static int
|
||||
socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
|
||||
{
|
||||
|
@ -2581,7 +2603,30 @@ sock_settimeout(PySocketSockObject *s, PyObject *arg)
|
|||
return NULL;
|
||||
|
||||
s->sock_timeout = timeout;
|
||||
if (internal_setblocking(s, timeout < 0) == -1) {
|
||||
|
||||
int block = timeout < 0;
|
||||
/* Blocking mode for a Python socket object means that operations
|
||||
like :meth:`recv` or :meth:`sendall` will block the execution of
|
||||
the current thread until they are complete or aborted with a
|
||||
`socket.timeout` or `socket.error` errors. When timeout is `None`,
|
||||
the underlying FD is in a blocking mode. When timeout is a positive
|
||||
number, the FD is in a non-blocking mode, and socket ops are
|
||||
implemented with a `select()` call.
|
||||
|
||||
When timeout is 0.0, the FD is in a non-blocking mode.
|
||||
|
||||
This table summarizes all states in which the socket object and
|
||||
its underlying FD can be:
|
||||
|
||||
==================== ===================== ==============
|
||||
`gettimeout()` `getblocking()` FD
|
||||
==================== ===================== ==============
|
||||
``None`` ``True`` blocking
|
||||
``0.0`` ``False`` non-blocking
|
||||
``> 0`` ``True`` non-blocking
|
||||
*/
|
||||
|
||||
if (internal_setblocking(s, block) == -1) {
|
||||
return NULL;
|
||||
}
|
||||
Py_RETURN_NONE;
|
||||
|
@ -4601,6 +4646,8 @@ static PyMethodDef sock_methods[] = {
|
|||
sendto_doc},
|
||||
{"setblocking", (PyCFunction)sock_setblocking, METH_O,
|
||||
setblocking_doc},
|
||||
{"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
|
||||
getblocking_doc},
|
||||
{"settimeout", (PyCFunction)sock_settimeout, METH_O,
|
||||
settimeout_doc},
|
||||
{"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue