diff --git a/cpu_governor_auto_adjust.xml b/cpu_governor_auto_adjust.xml index 5d550b8..8f7eec4 100644 --- a/cpu_governor_auto_adjust.xml +++ b/cpu_governor_auto_adjust.xml @@ -1,6 +1,6 @@ - Info + Debug true powersave 5 diff --git a/cpu_governor_auto_adjust/governor.py b/cpu_governor_auto_adjust/governor.py index 3cada8c..96c6227 100644 --- a/cpu_governor_auto_adjust/governor.py +++ b/cpu_governor_auto_adjust/governor.py @@ -4,6 +4,7 @@ from cpufreq import cpuFreq, cpufreq # type: ignore from functools import cached_property from cpu_governor_auto_adjust.exceptions import GovernorNotFound from typing import Optional, NamedTuple +import asyncio class Governor(NamedTuple): @@ -24,7 +25,8 @@ _governor_list: tuple[Governor, Governor, Governor, Governor, Governor, Governor class GovernorControl(AppClass): def __init__(self, _config: Config) -> None: super().__init__(_config) - self.log.info("current governor is: %s", self.current_governor) + self.governor = self.current_governor + self.log.info("current governor is: %s", self.governor) @cached_property def _cpufreq(self) -> Optional[cpuFreq]: @@ -35,9 +37,9 @@ class GovernorControl(AppClass): return None @property - def current_governor(self) -> Optional[Governor]: - if self._cpufreq is None: - return None + def current_governor(self) -> Governor: + if self._config.testmode: + return [g for g in _governor_list if g.name == "ondemand"].pop() _governor = set(self._cpufreq.get_governors().values()) _governor_to_return = self._establish_governor(list(_governor)[0]) if len(_governor) == 0: @@ -57,7 +59,7 @@ class GovernorControl(AppClass): raise RuntimeError("could not establish governor") return governor - def set_governor(self, governor_name: str) -> None: + def _set_governor(self, governor_name: str) -> None: self.log.info("setting cpu governor to %s", governor_name) if self._config.testmode: @@ -72,3 +74,11 @@ class GovernorControl(AppClass): return None self._cpufreq.set_governors(governor_name) + + async def run(self) -> None: + self.log.debug("running governor control") + while True: + if self.current_governor != self.governor: + self.log.debug("governor has changed from %s to %s", self.current_governor, self.governor) + self._set_governor(self.governor.name) + await asyncio.sleep(1) diff --git a/cpu_governor_auto_adjust/schedule.py b/cpu_governor_auto_adjust/schedule.py index 2fefde8..a352519 100644 --- a/cpu_governor_auto_adjust/schedule.py +++ b/cpu_governor_auto_adjust/schedule.py @@ -21,7 +21,7 @@ class TriggerScheduler(AppClass): def governor_control(self) -> GovernorControl: return GovernorControl(self._config) - def establish_preferred_governor(self) -> str: + def establish_preferred_governor(self) -> Governor: self.log.debug('establishing preferred governor, default governor: %s', self._config.default_governor) preferred_governor: Governor = [gov for gov in _governor_list if gov.name == self._config.default_governor].pop() for trigger in self.running_triggers: @@ -29,19 +29,8 @@ class TriggerScheduler(AppClass): if trigger._active: if trigger.governor.priority < preferred_governor.priority: preferred_governor = trigger.governor - self.log.debug('preferred governor: %s', preferred_governor.name) - return preferred_governor.name - - async def set_governor(self, governor_name: str) -> None: - if self.governor_control.current_governor is None: - self.log.debug("unable to retrieve current governor") - return - - if self.governor_control.current_governor.name == governor_name: - self.log.debug("governor is already set to: %s", governor_name) - return - - self.governor_control.set_governor(governor_name) + self.log.debug('preferred governor: %s', preferred_governor) + return preferred_governor async def start_trigger(self, _trigger: Trigger) -> None: """Start a new trigger.""" @@ -75,9 +64,9 @@ class TriggerScheduler(AppClass): self.loop.add_signal_handler(sig, partial(signal_handler, sig=signal.SIGINT)) try: + self.loop.create_task(self.governor_control.run()) while True: - preferred_governor = self.establish_preferred_governor() - await self.schedule_task(self.set_governor, preferred_governor) + self.governor_control.governor = self.establish_preferred_governor() await asyncio.sleep(1) # Keep the main function alive except asyncio.exceptions.CancelledError: pass diff --git a/pyproject.toml b/pyproject.toml index 1d2f7d3..90c87fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cpu_governor_auto_adjust" -version = "0.5.17" +version = "0.5.19" description = "This application has been developed to automatically change cpu governor based on certain triggers." authors = [ { name = "Martin Reurekas", email = "martin@semrks.nl" }