|
|
- package autofile
-
- import (
- "os"
- "os/signal"
- "sync"
- "sync/atomic"
- "syscall"
- )
-
- func init() {
- initSighupWatcher()
- }
-
- var sighupWatchers *SighupWatcher
- var sighupCounter int32 // For testing
-
- func initSighupWatcher() {
- sighupWatchers = newSighupWatcher()
-
- hup := make(chan os.Signal, 1)
- signal.Notify(hup, syscall.SIGHUP)
-
- quit := make(chan os.Signal, 1)
- signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
-
- go func() {
- select {
- case <-hup:
- sighupWatchers.closeAll()
- atomic.AddInt32(&sighupCounter, 1)
- case <-quit:
- return
- }
- }()
- }
-
- // Watchces for SIGHUP events and notifies registered AutoFiles
- type SighupWatcher struct {
- mtx sync.Mutex
- autoFiles map[string]*AutoFile
- }
-
- func newSighupWatcher() *SighupWatcher {
- return &SighupWatcher{
- autoFiles: make(map[string]*AutoFile, 10),
- }
- }
-
- func (w *SighupWatcher) addAutoFile(af *AutoFile) {
- w.mtx.Lock()
- w.autoFiles[af.ID] = af
- w.mtx.Unlock()
- }
-
- // If AutoFile isn't registered or was already removed, does nothing.
- func (w *SighupWatcher) removeAutoFile(af *AutoFile) {
- w.mtx.Lock()
- delete(w.autoFiles, af.ID)
- w.mtx.Unlock()
- }
-
- func (w *SighupWatcher) closeAll() {
- w.mtx.Lock()
- for _, af := range w.autoFiles {
- af.closeFile()
- }
- w.mtx.Unlock()
- }
|