在go中使用lua示例, 基于gopher-lua!
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

199 linhas
4.5 KiB

package luaInGo
// import (
// "context"
// "sync"
// "sync/atomic"
// "time"
//
// log "github.com/iglev/ilog"
// )
//
// type hotfixMgr interface {
// reg(file string)
// check(L *LState) *hotfixList
// }
//
// func newHotfixMgr(ctx context.Context, needCoro bool, hotfixTime int64) hotfixMgr {
// var ht hotfixMgr
// if needCoro {
// htco := &hotfixMgrCoro{
// ctx: ctx,
// ch: make(chan *hotfixList, 16),
// hotfixTime: hotfixTime,
// }
// go htco.loop()
// ht = htco
// } else {
// ht = &hotfixMgrLocal{
// mp: make(map[string]int64),
// lasttime: time.Now().Unix(),
// hotfixTime: hotfixTime,
// }
// }
// return ht
// }
//
// type hotfixList struct {
// files []string
// }
//
// func hotfixDoFile(L *LState, ht hotfixMgr, up *hotfixList) {
// size := len(up.files)
// for i := 0; i < size; i++ {
// err := L.L().DoFile(up.files[i])
// if err != nil {
// log.Error("DoFile fail, file=%v err=%v", up.files[i], err)
// } else {
// log.Info("reload file=%v success", up.files[i])
// }
// }
// }
//
// //////////////////////////////////////////////////////////////////
// // hotfixMgrLocal
//
// type hotfixMgrLocal struct {
// mp map[string]int64
// lasttime int64
// hotfixTime int64
// }
//
// func (ht *hotfixMgrLocal) reg(file string) {
// mt, err := getFileModtime(file)
// if err != nil {
// return
// }
// ht.mp[file] = mt
// }
//
// func (ht *hotfixMgrLocal) check(L *LState) *hotfixList {
// curr := time.Now().Unix()
// lasttime := atomic.LoadInt64(&ht.lasttime)
// if curr < (lasttime + ht.hotfixTime) {
// return nil
// }
// atomic.StoreInt64(&ht.lasttime, curr)
// up := ht.getHotfixList()
// if up != nil {
// hotfixDoFile(L, ht, up)
// }
// return up
// }
//
// func (ht *hotfixMgrLocal) getHotfixList() *hotfixList {
// size := len(ht.mp)
// if size <= 0 {
// return nil
// }
// up := &hotfixList{
// files: make([]string, 0, size),
// }
// tmp := make(map[string]int64)
// for k, v := range ht.mp {
// mt, err := getFileModtime(k)
// if err != nil {
// log.Error("getFileModtime fail, file=%v err=%v", k, err)
// continue
// }
// if v != mt {
// up.files = append(up.files, k)
// tmp[k] = mt
// }
// }
// for k, v := range tmp {
// ht.mp[k] = v
// }
// return up
// }
//
// //////////////////////////////////////////////////////////////////
// // hotfixMgrCoro
//
// type hotfixMgrCoro struct {
// ctx context.Context
// mp sync.Map
// ch chan *hotfixList
// hotfixTime int64
// }
//
// func (ht *hotfixMgrCoro) reg(file string) {
// mt, err := getFileModtime(file)
// if err != nil {
// return
// }
// ht.mp.Store(file, mt)
// }
//
// func (ht *hotfixMgrCoro) check(L *LState) *hotfixList {
// up := ht.getHotfixList()
// if up != nil {
// hotfixDoFile(L, ht, up)
// }
// return up
// }
//
// func (ht *hotfixMgrCoro) getHotfixList() *hotfixList {
// select {
// case up := <-ht.ch:
// return up
// default:
// return nil
// }
// }
//
// func (ht *hotfixMgrCoro) loop() {
// timer := time.NewTimer(time.Duration(ht.hotfixTime) * time.Second)
// defer timer.Stop()
// Loop:
// for {
// select {
// case <-timer.C:
// ht.loopCheck()
// timer.Reset(time.Duration(ht.hotfixTime) * time.Second)
// case <-ht.ctx.Done():
// break Loop
// }
// }
// }
//
// func (ht *hotfixMgrCoro) loopCheck() {
// var up *hotfixList
// mp := make(map[string]int64)
// ht.mp.Range(func(k, v interface{}) bool {
// file, ok := k.(string)
// if !ok {
// return false
// }
// oldmt, mtOK := v.(int64)
// if !mtOK {
// return false
// }
// newmt, err := getFileModtime(file)
// if err != nil {
// log.Error("getFileModtime fail, file=%v err=%v", file, err)
// return false
// }
// if newmt != oldmt {
// mp[file] = newmt
// }
// return true
// })
// size := len(mp)
// if size > 0 {
// up = &hotfixList{
// files: make([]string, 0, size),
// }
// for k, v := range mp {
// ht.mp.Store(k, v)
// up.files = append(up.files, k)
// }
// select {
// case ht.ch <- up:
// return
// default:
// log.Error("hotfix send to channel fail, up=%v", up)
// }
// }
// }
//