44 lines
773 B
Go
44 lines
773 B
Go
|
package server
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
"os/signal"
|
||
|
"sync/atomic"
|
||
|
)
|
||
|
|
||
|
var exitWaiterCount int32
|
||
|
var exitCalled chan int
|
||
|
var exitWaiterChan chan int
|
||
|
|
||
|
func init() {
|
||
|
exitWaiterCount = 0
|
||
|
exitWaiterChan = make(chan int)
|
||
|
go setupCleanExitOnSignals()
|
||
|
}
|
||
|
|
||
|
func setupCleanExitOnSignals() {
|
||
|
//wait to properly close the socket when we're exiting
|
||
|
exitCode := 0
|
||
|
sig := make(chan os.Signal, 1)
|
||
|
signal.Notify(sig, os.Interrupt)
|
||
|
defer signal.Stop(sig)
|
||
|
|
||
|
select {
|
||
|
case <-sig:
|
||
|
case exitCode = <-exitCalled:
|
||
|
}
|
||
|
|
||
|
for c := atomic.AddInt32(&exitWaiterCount, -1); c >= 0; c = atomic.AddInt32(&exitWaiterCount, -1) {
|
||
|
exitWaiterChan <- exitCode
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func Exit(exitCode int) {
|
||
|
exitCalled <- exitCode
|
||
|
}
|
||
|
|
||
|
func WaitOnExit() int {
|
||
|
atomic.AddInt32(&exitWaiterCount, 1)
|
||
|
return <-exitWaiterChan
|
||
|
}
|