From 13ebdd2f55cab36bbc58abeb5a09e67d4d48e429 Mon Sep 17 00:00:00 2001 From: Michael Emperador Date: Fri, 21 Aug 2026 23:35:40 -0500 Subject: [PATCH] refactor(runtime): remove TaskState --- SmallPackage/SmallSignals.py | 27 ++-------- SmallPackage/SmallTask.py | 7 --- SmallPackage/TaskState.py | 95 ------------------------------------ tests/test_taskState.py | 46 ----------------- 4 files changed, 5 insertions(+), 170 deletions(-) delete mode 100644 SmallPackage/TaskState.py delete mode 100644 tests/test_taskState.py diff --git a/SmallPackage/SmallSignals.py b/SmallPackage/SmallSignals.py index 2be3ce7..15bb137 100644 --- a/SmallPackage/SmallSignals.py +++ b/SmallPackage/SmallSignals.py @@ -20,7 +20,6 @@ from .SmallOS import SmallOS from .SmallTask import SmallTask - from .TaskState import TaskState from .awaitables import InstructionAwaitable from .awaitables import ( @@ -57,7 +56,6 @@ class SmallSignals: if TYPE_CHECKING: OS: SmallOS | None - state: TaskState def __init__(self, OS: SmallOS | None, kwargs: dict[str, Any]) -> None: """ @@ -141,32 +139,17 @@ def acceptSignal(self, sig: int) -> int: self.handlers(self) return 0 - def sleep( - self, secs: float, state_blob: dict[Any, Any] | None = None - ) -> InstructionAwaitable[None]: - """ - Return the awaitable used for cooperative sleeping. - - ``state_blob`` is preserved for compatibility with the older API style, - where suspension helpers could stash task-local state before yielding. - """ - if state_blob is not None: - self.state.update(state_blob) + def sleep(self, secs: float) -> InstructionAwaitable[None]: + """Return the awaitable used for cooperative sleeping.""" return sleep_instruction(secs) - def wait_signal( - self, sig: int, state_blob: dict[Any, Any] | None = None - ) -> InstructionAwaitable[int]: + def wait_signal(self, sig: int) -> InstructionAwaitable[int]: """Return the awaitable used to wait until ``sig`` is delivered.""" - if state_blob is not None: - self.state.update(state_blob) return wait_signal_instruction(sig) - def sigSuspendV2( - self, sig: int, state_blob: dict[Any, Any] | None = None - ) -> InstructionAwaitable[int]: + def sigSuspendV2(self, sig: int) -> InstructionAwaitable[int]: """Compatibility alias for the older generator-era suspension name.""" - return self.wait_signal(sig, state_blob) + return self.wait_signal(sig) def yield_now(self) -> InstructionAwaitable[None]: """Return the awaitable used for an explicit cooperative yield.""" diff --git a/SmallPackage/SmallTask.py b/SmallPackage/SmallTask.py index 6ce42ca..fb1c585 100644 --- a/SmallPackage/SmallTask.py +++ b/SmallPackage/SmallTask.py @@ -29,7 +29,6 @@ from .SmallErrors import PIDError, TaskCancelledError from .SmallSignals import SmallSignals from .list_util.linkedList import Node -from .TaskState import TaskState _MISSING = object() @@ -60,7 +59,6 @@ def __init__(self, priority: int, routine: TaskRoutine[T], **kwargs: Any) -> Non self.isWatcher = False self.parent = None self.OS: SmallOS | None = None - self.state = TaskState() self.children = [] self.name = "" self.args = () @@ -88,8 +86,6 @@ def __init__(self, priority: int, routine: TaskRoutine[T], **kwargs: Any) -> Non self._adapter_resume_name: str | None = None self._adapter_resume_job_id: int | None = None - self.state.update({"return_status": 0}, "system") - SmallSignals.__init__(self, self.OS, kwargs) if kwargs: @@ -220,7 +216,6 @@ def complete(self, result: T | None) -> T | None: self.isReady = 0 self.isWaiting = 0 self.isSleep = 0 - self.state.update({"return_status": 0, "result": result}, "system") return result def fail(self, exc: BaseException) -> BaseException: @@ -230,7 +225,6 @@ def fail(self, exc: BaseException) -> BaseException: self.isReady = 0 self.isWaiting = 0 self.isSleep = 0 - self.state.update({"return_status": -1, "exception": exc}, "system") return exc def cancel(self, message: str = "Task cancelled") -> None: @@ -270,7 +264,6 @@ def block(self, reason): self.isReady = 0 self.isWaiting = 1 if reason in ("signal", "join", "join_all", "adapter") else 0 self.isSleep = 1 if reason == "sleep" else 0 - self.state.update({"return_status": 1, "blocked_reason": reason}, "system") def setID(self, pid: int) -> None: """Assign the PID chosen by ``SmallOS`` exactly once.""" diff --git a/SmallPackage/TaskState.py b/SmallPackage/TaskState.py deleted file mode 100644 index 2cf8195..0000000 --- a/SmallPackage/TaskState.py +++ /dev/null @@ -1,95 +0,0 @@ -from __future__ import annotations - -import copy - -try: - from typing import TYPE_CHECKING -except ImportError: # pragma: no cover - TYPE_CHECKING = False - -if TYPE_CHECKING: - from typing import Any - - -''' -File Deprecated as of concurrency branch update. -''' - - -class TaskState: - - ''' - @class taskState - state management class for keeping track of - system stats and data of task. - ''' - - def __init__(self) -> None: - self._state = dict() - self._state['system'] = dict() - self._state['data'] = dict() - - - def update(self, dict_blob: dict[Any, Any], namespace: str = 'data') -> None: - ''' - @function updateState() - updates the contents of the - state object. - @param dict_blob - objects to be placed in state data. Same Keys will be - over written. - @param namespace - chooses the namespace ('system' vars or task 'data' vars). - @return void - ''' - self._state[namespace].update(dict_blob) - return - - - def isFree(self, key: Any, namespace: str = 'data') -> bool: - ''' - @function isFree() - checks to see if the key is free for - use in the state dict. - @param key - int - key to be tested if free for use or not. - @param namespace - str - chooses between system variables or data variables within - the task's state. - @return - bool - True if the key is available. False if the key is not - available. - ''' - testingSpace = self._state[namespace] - - if key in testingSpace: - return False - else: - return True - - - def free(self, key: Any, namespace: str = 'data') -> int: - ''' - @function free() - Will free the selected key from the state. - @param - key - key to be deleted. - @param namespace - str - chooses between system variables or data variables within - the task's state. - @return - int - 0 for successful deletion, 1 for no key in namespace. - ''' - if key in self._state[namespace]: - del self._state[namespace][key] - return 0 - else: - return -1 - - - def getState(self, key: Any = None, namespace: str = 'data') -> tuple[Any, int]: - ''' - @function getState - can return the entire state or just one - element of the state returns a -1 if the requested key does not exist. - @param key - str - will return the whole state if equal to None and specific item - by key if a key is given (str). - @param namespace - str - chooses between system variables or data variables within - the task's state. - @return {}, obj, -1 - - NOTE ***Returns a Deep Copy of the state so state must be updated. - ''' - if key == None: - return copy.deepcopy(self._state[namespace]), 0 - if key in self._state[namespace]: - return copy.deepcopy(self._state[namespace][key]), 0 - else: - return None, -1 diff --git a/tests/test_taskState.py b/tests/test_taskState.py deleted file mode 100644 index 6cf1ef1..0000000 --- a/tests/test_taskState.py +++ /dev/null @@ -1,46 +0,0 @@ -import sys, unittest - -sys.path.append('..') - -from SmallPackage.TaskState import TaskState - -class test_taskState(unittest.TestCase): - - def test_update_and_retieval(self): - state = TaskState() - data = {'mice':10,'men':'blob','blob':{'10':20}} - - blank_state, status = state.getState(None,'data') - self.assertEqual(blank_state,dict()) - - state.update(data,'data') - new_state, status = state.getState() - self.assertEqual(new_state, data) - - one_var, status = state.getState('men','data') - self.assertEqual(data['men'],one_var) - - data, failed_status = state.getState('mmmmm') - self.assertEqual(failed_status, -1) - - - def test_Free(self): - state = TaskState() - data = {'mice':10} - - isFree = state.isFree('mice','data') - self.assertEqual(isFree, True) - - state.update(data) - isFree = state.isFree('mice','data') - self.assertEqual(isFree, False) - - state.free('mice','data') - isFree = state.isFree('mice','data') - self.assertEqual(isFree, True) - - - - -if __name__ == '__main__': - unittest.main() \ No newline at end of file