mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-08 05:04:15 +02:00
[flatpak] fix: runtimes update-checking for version 1.5.x | [cache] fix: thread lock
This commit is contained in:
@@ -21,9 +21,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- History panel can now me maximized, minimized and allows to copy column content.
|
- History panel can now me maximized, minimized and allows to copy column content.
|
||||||
- It is possible to use custom tray icons via the environment variables: **BAUH_TRAY_DEFAULT_ICON_PATH** and ** **BAUH_TRAY_UPDATES_ICON_PATH** ( displayed when there are updates )
|
- It is possible to use custom tray icons via the environment variables: **BAUH_TRAY_DEFAULT_ICON_PATH** and ** **BAUH_TRAY_UPDATES_ICON_PATH** ( displayed when there are updates )
|
||||||
- Minor UI improvements
|
- Minor UI improvements
|
||||||
- CacheCleaner removed due to random crashes associated with Python threading lock
|
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
- cache thread lock that was hanging the application
|
||||||
|
- Flatpak:
|
||||||
|
- Runtimes update-checking for version 1.5.X
|
||||||
- Snap:
|
- Snap:
|
||||||
- retrieving installed applications information for Ubuntu based distros
|
- retrieving installed applications information for Ubuntu based distros
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from bauh.view.core.downloader import AdaptableFileDownloader
|
|||||||
from bauh.view.qt.systray import TrayIcon
|
from bauh.view.qt.systray import TrayIcon
|
||||||
from bauh.view.qt.window import ManageWindow
|
from bauh.view.qt.window import ManageWindow
|
||||||
from bauh.view.util import util, logs, resource
|
from bauh.view.util import util, logs, resource
|
||||||
from bauh.view.util.cache import DefaultMemoryCacheFactory
|
from bauh.view.util.cache import DefaultMemoryCacheFactory, CacheCleaner
|
||||||
from bauh.view.util.disk import DefaultDiskCacheLoaderFactory
|
from bauh.view.util.disk import DefaultDiskCacheLoaderFactory
|
||||||
|
|
||||||
|
|
||||||
@@ -27,7 +27,8 @@ def main():
|
|||||||
|
|
||||||
i18n_key, i18n = util.get_locale_keys(args.locale)
|
i18n_key, i18n = util.get_locale_keys(args.locale)
|
||||||
|
|
||||||
cache_factory = DefaultMemoryCacheFactory(expiration_time=args.cache_exp)
|
cache_cleaner = CacheCleaner()
|
||||||
|
cache_factory = DefaultMemoryCacheFactory(expiration_time=args.cache_exp, cleaner=cache_cleaner)
|
||||||
icon_cache = cache_factory.new(args.icon_exp)
|
icon_cache = cache_factory.new(args.icon_exp)
|
||||||
|
|
||||||
http_client = HttpClient(logger)
|
http_client = HttpClient(logger)
|
||||||
@@ -90,6 +91,7 @@ def main():
|
|||||||
manage_window.refresh_apps()
|
manage_window.refresh_apps()
|
||||||
manage_window.show()
|
manage_window.show()
|
||||||
|
|
||||||
|
cache_cleaner.start()
|
||||||
sys.exit(app.exec_())
|
sys.exit(app.exec_())
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -163,7 +163,10 @@ def list_updates_as_str(version: str):
|
|||||||
updates = new_subprocess([BASE_CMD, 'update']).stdout
|
updates = new_subprocess([BASE_CMD, 'update']).stdout
|
||||||
|
|
||||||
out = StringIO()
|
out = StringIO()
|
||||||
for o in new_subprocess(['grep', '-E', r'[0-9]+.\s+(\w+|\.)+\s+\w+\s+(\w|\.)+', '-o', '--color=never'], stdin=updates).stdout:
|
|
||||||
|
reg = r'[0-9]+\.\s+(\w+|\.)+\s+(\w|\.)+' if version >= '1.5.0' else r'[0-9]+\.\s+(\w+|\.)+\s+\w+\s+(\w|\.)+'
|
||||||
|
|
||||||
|
for o in new_subprocess(['grep', '-E', reg, '-o', '--color=never'], stdin=updates).stdout:
|
||||||
if o:
|
if o:
|
||||||
out.write('/'.join(o.decode().strip().split('\t')[2:]) + '\n')
|
out.write('/'.join(o.decode().strip().split('\t')[2:]) + '\n')
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import time
|
import time
|
||||||
from multiprocessing import Lock
|
from threading import Lock, Thread
|
||||||
from threading import Thread
|
|
||||||
|
|
||||||
from bauh.api.abstract.cache import MemoryCache, MemoryCacheFactory
|
from bauh.api.abstract.cache import MemoryCache, MemoryCacheFactory
|
||||||
|
|
||||||
@@ -33,14 +32,14 @@ class DefaultMemoryCache(MemoryCache):
|
|||||||
def add_non_existing(self, key: str, val: object):
|
def add_non_existing(self, key: str, val: object):
|
||||||
if key and self. is_enabled():
|
if key and self. is_enabled():
|
||||||
self.lock.acquire()
|
self.lock.acquire()
|
||||||
cur_val = self.get(key)
|
cur_val = self.get(key, lock=False)
|
||||||
|
|
||||||
if cur_val is None:
|
if cur_val is None:
|
||||||
self._add(key, val)
|
self._add(key, val)
|
||||||
|
|
||||||
self.lock.release()
|
self.lock.release()
|
||||||
|
|
||||||
def get(self, key: str):
|
def get(self, key: str, lock: bool = True):
|
||||||
if key and self.is_enabled():
|
if key and self.is_enabled():
|
||||||
val = self._cache.get(key)
|
val = self._cache.get(key)
|
||||||
|
|
||||||
@@ -48,9 +47,14 @@ class DefaultMemoryCache(MemoryCache):
|
|||||||
expiration = val.get('expires_at')
|
expiration = val.get('expires_at')
|
||||||
|
|
||||||
if expiration and expiration <= datetime.datetime.utcnow():
|
if expiration and expiration <= datetime.datetime.utcnow():
|
||||||
self.lock.acquire()
|
if lock:
|
||||||
|
self.lock.acquire()
|
||||||
|
|
||||||
del self._cache[key]
|
del self._cache[key]
|
||||||
self.lock.release()
|
|
||||||
|
if lock:
|
||||||
|
self.lock.release()
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return val['val']
|
return val['val']
|
||||||
@@ -71,15 +75,38 @@ class DefaultMemoryCache(MemoryCache):
|
|||||||
self.get(key)
|
self.get(key)
|
||||||
|
|
||||||
|
|
||||||
|
class CacheCleaner(Thread):
|
||||||
|
|
||||||
|
def __init__(self, check_interval: int = 15):
|
||||||
|
super(CacheCleaner, self).__init__(daemon=True)
|
||||||
|
self.caches = []
|
||||||
|
self.check_interval = check_interval
|
||||||
|
|
||||||
|
def register(self, cache: MemoryCache):
|
||||||
|
if cache.is_enabled():
|
||||||
|
self.caches.append(cache)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
if self.caches:
|
||||||
|
while True:
|
||||||
|
for cache in self.caches:
|
||||||
|
cache.clean_expired()
|
||||||
|
|
||||||
|
time.sleep(self.check_interval)
|
||||||
|
|
||||||
|
|
||||||
class DefaultMemoryCacheFactory(MemoryCacheFactory):
|
class DefaultMemoryCacheFactory(MemoryCacheFactory):
|
||||||
|
|
||||||
def __init__(self, expiration_time: int):
|
def __init__(self, expiration_time: int, cleaner: CacheCleaner):
|
||||||
"""
|
"""
|
||||||
:param expiration_time: default expiration time for all instantiated caches
|
:param expiration_time: default expiration time for all instantiated caches
|
||||||
|
:param cleaner
|
||||||
"""
|
"""
|
||||||
super(DefaultMemoryCacheFactory, self).__init__()
|
super(DefaultMemoryCacheFactory, self).__init__()
|
||||||
self.expiration_time = expiration_time
|
self.expiration_time = expiration_time
|
||||||
|
self.cleaner = cleaner
|
||||||
|
|
||||||
def new(self, expiration: int = None) -> MemoryCache:
|
def new(self, expiration: int = None) -> MemoryCache:
|
||||||
instance = DefaultMemoryCache(expiration if expiration is not None else self.expiration_time)
|
instance = DefaultMemoryCache(expiration if expiration is not None else self.expiration_time)
|
||||||
|
self.cleaner.register(instance)
|
||||||
return instance
|
return instance
|
||||||
|
|||||||
Reference in New Issue
Block a user