Skip to content

Commit cda163f

Browse files
committed
change ReadWriteLock class
1 parent 26ed99d commit cda163f

File tree

1 file changed

+35
-6
lines changed

1 file changed

+35
-6
lines changed

libp2p/stream_muxer/mplex/mplex_stream.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from collections.abc import AsyncGenerator
2+
from contextlib import asynccontextmanager
13
from types import (
24
TracebackType,
35
)
@@ -36,13 +38,21 @@ class ReadWriteLock:
3638
def __init__(self) -> None:
3739
self._readers = 0
3840
self._readers_lock = trio.Lock() # Protects readers count
39-
self._writer_lock = trio.Semaphore(1) # Acts like a task-transferable lock
41+
self._writer_lock = trio.Semaphore(1) # Ensures mutual exclusion for writers
4042

4143
async def acquire_read(self) -> None:
42-
async with self._readers_lock:
43-
self._readers += 1
44-
if self._readers == 1:
45-
await self._writer_lock.acquire()
44+
try:
45+
async with self._readers_lock:
46+
self._readers += 1
47+
if self._readers == 1:
48+
await self._writer_lock.acquire()
49+
except trio.Cancelled:
50+
async with self._readers_lock:
51+
if self._readers > 0:
52+
self._readers -= 1
53+
if self._readers == 0:
54+
self._writer_lock.release()
55+
raise
4656

4757
async def release_read(self) -> None:
4858
async with self._readers_lock:
@@ -51,11 +61,30 @@ async def release_read(self) -> None:
5161
self._writer_lock.release()
5262

5363
async def acquire_write(self) -> None:
54-
await self._writer_lock.acquire()
64+
try:
65+
await self._writer_lock.acquire()
66+
except trio.Cancelled:
67+
raise
5568

5669
def release_write(self) -> None:
5770
self._writer_lock.release()
5871

72+
@asynccontextmanager
73+
async def read_lock(self) -> AsyncGenerator[None, None]:
74+
await self.acquire_read()
75+
try:
76+
yield
77+
finally:
78+
await self.release_read()
79+
80+
@asynccontextmanager
81+
async def write_lock(self) -> AsyncGenerator[None, None]:
82+
await self.acquire_write()
83+
try:
84+
yield
85+
finally:
86+
self.release_write()
87+
5988

6089
class MplexStream(IMuxedStream):
6190
"""

0 commit comments

Comments
 (0)