aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/state/state.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/state/state.go')
-rw-r--r--internal/app/state/state.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/internal/app/state/state.go b/internal/app/state/state.go
new file mode 100644
index 00000000..42750ec6
--- /dev/null
+++ b/internal/app/state/state.go
@@ -0,0 +1,49 @@
+// Package state provides cross-process state tracking for hakurei container instances.
+package state
+
+import (
+ "errors"
+ "io"
+ "time"
+
+ "hakurei.app/hst"
+)
+
+var ErrNoConfig = errors.New("state does not contain config")
+
+type Entries map[ID]*State
+
+type Store interface {
+ // Do calls f exactly once and ensures store exclusivity until f returns.
+ // Returns whether f is called and any errors during the locking process.
+ // Cursor provided to f becomes invalid as soon as f returns.
+ Do(aid int, f func(c Cursor)) (ok bool, err error)
+
+ // List queries the store and returns a list of aids known to the store.
+ // Note that some or all returned aids might not have any active apps.
+ List() (aids []int, err error)
+
+ // Close releases any resources held by Store.
+ Close() error
+}
+
+// Cursor provides access to the store
+type Cursor interface {
+ Save(state *State, configWriter io.WriterTo) error
+ Destroy(id ID) error
+ Load() (Entries, error)
+ Len() (int, error)
+}
+
+// State is an instance state
+type State struct {
+ // hakurei instance id
+ ID ID `json:"instance"`
+ // child process PID value
+ PID int `json:"pid"`
+ // sealed app configuration
+ Config *hst.Config `json:"config"`
+
+ // process start time
+ Time time.Time `json:"time"`
+}