Skip to content

v1.1.3 - Stability Refactor & Crash Prevention Update

Latest

Choose a tag to compare

@DolbyDAX2 DolbyDAX2 released this 13 Jun 05:03
· 2 commits to main since this release

🌐 v1.1.3 Release Notes / Sürüm Notları

🇬🇧 English

v1.1.3 - Stability Refactor & Crash Prevention Update

This update is a comprehensive stability and code quality release, derived from three independent code review reports. It focuses on eliminating crash risks, memory leaks, performance bottlenecks, and security vulnerabilities without changing any UI functionality.

Critical Fixes:

  • Unified _tray_instance Architecture: Resolved a critical global variable conflict where _tray_instance was defined in two places (ui.py and ui_utils.py) with different references, causing cleanup_tray_icon() and cleanup_on_exit() to silently fail. Now a single centralized reference in ui_utils.py is used, ensuring reliable tray icon and server process cleanup on application exit or crash.
  • Removed Fragile sys.modules Access: Eliminated all race-condition-prone dynamic module lookups via sys.modules['LlamaTray.ui'] in cleanup_tray_icon(), cleanup_on_exit(), and AboutDialog. All components now use the centralized ui_utils._tray_instance reference directly.
  • Duplicate Cleanup Registration Prevented: Removed the duplicate atexit.register(cleanup_on_exit) mechanism. Cleanup is now handled exclusively through the Qt aboutToQuit signal, preventing double-execution and potential crashes.
  • closeEvent NoneType Crash Prevention: Added callable(original_close_event) check and safe QMainWindow.closeEvent(self.window, event) delegation to prevent TypeError: 'NoneType' object is not callable crashes when closing the window.
  • QComboBox Validator Fix: Fixed QComboBox.setValidator() which silently fails in PyQt6. Now correctly uses self.context_size_combobox.lineEdit().setValidator(QIntValidator(512, 1000000)) to properly validate context size input.

Server Process Management Hardening:

  • Shell Injection Prevention: Replaced ["bash", "-c", f"lsof -ti:{port} | xargs kill -9"] with safe list-based subprocess.run(["lsof", "-ti", str(port)]) calls, eliminating shell injection risk.
  • Graceful Process Termination: Port cleanup now sends SIGTERM first, polls for port release with 0.5s intervals (up to 3 seconds), and only falls back to SIGKILL if the process doesn't respond gracefully.
  • find_llama_server() Caching: Results of shutil.which("llama-server") are now cached at module level, eliminating redundant which lookups in start_server().

Performance Optimizations:

  • Non-blocking CPU Monitoring: Changed psutil.cpu_percent(interval=0.1) to interval=0, removing the 100ms UI thread blockage that occurred every second during system monitor updates.
  • NVML Resource Leak Fix: Added pynvml.nvmlShutdown() call in SystemMonitor.__del__() and a dedicated _shutdown_gpu() method, preventing NVIDIA driver resource leaks on application exit.

Desktop Environment Compatibility:

  • Dynamic QT Theme Detection: Replaced hardcoded os.environ["QT_QPA_PLATFORM_THEME"] = "kde" with dynamic detection using XDG_CURRENT_DESKTOP. Now correctly sets the theme for KDE, GNOME, or falls back to Qt defaults for other environments (XFCE, i3, Sway, etc.).

Code Quality Cleanup:

  • Removed Unused Imports: Cleaned up unused import json and import os in profile_manager.py.
  • Version Bump: All version strings updated to v1.1.3.

🇹🇷 Türkçe

v1.1.3 - Kararlılık Refactoring ve Çökme Önleme Güncellemesi

Bu güncelleme, üç bağımsız kod inceleme raporundan elde edilen bulgular doğrultusunda hazırlanmış kapsamlı bir kararlılık ve kod kalitesi sürümüdür. Herhangi bir UI işlevselliğini değiştirmeden çökme risklerini, bellek sızıntılarını, performans darboğazlarını ve güvenlik açıklarını ortadan kaldırmaya odaklanır.

