From 7b400fdc922599bdd6f6c6d6c1dc4a664f104365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20B=C3=BCtow?= Date: Sat, 22 Feb 2020 09:51:55 +0000 Subject: background "class" works --- internal/server/background/background.go | 66 ++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 internal/server/background/background.go (limited to 'internal/server/background/background.go') 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) +} -- cgit v1.2.3