summaryrefslogtreecommitdiffstats
path: root/gamechestcli/gamechest/runners/runnerbase.py
diff options
context:
space:
mode:
Diffstat (limited to 'gamechestcli/gamechest/runners/runnerbase.py')
-rw-r--r--gamechestcli/gamechest/runners/runnerbase.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/gamechestcli/gamechest/runners/runnerbase.py b/gamechestcli/gamechest/runners/runnerbase.py
new file mode 100644
index 0000000..ac64ebb
--- /dev/null
+++ b/gamechestcli/gamechest/runners/runnerbase.py
@@ -0,0 +1,44 @@
+from abc import ABCMeta, abstractmethod
+
+
+class RunnerBase(metaclass=ABCMeta):
+
+ @abstractmethod
+ def get_read_fd(self):
+ 'fd to select for read evts to know when to progress_read nonblockingly'
+ raise NotImplementedError
+
+ @abstractmethod
+ def progress_read(self):
+ 'parse the fd given by get_read_fd and returns current progress'
+ raise NotImplementedError
+
+ @abstractmethod
+ def terminate(self):
+ '''signal runner(s) to cancel immediately the operation, must
+ be idempotent if already terminated (not running)'''
+ raise NotImplementedError
+
+ @abstractmethod
+ def poll(self):
+ 'returns None if still running, otherwise return returncode'
+ raise NotImplementedError
+
+ def close(self):
+ 'frees resources, clean/unzombify/gc/close-fds, can block if running'
+
+ def __enter__(self):
+ 'returns self'
+ return self
+
+ def __exit__(self, exc_type, value, traceback):
+ 'terminate and wait garbage-collect'
+ self.terminate()
+ self.close()
+
+
+neutral_locale_variables = {
+ 'LC_ALL':'C.UTF-8',
+ 'LANG':'C.UTF-8',
+ 'LANGUAGE':'C.UTF-8',
+}