|
|
|
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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|