88 lines
3.4 KiB
Python
88 lines
3.4 KiB
Python
"""
|
|
Universal Fallback Backend
|
|
===========================
|
|
Uses psutil for basic system memory info (last resort on ANY OS).
|
|
Provides safe defaults when no GPU backend is available.
|
|
"""
|
|
|
|
import logging
|
|
from .base import MonitorBackend, HardwareStats
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class FallbackBackend(MonitorBackend):
|
|
"""psutil fallback — works on both Windows and Linux"""
|
|
name = "psutil-fallback"
|
|
|
|
def initialize(self) -> bool:
|
|
try:
|
|
import psutil
|
|
self.available = True
|
|
self.gpu_count = 1
|
|
self.gpu_names = ["System RAM (no GPU backend)"]
|
|
logger.info("Fallback: psutil active")
|
|
return True
|
|
except ImportError:
|
|
logger.debug("Fallback: psutil not installed — using manual /proc/meminfo")
|
|
try:
|
|
# Manual fallback: read /proc/meminfo on Linux
|
|
with open('/proc/meminfo', 'r') as f:
|
|
for line in f:
|
|
if line.startswith('MemTotal:'):
|
|
self.available = True
|
|
self.gpu_count = 1
|
|
self.gpu_names = ["System RAM (no GPU backend)"]
|
|
return True
|
|
except Exception:
|
|
pass
|
|
return False
|
|
|
|
def get_stats(self, gpu_id: int = 0) -> HardwareStats:
|
|
try:
|
|
import psutil
|
|
svmem = psutil.virtual_memory()
|
|
return HardwareStats(
|
|
gpu_id=gpu_id,
|
|
gpu_name=self.gpu_names[0] if self.gpu_names else "System RAM",
|
|
vendor="unknown",
|
|
driver="psutil-fallback",
|
|
is_apu=True,
|
|
utilization_memory=(svmem.used / svmem.total * 100) if svmem.total > 0 else 0,
|
|
memory_total=svmem.total,
|
|
memory_used=svmem.used,
|
|
memory_free=svmem.available,
|
|
memory_shared=svmem.total,
|
|
is_available=True,
|
|
)
|
|
except ImportError:
|
|
# Manual /proc/meminfo fallback
|
|
try:
|
|
total = 0
|
|
available = 0
|
|
with open('/proc/meminfo', 'r') as f:
|
|
for line in f:
|
|
if line.startswith('MemTotal:'):
|
|
total = int(line.split()[1]) * 1024
|
|
elif line.startswith('MemAvailable:'):
|
|
available = int(line.split()[1]) * 1024
|
|
used = total - available
|
|
return HardwareStats(
|
|
gpu_id=gpu_id,
|
|
gpu_name=self.gpu_names[0] if self.gpu_names else "System RAM",
|
|
vendor="unknown",
|
|
driver="manual-fallback",
|
|
is_apu=True,
|
|
utilization_memory=(used / total * 100) if total > 0 else 0,
|
|
memory_total=total,
|
|
memory_used=used,
|
|
memory_free=available,
|
|
memory_shared=total,
|
|
is_available=True,
|
|
)
|
|
except Exception as e:
|
|
return HardwareStats(
|
|
gpu_id=gpu_id,
|
|
is_available=False,
|
|
error_message=str(e),
|
|
) |