Lock models when trying to decrypt events

Trying to deep-copy can result in pickling errors (#50),
write-lock the models instead to avoid "dictionary changed size during
iteration" issues.
This commit is contained in:
miruka 2020-05-28 14:16:43 -04:00
parent c0118c4e28
commit 60fa027c2e

View File

@ -1176,7 +1176,8 @@ class MatrixClient(nio.AsyncClient):
_, room_id, _ = sync_id
for ev in deepcopy(model).values():
with model.write_lock:
for ev in model.values():
room = self.all_rooms[room_id]
if isinstance(ev.source, nio.MegolmEvent):
@ -1189,9 +1190,11 @@ class MatrixClient(nio.AsyncClient):
except nio.EncryptionError:
continue
for cb in self.event_callbacks:
if not cb.filter or isinstance(decrypted, cb.filter):
await asyncio.coroutine(cb.func)(room, decrypted)
for callback in self.event_callbacks:
filter_ = callback.filter
if not filter_ or isinstance(decrypted, filter_):
coro = asyncio.coroutine(callback.func)
await coro(room, decrypted)
async def clear_events(self, room_id: str) -> None: