Skip to content
Closed
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
1 change: 0 additions & 1 deletion docs/source/reference-io.rst
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,6 @@ abstraction.

.. autoclass:: SocketStream
:members:
:undoc-members:
:show-inheritance:

.. autoclass:: SocketListener
Expand Down
3 changes: 3 additions & 0 deletions newsfragments/3221.doc.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Added missing docstrings for `MemorySendChannel`, `MemoryReceiveChannel`,
`MemoryChannelStatistics`, ``SocketStream`` methods, `~trio.lowlevel.ParkingLot.broken_by`,
and ``HasFileno.fileno``.
24 changes: 24 additions & 0 deletions src/trio/_channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,12 @@ def __init__(self, max_buffer_size: int | float) -> None: # noqa: PYI041

@attrs.frozen
class MemoryChannelStatistics:
"""Object returned by `MemorySendChannel.statistics` and
`MemoryReceiveChannel.statistics`.

See :func:`open_memory_channel` for details on the fields.
"""

current_buffer_used: int
max_buffer_size: int | float
open_send_channels: int
Expand Down Expand Up @@ -152,6 +158,15 @@ def statistics(self) -> MemoryChannelStatistics:
@final
@attrs.define(eq=False, repr=False, slots=False)
class MemorySendChannel(SendChannel[SendType], metaclass=NoPublicConstructor):
"""The sending end of a memory channel.

Created by `open_memory_channel`. This implements the
`~trio.abc.SendChannel` interface.

See `open_memory_channel` for details, and :ref:`channel-mpmc` for a
discussion of channel cloning.
"""

_state: MemoryChannelState[SendType]
_closed: bool = False
# This is just the tasks waiting on *this* object. As compared to
Expand Down Expand Up @@ -300,6 +315,15 @@ async def aclose(self) -> None:
@final
@attrs.define(eq=False, repr=False, slots=False)
class MemoryReceiveChannel(ReceiveChannel[ReceiveType], metaclass=NoPublicConstructor):
"""The receiving end of a memory channel.

Created by `open_memory_channel`. This implements the
`~trio.abc.ReceiveChannel` interface.

See `open_memory_channel` for details, and :ref:`channel-mpmc` for a
discussion of channel cloning.
"""

_state: MemoryChannelState[ReceiveType]
_closed: bool = False
_tasks: set[trio._core._run.Task] = attrs.Factory(set)
Expand Down
5 changes: 5 additions & 0 deletions src/trio/_core/_parking_lot.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,11 @@ class ParkingLot:
# items
_parked: OrderedDict[Task, None] = attrs.field(factory=OrderedDict, init=False)
broken_by: list[Task] = attrs.field(factory=list, init=False)
"""List of tasks that have broken this lot via `break_lot`.

If empty, the lot is not broken. If non-empty, any attempt to
`park` in this lot will raise `~trio.BrokenResourceError`.
"""

def __len__(self) -> int:
"""Returns the number of parked tasks."""
Expand Down
5 changes: 5 additions & 0 deletions src/trio/_highlevel_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ def __init__(self, socket: SocketType) -> None:
self.setsockopt(tsocket.IPPROTO_TCP, tsocket.TCP_NOTSENT_LOWAT, 2**14)

async def send_all(self, data: bytes | bytearray | memoryview) -> None:
"""See `trio.abc.SendStream.send_all`."""
if self.socket.did_shutdown_SHUT_WR:
raise trio.ClosedResourceError("can't send data after sending EOF")
with self._send_conflict_detector:
Expand All @@ -124,13 +125,15 @@ async def send_all(self, data: bytes | bytearray | memoryview) -> None:
total_sent += sent

async def wait_send_all_might_not_block(self) -> None:
"""See `trio.abc.SendStream.wait_send_all_might_not_block`."""
with self._send_conflict_detector:
if self.socket.fileno() == -1:
raise trio.ClosedResourceError
with _translate_socket_errors_to_stream_errors():
await self.socket.wait_writable()

async def send_eof(self) -> None:
"""See `trio.abc.HalfCloseableStream.send_eof`."""
with self._send_conflict_detector:
await trio.lowlevel.checkpoint()
# On macOS, calling shutdown a second time raises ENOTCONN, but
Expand All @@ -141,6 +144,7 @@ async def send_eof(self) -> None:
self.socket.shutdown(tsocket.SHUT_WR)

async def receive_some(self, max_bytes: int | None = None) -> bytes:
"""See `trio.abc.ReceiveStream.receive_some`."""
if max_bytes is None:
max_bytes = DEFAULT_RECEIVE_SIZE
if max_bytes < 1:
Expand All @@ -149,6 +153,7 @@ async def receive_some(self, max_bytes: int | None = None) -> bytes:
return await self.socket.recv(max_bytes)

async def aclose(self) -> None:
"""See `trio.abc.AsyncResource.aclose`."""
self.socket.close()
await trio.lowlevel.checkpoint()

Expand Down
4 changes: 3 additions & 1 deletion src/trio/_subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,9 @@ def pidfd_open(fd: int, flags: int) -> int:
class HasFileno(Protocol):
"""Represents any file-like object that has a file descriptor."""

def fileno(self) -> int: ...
def fileno(self) -> int:
"""Return the underlying file descriptor as an integer."""
...


@final
Expand Down
Loading