From 4b537dd1d252026a2f3124191c9b91791e698f90 Mon Sep 17 00:00:00 2001 From: uvok Date: Thu, 23 Jan 2025 20:29:07 +0100 Subject: Use SimpleQueue for posting statuses --- de_uvok/activitypub_fuse/fuse.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/de_uvok/activitypub_fuse/fuse.py b/de_uvok/activitypub_fuse/fuse.py index 8be5351..5a6052f 100644 --- a/de_uvok/activitypub_fuse/fuse.py +++ b/de_uvok/activitypub_fuse/fuse.py @@ -1,7 +1,7 @@ from datetime import datetime as dtp import errno import stat -from threading import Lock +from queue import SimpleQueue, Empty from fuse import ( Operations, FuseOSError, @@ -14,12 +14,9 @@ from .types import Status class StatusFileSystem(Operations, LoggingMixIn): def __init__(self): - self._lock = Lock() - - with self._lock: - self.statuses: list[Status] = [] - - self.fd = 0 + self.__queue: SimpleQueue[list[Status]] = SimpleQueue() + self.__statuses: list[Status] = [] + self.__fd = 0 def getattr(self, path, fh=None): (uid, gid, _) = fuse_get_context() @@ -30,8 +27,7 @@ class StatusFileSystem(Operations, LoggingMixIn): "st_uid": uid, "st_gid": gid, } - with self._lock: - found = next((s for s in self.statuses if s.id == path[1:]), None) + found = next((s for s in self.__statuses if s.id == path[1:]), None) if found: published_dt = dtp.fromisoformat(found.published) @@ -47,9 +43,17 @@ class StatusFileSystem(Operations, LoggingMixIn): } raise FuseOSError(errno.ENOENT) + def __update_status_field(self): + try: + while True: + statuses = self.__queue.get_nowait() + self.__statuses.extend(statuses) + except Empty: + pass + def list_dir(self) -> list[str]: - with self._lock: - return [s.id for s in self.statuses] + self.__update_status_field() + return [s.id for s in self.__statuses] def readdir(self, path, fh): dir_entries = [] @@ -60,16 +64,14 @@ class StatusFileSystem(Operations, LoggingMixIn): return dir_entries def add_statuses(self, statuses: list[Status]): - with self._lock: - self.statuses.extend(statuses) + self.__queue.put(statuses) def open(self, path, flags): # type: ignore - self.fd += 1 - return self.fd + self.__fd += 1 + return self.__fd def read(self, path, size, offset, fh): # type: ignore - with self._lock: - found = next(s for s in self.statuses if s.id == path[1:]) + found = next(s for s in self.__statuses if s.id == path[1:]) if found: return found.content.encode("utf8") -- cgit v1.2.3