2014-04-26 09:18:56 +00:00
package Shutdown
2014-10-19 17:19:11 +00:00
import (
2014-11-07 12:00:55 +00:00
"container/list"
"fmt"
2014-10-19 17:19:11 +00:00
"github.com/SommerEngineering/Ocean/Log"
LM "github.com/SommerEngineering/Ocean/Log/Meta"
"os"
)
2014-04-26 09:18:56 +00:00
2015-06-17 15:44:52 +00:00
// A type for shutdown handlers.
2014-04-26 09:18:56 +00:00
type ShutdownHandler interface {
Shutdown ( )
}
2015-06-17 15:44:52 +00:00
// Function to add new shutdown handlers.
2014-04-26 09:18:56 +00:00
func AddShutdownHandler ( handler ShutdownHandler ) {
2014-06-04 19:41:18 +00:00
shutdownHandlers . PushFront ( handler )
2014-04-26 09:18:56 +00:00
}
2015-06-17 15:44:52 +00:00
// The thread which waits for the shutdown event.
2014-04-26 09:18:56 +00:00
func executeShutdown ( ) {
2015-06-17 15:44:52 +00:00
// Wait for the shutdown event:
2014-04-26 09:18:56 +00:00
sig := <- shutdownSignal
stopAllRequests = true
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelWARN , LM . SeverityCritical , LM . ImpactCritical , LM . MessageNameSHUTDOWN , ` The system was called to shutting down. ` , sig . String ( ) , ` Call now all shutdown handlers. ` )
2015-06-17 15:44:52 +00:00
// Execute all shutdown handlers:
2014-04-26 09:18:56 +00:00
for handler := shutdownHandlers . Front ( ) ; handler != nil ; handler = handler . Next ( ) {
2014-11-07 12:00:55 +00:00
safeCall ( handler )
2014-04-26 09:18:56 +00:00
}
2015-06-17 15:44:52 +00:00
// Shutdown the logging system:
2014-04-26 09:18:56 +00:00
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelWARN , LM . SeverityCritical , LM . ImpactCritical , LM . MessageNameSHUTDOWN , ` The system is shutting down now. ` )
Log . Flush ( )
2015-06-17 15:44:52 +00:00
// Stop the whole server:
2014-11-07 12:00:55 +00:00
os . Exit ( 0 )
}
2015-06-17 15:44:52 +00:00
// This function is a wrapper to call safely a shutdown handler.
2014-11-07 12:00:55 +00:00
func safeCall ( handler * list . Element ) {
defer func ( ) {
if err := recover ( ) ; err != nil {
errObj := fmt . Errorf ( "%v" , err )
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelINFO , LM . SeverityNone , LM . ImpactNone , LM . MessageNameSHUTDOWN , ` An error occurs for a shutdown handler. ` , errObj . Error ( ) )
}
} ( )
2014-04-26 09:18:56 +00:00
2014-11-07 12:00:55 +00:00
h := handler . Value . ( ShutdownHandler )
h . Shutdown ( )
2014-04-26 09:18:56 +00:00
}