Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions tests/test_sockets.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import asyncio
import os
import pickle
import select
import socket
Expand All @@ -14,6 +15,28 @@

class _TestSockets:

def test_add_reader_writer_preserves_blocking_mode(self):
read_fd, write_fd = os.pipe()
try:
self.assertTrue(os.get_blocking(read_fd))
self.loop.add_reader(read_fd, lambda: None)
try:
self.assertTrue(os.get_blocking(read_fd))
finally:
self.loop.remove_reader(read_fd)
self.assertTrue(os.get_blocking(read_fd))

self.assertTrue(os.get_blocking(write_fd))
self.loop.add_writer(write_fd, lambda: None)
try:
self.assertTrue(os.get_blocking(write_fd))
finally:
self.loop.remove_writer(write_fd)
self.assertTrue(os.get_blocking(write_fd))
finally:
os.close(read_fd)
os.close(write_fd)

async def recv_all(self, sock, nbytes):
buf = b''
while len(buf) < nbytes:
Expand Down
11 changes: 10 additions & 1 deletion uvloop/handles/poll.pyx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
@cython.no_gc_clear
cdef class UVPoll(UVHandle):
cdef _init(self, Loop loop, int fd):
cdef int err
cdef:
int err
bint was_blocking = os_get_blocking(fd)

self._start_init(loop)

Expand All @@ -18,6 +20,13 @@ cdef class UVPoll(UVHandle):

self._finish_init()

if was_blocking:
try:
os_set_blocking(fd, True)
except BaseException:
self._close()
raise

self.fd = fd
self.reading_handle = None
self.writing_handle = None
Expand Down
2 changes: 2 additions & 0 deletions uvloop/includes/stdlib.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,8 @@ cdef os_environ = os.environ
cdef os_dup = os.dup
cdef os_set_inheritable = os.set_inheritable
cdef os_get_inheritable = os.get_inheritable
cdef os_get_blocking = os.get_blocking
cdef os_set_blocking = os.set_blocking
cdef os_close = os.close
cdef os_open = os.open
cdef os_devnull = os.devnull
Expand Down
Loading