more efficient read
All checks were successful
Build and Publish / BuildAndDeploy (push) Successful in 1m56s

This commit is contained in:
matst80
2024-11-11 19:40:29 +01:00
parent 74e5dc6b4e
commit e63a92213b
2 changed files with 55 additions and 39 deletions

View File

@@ -34,9 +34,7 @@ func NewCartPacketQueue(connection net.Conn) *CartPacketQueue {
var packet CartPacket var packet CartPacket
for { for {
err := ReadCartPacket(connection, &packet) err := ReadCartPacket(connection, &packet)
ts := time.Now()
if err != nil { if err != nil {
if err == io.EOF { if err == io.EOF {
return return
} }
@@ -49,30 +47,39 @@ func NewCartPacketQueue(connection net.Conn) *CartPacketQueue {
log.Printf("Error receiving packet data: %v\n", err) log.Printf("Error receiving packet data: %v\n", err)
return return
} }
go queue.HandleData(packet.MessageType, packet.Id, data)
queue.mu.Lock()
l := make([]CartPacketWithData, 0, len(queue.Packets))
for _, packet := range queue.Packets {
if !packet.Consumed && packet.Added.After(ts.Add(-time.Second)) {
l = append(l, packet)
}
}
queue.Packets = append(l, CartPacketWithData{
MessageType: packet.MessageType,
Id: packet.Id,
Added: ts,
Data: data,
})
queue.mu.Unlock()
} }
}() }()
return queue return queue
} }
func (p *CartPacketQueue) HandleData(t uint32, id CartId, data []byte) {
ts := time.Now()
cap := 150
l := make([]CartPacketWithData, 0, cap)
p.mu.RLock()
breakAt := ts.Add(-time.Millisecond * 250)
for _, packet := range p.Packets {
if !packet.Consumed && packet.Added.After(breakAt) {
l = append(l, packet)
if len(l) >= cap {
break
}
}
}
p.mu.RUnlock()
p.mu.Lock()
p.Packets = append([]CartPacketWithData{
{
MessageType: t,
Id: id,
Added: ts,
Data: data,
},
}, l...)
p.mu.Unlock()
}
func (p *CartPacketQueue) Expect(messageType uint32, id CartId, timeToWait time.Duration) (*CartPacketWithData, error) { func (p *CartPacketQueue) Expect(messageType uint32, id CartId, timeToWait time.Duration) (*CartPacketWithData, error) {
start := time.Now().Add(-time.Millisecond) start := time.Now().Add(-time.Millisecond)

View File

@@ -33,9 +33,7 @@ func NewPacketQueue(connection net.Conn) *PacketQueue {
var packet Packet var packet Packet
for { for {
err := ReadPacket(connection, &packet) err := ReadPacket(connection, &packet)
ts := time.Now()
if err != nil { if err != nil {
if err == io.EOF { if err == io.EOF {
return return
} }
@@ -46,28 +44,39 @@ func NewPacketQueue(connection net.Conn) *PacketQueue {
if err != nil { if err != nil {
log.Printf("Error receiving packet data: %v\n", err) log.Printf("Error receiving packet data: %v\n", err)
} }
queue.mu.Lock()
l := make([]PacketWithData, 0, len(queue.Packets)) go queue.HandleData(packet.MessageType, data)
for _, packet := range queue.Packets {
if !packet.Consumed && packet.Added.After(ts.Add(-time.Second)) {
l = append(l, packet)
}
}
packetQueue.Set(float64(len(queue.Packets)))
queue.Packets = append(l, PacketWithData{
MessageType: packet.MessageType,
Added: ts,
Data: data,
})
queue.mu.Unlock()
packetsReceived.Inc()
} }
}() }()
return queue return queue
} }
func (p *PacketQueue) HandleData(t uint32, data []byte) {
ts := time.Now()
cap := 150
l := make([]PacketWithData, 0, cap)
p.mu.RLock()
breakAt := ts.Add(-time.Millisecond * 250)
for _, packet := range p.Packets {
if !packet.Consumed && packet.Added.After(breakAt) {
l = append(l, packet)
if len(l) >= cap {
break
}
}
}
p.mu.RUnlock()
p.mu.Lock()
p.Packets = append([]PacketWithData{
{
MessageType: t,
Added: ts,
Data: data,
},
}, l...)
p.mu.Unlock()
}
func (p *PacketQueue) Expect(messageType uint32, timeToWait time.Duration) (*PacketWithData, error) { func (p *PacketQueue) Expect(messageType uint32, timeToWait time.Duration) (*PacketWithData, error) {
start := time.Now().Add(-time.Millisecond) start := time.Now().Add(-time.Millisecond)