package main import ( "fmt" "log" "os" "time" "daydev.org/shipsgs/internal/config" "daydev.org/shipsgs/internal/gameServer" "daydev.org/shipsgs/internal/server" "daydev.org/shipsgs/internal/utils" "github.com/xlab/closer" ) var Logger *utils.Logger var ch_sighup *chan bool //channel to shutdown oneSecUpdater var ch_oneSecUpdaterShutdown chan bool //GameServer Public Global Instance var GS *gameServer.GameServer func main() { logFile, err := os.OpenFile("runlog.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { fmt.Println(err) } else { log.SetOutput(logFile) } defer logFile.Close() closer.Bind(cleanup) //Can be optimised to NEW instead of MAKE sighup := make(chan bool) ch_sighup = &sighup ch_oneSecUpdaterShutdown = make(chan bool) //If debug - fill Stdout too - LOG to use? //Logger = utils.New(os.Stdout, utils.LevelInfo) config.ReadConfig() GS = new(gameServer.GameServer) GS.Init(Logger, &config.Config) go GS.Update() //Starting oneSecUpdater after GameServer is ready, because oneSecUpdater // is depending on GameServer.Shutdown channel which // is IF uninitialized we will get "invalid memory address or nil pointer dereference" go oneSecUpdater() log.Println("Starting Healthy") //closer.Hold() server.SetupAndRun(":8080", ch_sighup, GS) GS.WG.Wait() } func cleanup() { fmt.Println("Shutting down ") //Shutting down oneSecUpdater ch_oneSecUpdaterShutdown <- true //Investigate why no messages on correct closing GS.Shutdown <- true // Main function has to be closed the last *ch_sighup <- true Logger.PrintInfo("main", map[string]string{ "Info": "Closing Application Normally", }) } func oneSecUpdater() { //The intention here is to awake after 1 second and send an update to GameServer to update everything for { select { case <-ch_oneSecUpdaterShutdown: fmt.Println("Shutdown One Sec Updater") GS.WG.Done() // Goroutine will wait untill the DEFAULT: will happen before shutdown will take // any effect case <-time.After(time.Second * 1): fmt.Println("1 Sec Timer") default: //*** maybe try this 10 secs in a CASE segment ? // This blocks whole goroutine <-time.After(time.Second * 2) GS.OneSecond <- true } } }