summaryrefslogtreecommitdiff
path: root/internal/server/background/background.go
diff options
context:
space:
mode:
authorPaul Bütow <pbuetow@mimecast.com>2020-02-22 09:51:55 +0000
committerPaul Bütow <pbuetow@mimecast.com>2020-02-22 09:51:55 +0000
commit7b400fdc922599bdd6f6c6d6c1dc4a664f104365 (patch)
tree84d26907fbe51f827447cc82a4b9c642c91847f5 /internal/server/background/background.go
parent5122df790b77fb915c910e57de260e6ed0563af7 (diff)
background "class" works
Diffstat (limited to 'internal/server/background/background.go')
-rw-r--r--internal/server/background/background.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/internal/server/background/background.go b/internal/server/background/background.go
new file mode 100644
index 0000000..d31c1f2
--- /dev/null
+++ b/internal/server/background/background.go
@@ -0,0 +1,66 @@
+package background
+
+import (
+ "context"
+ "sync"
+
+ "github.com/mimecast/dtail/internal/io/logger"
+)
+
+type job struct {
+ cancel context.CancelFunc
+ done <-chan struct{}
+}
+
+type Background struct {
+ mutex sync.Mutex
+ jobs map[string]job
+}
+
+func NewBackground() *Background {
+ return &Background{
+ jobs: make(map[string]job),
+ }
+}
+
+func (b Background) Add(name string, cancel context.CancelFunc, done <-chan struct{}) {
+ b.mutex.Lock()
+ defer b.mutex.Unlock()
+
+ logger.Debug("background", name, "adding job")
+ b.jobs[name] = job{cancel, done}
+}
+
+func (b Background) get(name string) (job, bool) {
+ b.mutex.Lock()
+ defer b.mutex.Unlock()
+
+ job, ok := b.jobs[name]
+ return job, ok
+}
+
+func (b Background) delete(name string) {
+ b.mutex.Lock()
+ defer b.mutex.Unlock()
+
+ delete(b.jobs, name)
+}
+
+func (b Background) Stop(name string) {
+ logger.Debug("background", name, "stopping job")
+ job, ok := b.get(name)
+
+ if !ok {
+ logger.Debug("background", name, "no such job")
+ return
+ }
+
+ logger.Debug("background", name, "canceling job")
+ job.cancel()
+
+ logger.Debug("background", name, "waiting for job to complete")
+ <-job.done
+
+ logger.Debug("background", name, "deleting job")
+ b.delete(name)
+}