Handle cancelation on EventFD.read

Guillermo Rodriguez 2025-03-13 22:43:02 -03:00
parent 75d7757017
commit b6bc57c4e0
No known key found for this signature in database
GPG Key ID: 002CC5F1E6BDA53E
3 changed files with 9 additions and 10 deletions

View File

@ -4,7 +4,6 @@ import trio
import pytest import pytest
import tractor import tractor
from tractor.ipc import ( from tractor.ipc import (
EFD_NONBLOCK,
open_eventfd, open_eventfd,
RingBuffSender, RingBuffSender,
RingBuffReceiver RingBuffReceiver
@ -95,7 +94,7 @@ async def child_write_shm(
'large_payloads_large_buffer', 'large_payloads_large_buffer',
] ]
) )
def test_ring_buff( def test_ringbuf(
msg_amount: int, msg_amount: int,
rand_min: int, rand_min: int,
rand_max: int, rand_max: int,
@ -171,8 +170,7 @@ async def child_blocked_receiver(
def test_ring_reader_cancel(): def test_ring_reader_cancel():
flags = EFD_NONBLOCK write_eventfd = open_eventfd()
write_eventfd = open_eventfd(flags=flags)
wrap_eventfd = open_eventfd() wrap_eventfd = open_eventfd()
proc_kwargs = { proc_kwargs = {
@ -201,7 +199,6 @@ def test_ring_reader_cancel():
write_eventfd=write_eventfd, write_eventfd=write_eventfd,
wrap_eventfd=wrap_eventfd, wrap_eventfd=wrap_eventfd,
shm_key=shm_key, shm_key=shm_key,
flags=flags
) as (sctx, _sent), ) as (sctx, _sent),
): ):
await trio.sleep(1) await trio.sleep(1)

View File

@ -133,8 +133,10 @@ class EventFD:
return write_eventfd(self._fd, value) return write_eventfd(self._fd, value)
async def read(self) -> int: async def read(self) -> int:
#TODO: how to handle signals? return await trio.to_thread.run_sync(
return await trio.to_thread.run_sync(read_eventfd, self._fd) read_eventfd, self._fd,
abandon_on_cancel=True
)
def open(self): def open(self):
self._fobj = os.fdopen(self._fd, self._omode) self._fobj = os.fdopen(self._fd, self._omode)

View File

@ -45,7 +45,7 @@ class RingBuffSender(trio.abc.SendStream):
wrap_eventfd: int, wrap_eventfd: int,
start_ptr: int = 0, start_ptr: int = 0,
buf_size: int = 10 * 1024, buf_size: int = 10 * 1024,
clean_shm_on_exit: bool = True unlink_on_exit: bool = True
): ):
self._shm = SharedMemory( self._shm = SharedMemory(
name=shm_key, name=shm_key,
@ -55,7 +55,7 @@ class RingBuffSender(trio.abc.SendStream):
self._write_event = EventFD(write_eventfd, 'w') self._write_event = EventFD(write_eventfd, 'w')
self._wrap_event = EventFD(wrap_eventfd, 'r') self._wrap_event = EventFD(wrap_eventfd, 'r')
self._ptr = start_ptr self._ptr = start_ptr
self.clean_shm_on_exit = clean_shm_on_exit self.unlink_on_exit = unlink_on_exit
@property @property
def key(self) -> str: def key(self) -> str:
@ -104,7 +104,7 @@ class RingBuffSender(trio.abc.SendStream):
async def aclose(self): async def aclose(self):
self._write_event.close() self._write_event.close()
self._wrap_event.close() self._wrap_event.close()
if self.clean_shm_on_exit: if self.unlink_on_exit:
self._shm.unlink() self._shm.unlink()
else: else: