File tree 2 files changed +26
-0
lines changed
2 files changed +26
-0
lines changed Original file line number Diff line number Diff line change @@ -28,6 +28,20 @@ This library adheres to `Semantic Versioning 2.0 <http://semver.org/>`_.
28
28
- Emit a ``ResourceWarning `` for ``MemoryObjectReceiveStream `` and
29
29
``MemoryObjectSendStream `` that were garbage collected without being closed (PR by
30
30
Andrey Kazantcev)
31
+ - Fixed memory object stream operations incorrectly raising cancelled under certain
32
+ conditions where it is too late to do so:
33
+
34
+ - Fixed memory object streams dropping items when
35
+ ``MemoryObjectSendStream.send_nowait() `` was called immediately after cancelling the
36
+ scope of an ``await MemoryObjectReceiveStream.receive() `` call (`#728
37
+ <https://github.com/agronholm/anyio/issues/728> `_)
38
+
39
+ - Fixed ``MemoryObjectSendStream.send() `` raising cancelled despite succeeding when
40
+ ``MemoryObjectReceiveStream.receive_nowait() `` is called immediately after
41
+ cancelling the scope of the ``MemoryObjectSendStream.send() `` call (`#729
42
+ <https://github.com/agronholm/anyio/issues/729> `_)
43
+
44
+ (PR by Ganden Schaffner)
31
45
32
46
**4.3.0 **
33
47
Original file line number Diff line number Diff line change 11
11
ClosedResourceError ,
12
12
EndOfStream ,
13
13
WouldBlock ,
14
+ get_cancelled_exc_class ,
14
15
)
15
16
from ..abc import Event , ObjectReceiveStream , ObjectSendStream
16
17
from ..lowlevel import checkpoint
@@ -104,6 +105,11 @@ async def receive(self) -> T_co:
104
105
105
106
try :
106
107
await receive_event .wait ()
108
+ except get_cancelled_exc_class ():
109
+ # Ignore the immediate cancellation if we already received an item, so
110
+ # as not to lose it
111
+ if not container :
112
+ raise
107
113
finally :
108
114
self ._state .waiting_receivers .pop (receive_event , None )
109
115
@@ -230,6 +236,12 @@ async def send(self, item: T_contra) -> None:
230
236
self ._state .waiting_senders [send_event ] = item
231
237
try :
232
238
await send_event .wait ()
239
+ except get_cancelled_exc_class ():
240
+ # Ignore the immediate cancellation if we already sent the item, so as
241
+ # to not indicate failure despite success
242
+ if send_event in self ._state .waiting_senders :
243
+ del self ._state .waiting_senders [send_event ]
244
+ raise
233
245
except BaseException :
234
246
self ._state .waiting_senders .pop (send_event , None )
235
247
raise
You can’t perform that action at this time.
0 commit comments