Mercurial > cpython-lru_cache-weakref
diff Modules/socketmodule.c @ 65314:12442ac3f7dd
Issue #7523: Add SOCK_CLOEXEC and SOCK_NONBLOCK to the socket module,
where supported by the system. Patch by Nikita Vetoshkin.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 14 Oct 2010 15:05:38 +0000 |
| parents | 2ce64960d490 |
| children | 02830553dbd1 |
line wrap: on
line diff
--- a/Modules/socketmodule.c Thu Oct 14 12:37:19 2010 +0000 +++ b/Modules/socketmodule.c Thu Oct 14 15:05:38 2010 +0000 @@ -615,6 +615,12 @@ #ifndef MS_WINDOWS int delay_flag; #endif +#ifdef SOCK_NONBLOCK + if (block) + s->sock_type &= (~SOCK_NONBLOCK); + else + s->sock_type |= SOCK_NONBLOCK; +#endif Py_BEGIN_ALLOW_THREADS #ifndef MS_WINDOWS @@ -764,12 +770,18 @@ s->sock_family = family; s->sock_type = type; s->sock_proto = proto; - s->sock_timeout = defaulttimeout; s->errorhandler = &set_error; - - if (defaulttimeout >= 0.0) - internal_setblocking(s, 0); +#ifdef SOCK_NONBLOCK + if (type & SOCK_NONBLOCK) + s->sock_timeout = 0.0; + else +#endif + { + s->sock_timeout = defaulttimeout; + if (defaulttimeout >= 0.0) + internal_setblocking(s, 0); + } } @@ -1645,7 +1657,9 @@ PyObject *addr = NULL; PyObject *res = NULL; int timeout; - +#ifdef HAVE_ACCEPT4 + int flags = 0; +#endif if (!getsockaddrlen(s, &addrlen)) return NULL; memset(&addrbuf, 0, addrlen); @@ -1656,8 +1670,15 @@ BEGIN_SELECT_LOOP(s) Py_BEGIN_ALLOW_THREADS timeout = internal_select_ex(s, 0, interval); - if (!timeout) + if (!timeout) { +#ifdef HAVE_ACCEPT4 + /* inherit socket flags and use accept4 call */ + flags = s->sock_type & (SOCK_CLOEXEC | SOCK_NONBLOCK); + newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen, flags); +#else newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen); +#endif /* HAVE_ACCEPT4 */ + } Py_END_ALLOW_THREADS if (timeout == 1) { @@ -4599,6 +4620,12 @@ #if defined(SOCK_RDM) PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM); #endif +#ifdef SOCK_CLOEXEC + PyModule_AddIntConstant(m, "SOCK_CLOEXEC", SOCK_CLOEXEC); +#endif +#ifdef SOCK_NONBLOCK + PyModule_AddIntConstant(m, "SOCK_NONBLOCK", SOCK_NONBLOCK); +#endif #ifdef SO_DEBUG PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);