Kritik Düzeltmeler:

  • Birleşik _tray_instance Mimarisi: _tray_instance değişkeninin iki ayrı yerde (ui.py ve ui_utils.py) farklı referanslarla tanımlanmasından kaynaklanan kritik global değişken çakışması giderildi. Artık ui_utils.py'deki tek bir merkezi referans kullanılarak, uygulama kapanışında veya çökmesinde tepsi ikonu ve sunucu sürecinin güvenilir şekilde temizlenmesi sağlanıyor.
  • Kırılgan sys.modules Erişimi Kaldırıldı: cleanup_tray_icon(), cleanup_on_exit() ve AboutDialog içindeki race-condition riskli tüm dinamik modül okumaları (sys.modules['LlamaTray.ui']) temizlendi. Tüm bileşenler artık doğrudan merkezi ui_utils._tray_instance referansını kullanıyor.
  • Çifte Temizlik Kaydı Önlendi: Yinelenen atexit.register(cleanup_on_exit) mekanizması kaldırıldı. Temizlik artık yalnızca Qt aboutToQuit sinyali ile yönetilerek çift çalıştırma ve olası çökmeler önleniyor.
  • closeEvent NoneType Çökme Önleme: Pencere kapatılırken TypeError: 'NoneType' object is not callable hatasıyla çökmeyi önlemek için callable(original_close_event) kontrolü ve güvenli QMainWindow.closeEvent(self.window, event) delegasyonu eklendi.
  • QComboBox Validator Düzeltmesi: PyQt6'da sessizce başarısız olan QComboBox.setValidator() kullanımı düzeltildi. Artık self.context_size_combobox.lineEdit().setValidator(QIntValidator(512, 1000000)) ile context size girişi doğru şekilde doğrulanıyor.

Sunucu Süreç Yönetimi Güçlendirmesi:

  • Shell Injection Önlemi: ["bash", "-c", f"lsof -ti:{port} | xargs kill -9"] yapısı güvenli liste tabanlı subprocess.run(["lsof", "-ti", str(port)]) çağrılarıyla değiştirilerek shell injection riski tamamen ortadan kaldırıldı.
  • Kademeli Süreç Sonlandırma: Port temizliği artık önce SIGTERM gönderiyor, 0.5 saniye aralıklarla portun boşalmasını poll ediyor (maksimum 3 saniye) ve sadece süreç yanıt vermezse SIGKILL aşamasına geçiyor.
  • find_llama_server() Önbellekleme: shutil.which("llama-server") sonucu modül seviyesinde önbelleğe alınarak start_server() içindeki gereksiz ikincil which aramaları ortadan kaldırıldı.

Performans İyileştirmeleri:

  • Bloke Etmeyen CPU İzleme: psutil.cpu_percent(interval=0.1) değeri interval=0 olarak değiştirilerek sistem monitörü güncellemeleri sırasında her saniye yaşanan 100ms'lik UI thread blokajı kaldırıldı.
  • NVML Kaynak Sızıntısı Düzeltmesi: SystemMonitor.__del__() içine pynvml.nvmlShutdown() çağrısı ve özel _shutdown_gpu() metodu eklenerek uygulama kapanışında NVIDIA sürücü kaynak sızıntısı önlendi.

Masaüstü Ortamı Uyumluluğu:

  • Dinamik QT Tema Algılama: Sabit os.environ["QT_QPA_PLATFORM_THEME"] = "kde" satırı, XDG_CURRENT_DESKTOP değişkenini kullanan dinamik algılama ile değiştirildi. Artık KDE, GNOME için doğru tema ayarlanıyor, diğer ortamlarda (XFCE, i3, Sway vb.) Qt varsayılanları kullanılıyor.

Kod Kalitesi Temizliği:

  • Kullanılmayan Import'lar Temizlendi: profile_manager.py'deki kullanılmayan import json ve import os satırları kaldırıldı.
  • Sürüm Güncellemesi: Tüm sürüm bilgileri v1.1.3 olarak güncellendi.

Full Changelog: v1.1.2...v1.1.3