goserver_sync/core/ctx.go

95 lines
1.5 KiB
Go

package core
import (
"fmt"
"os"
"path/filepath"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/utils"
)
const (
HOOK_BEFORE_START int = iota
HOOK_AFTER_STOP
HOOK_MAX
)
var (
AppCtx *Ctx = newCtx()
hooks [HOOK_MAX][]hookfunc
)
type hookfunc func() error
type Ctx struct {
*basic.Object
CoreObj *basic.Object
}
func newCtx() *Ctx {
ctx := &Ctx{}
ctx.init()
return ctx
}
func (ctx *Ctx) init() {
ctx.Object = basic.NewObject(ObjId_RootId,
"root",
basic.Options{
MaxDone: 1024,
QueueBacklog: 1024,
},
nil)
ctx.Object.Waitor = utils.NewWaitor("core.Ctx")
ctx.UserData = ctx
ctx.Active()
}
func LaunchChild(o *basic.Object) {
AppCtx.LaunchChild(o)
}
func Terminate(o *basic.Object) {
AppCtx.Terminate(o)
}
func CoreObject() *basic.Object {
//return AppCtx.GetChildById(ObjId_CoreId)
return AppCtx.CoreObj
}
func RegisteHook(hookpos int, f hookfunc) {
if hookpos < 0 || hookpos > HOOK_MAX {
return
}
hooks[hookpos] = append(hooks[hookpos], f)
}
func ExecuteHook(hookpos int) error {
if hookpos < 0 || hookpos > HOOK_MAX {
return nil
}
var err error
for _, h := range hooks[hookpos] {
err = h()
if err != nil {
return err
}
}
return nil
}
func WritePid() {
if len(os.Args) > 0 {
baseName := filepath.Base(os.Args[0])
f, err := os.OpenFile(baseName+".pid", os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm)
if err != nil {
panic(fmt.Sprintf("%s had running", os.Args[0]))
return
}
f.WriteString(fmt.Sprintf("%v", os.Getpid()))
}
}