fix: multiple bugfixes
- Fix data race: use atomic.Bool for running in server.go - Fix busy loop in timer.go: use time.After when idle - Fix division by zero in print_replay - Fix silently swallowed errors in proto_generator - Fix suppressed error in native_encoder - Delete unused registry_data_hunter
This commit is contained in:
+10
-9
@@ -23,7 +23,7 @@ type Timer struct {
|
||||
Interval []IntervalTask
|
||||
}
|
||||
|
||||
func (t *Timer) Trigger(ch chan any) {
|
||||
func (t *Timer) Trigger(ch chan any) (didWork bool) {
|
||||
triggerAt := time.Time{}
|
||||
found := false
|
||||
iOnce, iInterval := -1, -1
|
||||
@@ -46,7 +46,7 @@ func (t *Timer) Trigger(ch chan any) {
|
||||
}
|
||||
|
||||
if !found {
|
||||
return
|
||||
return false
|
||||
}
|
||||
now := time.Now()
|
||||
sleepFor := triggerAt.Sub(now)
|
||||
@@ -55,12 +55,12 @@ func (t *Timer) Trigger(ch chan any) {
|
||||
if iOnce >= 0 {
|
||||
ch <- CallFunc{F: reflect.ValueOf(t.Once[iOnce].F), Args: []reflect.Value{}}
|
||||
t.Once = slices.Delete(t.Once, iOnce, iOnce+1)
|
||||
return
|
||||
return true
|
||||
}
|
||||
if iInterval >= 0 {
|
||||
t.Interval[iInterval].LastTrigger = triggerAt
|
||||
ch <- CallFunc{F: reflect.ValueOf(t.Interval[iInterval].F), Args: []reflect.Value{}}
|
||||
return
|
||||
return true
|
||||
}
|
||||
panic("unreachable")
|
||||
}
|
||||
@@ -83,11 +83,12 @@ func (t *Timer) MakeEventSource(ctx context.Context) (chSending <-chan any) {
|
||||
ch := make(chan any)
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
default:
|
||||
t.Trigger(ch)
|
||||
if !t.Trigger(ch) {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-time.After(100 * time.Millisecond):
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go/ast"
|
||||
"os"
|
||||
"strconv"
|
||||
@@ -38,8 +39,14 @@ func GeneratePacketInfoFile(versions []string, packetInfos []PacketInfo) (err er
|
||||
typeExpr = Selector(vUnderscore, typeName)
|
||||
}
|
||||
|
||||
packetId, _ := strconv.ParseInt(p.PacketId, 0, 32)
|
||||
protocolVersion, _ := strconv.Atoi(p.ProtocolVersion)
|
||||
packetId, err := strconv.ParseInt(p.PacketId, 0, 32)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("failed to parse packet ID %q: %w", p.PacketId, err))
|
||||
}
|
||||
protocolVersion, err := strconv.Atoi(p.ProtocolVersion)
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("failed to parse protocol version %q: %w", p.ProtocolVersion, err))
|
||||
}
|
||||
|
||||
packetInfoExprs = append(packetInfoExprs, CompLit(nil, []ast.Expr{
|
||||
KeyValueExpr(Ident("Type"), AddrOf(CompLit(typeExpr, nil))),
|
||||
|
||||
@@ -87,6 +87,7 @@ func ArrayEncoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (s
|
||||
}
|
||||
s2, err := g.VisitEncoder(Index(varToSet, Ident(iName)), data.Type, name+"Inner")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
s2 = Stmts(ForRange(Ident(iName), Call(Ident("len"), varToSet), NewBlock(s2)))
|
||||
s = append(s1, s2...)
|
||||
|
||||
+5
-3
@@ -3,6 +3,7 @@ package server
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
"sync/atomic"
|
||||
|
||||
"github.com/admin-else/strom/mc/proto"
|
||||
"github.com/admin-else/strom/mc/proto_base"
|
||||
@@ -68,8 +69,9 @@ func StartServerWithOnConn(listenAddr string, onConn func(c *proto.Conn) (err er
|
||||
return
|
||||
}
|
||||
defer l.Close()
|
||||
running := true
|
||||
for running {
|
||||
running := atomic.Bool{}
|
||||
running.Store(true)
|
||||
for running.Load() {
|
||||
var cNet net.Conn
|
||||
cNet, err = l.Accept()
|
||||
if err != nil {
|
||||
@@ -80,7 +82,7 @@ func StartServerWithOnConn(listenAddr string, onConn func(c *proto.Conn) (err er
|
||||
defer c.Close()
|
||||
connErr := onConn(c)
|
||||
if errors.Is(connErr, ShutDownServerErr) {
|
||||
running = false
|
||||
running.Store(false)
|
||||
}
|
||||
c.Log.Error("closing connection", "err", connErr)
|
||||
if connErr != nil {
|
||||
|
||||
Reference in New Issue
Block a user