podman
1package machine
2
3import (
4"os"
5"os/signal"
6"sync"
7"syscall"
8
9"github.com/sirupsen/logrus"
10)
11
12type CleanupCallback struct {
13Funcs []func() error
14mu sync.Mutex
15}
16
17func (c *CleanupCallback) CleanIfErr(err *error) {
18// Do not remove created files if the init is successful
19if *err == nil {
20return
21}
22c.clean()
23}
24
25func (c *CleanupCallback) CleanOnSignal() {
26ch := make(chan os.Signal, 1)
27signal.Notify(ch, os.Interrupt, syscall.SIGTERM)
28
29_, ok := <-ch
30if !ok {
31return
32}
33
34c.clean()
35os.Exit(1)
36}
37
38func (c *CleanupCallback) clean() {
39c.mu.Lock()
40// Claim exclusive usage by copy and resetting to nil
41funcs := c.Funcs
42c.Funcs = nil
43c.mu.Unlock()
44
45// Already claimed or none set
46if funcs == nil {
47return
48}
49
50// Cleanup functions can now exclusively be run
51for _, cleanfunc := range funcs {
52if err := cleanfunc(); err != nil {
53logrus.Error(err)
54}
55}
56}
57
58func CleanUp() CleanupCallback {
59return CleanupCallback{
60Funcs: []func() error{},
61}
62}
63
64func (c *CleanupCallback) Add(anotherfunc func() error) {
65c.mu.Lock()
66c.Funcs = append(c.Funcs, anotherfunc)
67c.mu.Unlock()
68}
69