Skip to content

Commit 224c13d

Browse files
authored
Merge branch 'develop' into testing-view/docs
2 parents 828d9b3 + b3f96b1 commit 224c13d

11 files changed

Lines changed: 698 additions & 81 deletions

File tree

.github/dependabot.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "npm"
4+
directory: "/"
5+
schedule:
6+
interval: "daily"
7+
target-branch: "develop"
8+
- package-ecosystem: "npm"
9+
directory: "/"
10+
schedule:
11+
interval: "daily"
12+
target-branch: "main"

backend/pkg/transport/constructor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
func NewTransport(baseLogger zerolog.Logger) *Transport {
1414
transport := &Transport{
15-
connectionsMx: &sync.Mutex{},
15+
connectionsMx: &sync.RWMutex{},
1616
connections: make(map[abstraction.TransportTarget]net.Conn),
1717
idToTarget: make(map[abstraction.PacketId]abstraction.TransportTarget),
1818
ipToTarget: make(map[string]abstraction.TransportTarget),

backend/pkg/transport/packet/data/decoder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func (decoder *Decoder) Decode(id abstraction.PacketId, reader io.Reader) (abstr
3535
return nil, ErrUnexpectedId{Id: id}
3636
}
3737

38-
packet := NewPacket(id)
38+
packet := GetPacket(id)
3939
for _, value := range descriptor {
4040
val, err := value.Decode(decoder.endianness, reader)
4141
if err != nil {

backend/pkg/transport/packet/data/packet.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package data
22

33
import (
4+
"sync"
45
"time"
56

67
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
@@ -27,6 +28,16 @@ func NewPacket(id abstraction.PacketId) *Packet {
2728
}
2829
}
2930

31+
var packetPool = sync.Pool{
32+
New: func() any {
33+
return &Packet{
34+
values: make(map[ValueName]Value),
35+
enabled: make(map[ValueName]bool),
36+
}
37+
},
38+
}
39+
40+
3041
// NewPacketWithValues creates a new data packet with the given values
3142
func NewPacketWithValues(id abstraction.PacketId, values map[ValueName]Value, enabled map[ValueName]bool) *Packet {
3243
return &Packet{
@@ -62,3 +73,35 @@ func (packet *Packet) SetTimestamp(timestamp time.Time) *Packet {
6273
packet.timestamp = timestamp
6374
return packet
6475
}
76+
77+
func (packet *Packet) Reset() {
78+
clear(packet.values)
79+
clear(packet.enabled)
80+
packet.id = 0
81+
packet.timestamp = time.Time{}
82+
}
83+
84+
func GetPacket(id abstraction.PacketId) *Packet {
85+
p := packetPool.Get().(*Packet)
86+
if p.values == nil {
87+
p.values = make(map[ValueName]Value)
88+
} else {
89+
clear(p.values)
90+
}
91+
if p.enabled == nil {
92+
p.enabled = make(map[ValueName]bool)
93+
} else {
94+
clear(p.enabled)
95+
}
96+
p.id = id
97+
p.timestamp = time.Now()
98+
return p
99+
}
100+
101+
func ReleasePacket(p *Packet) {
102+
if p == nil {
103+
return
104+
}
105+
p.Reset()
106+
packetPool.Put(p)
107+
}

backend/pkg/transport/presentation/encoder.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"encoding/binary"
66
"io"
7+
"sync"
78

89
"github.com/HyperloopUPV-H8/h9-backend/pkg/abstraction"
910
"github.com/rs/zerolog"
@@ -17,7 +18,8 @@ type Encoder struct {
1718
idToEncoder map[abstraction.PacketId]PacketEncoder
1819
endianness binary.ByteOrder
1920

20-
logger zerolog.Logger
21+
logger zerolog.Logger
22+
bufPool sync.Pool
2123
}
2224

2325
// TODO: improve constructor
@@ -28,6 +30,9 @@ func NewEncoder(endianness binary.ByteOrder, baseLogger zerolog.Logger) *Encoder
2830
endianness: endianness,
2931

3032
logger: baseLogger,
33+
bufPool: sync.Pool{
34+
New: func() any { return new(bytes.Buffer) },
35+
},
3136
}
3237
}
3338

@@ -37,23 +42,41 @@ func (encoder *Encoder) SetPacketEncoder(id abstraction.PacketId, enc PacketEnco
3742
encoder.logger.Trace().Uint16("id", uint16(id)).Type("encoder", enc).Msg("set encoder")
3843
}
3944

40-
// Encode encodes the provided packet into a byte slice, returning any errors
41-
func (encoder *Encoder) Encode(packet abstraction.Packet) ([]byte, error) {
45+
// Encode encodes the provided packet into a pooled buffer. Callers must release
46+
// the buffer via ReleaseBuffer once they are done using the returned data.
47+
func (encoder *Encoder) Encode(packet abstraction.Packet) (*bytes.Buffer, error) {
4248
enc, ok := encoder.idToEncoder[packet.Id()]
4349
if !ok {
4450
encoder.logger.Warn().Uint16("id", uint16(packet.Id())).Msg("no encoder set")
4551
return nil, ErrUnexpectedId{Id: packet.Id()}
4652
}
4753

48-
buffer := new(bytes.Buffer)
54+
bufferAny := encoder.bufPool.Get()
55+
buffer := bufferAny.(*bytes.Buffer)
56+
buffer.Reset()
4957

5058
err := binary.Write(buffer, encoder.endianness, packet.Id())
5159
if err != nil {
5260
encoder.logger.Error().Stack().Err(err).Uint16("id", uint16(packet.Id())).Msg("buffering id")
53-
return buffer.Bytes(), err
61+
encoder.ReleaseBuffer(buffer)
62+
return nil, err
5463
}
5564

5665
encoder.logger.Debug().Uint16("id", uint16(packet.Id())).Type("encoder", enc).Msg("encoding")
5766
err = enc.Encode(packet, buffer)
58-
return buffer.Bytes(), err
67+
if err != nil {
68+
encoder.ReleaseBuffer(buffer)
69+
return nil, err
70+
}
71+
72+
return buffer, nil
73+
}
74+
75+
// ReleaseBuffer returns a buffer obtained from Encode back to the pool.
76+
func (encoder *Encoder) ReleaseBuffer(buffer *bytes.Buffer) {
77+
if buffer == nil {
78+
return
79+
}
80+
buffer.Reset()
81+
encoder.bufPool.Put(buffer)
5982
}

backend/pkg/transport/presentation/encoder_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,12 +379,13 @@ func TestEncoder(t *testing.T) {
379379

380380
output := make([]byte, 0, len(test.output))
381381
for i := 0; i < len(test.input); i++ {
382-
encoded, err := encoder.Encode(test.input[i])
382+
buf, err := encoder.Encode(test.input[i])
383383
if err != nil {
384384
t.Fatalf("\nError encoding (%d) packet: %s\n", i+1, err)
385385
}
386386

387-
output = append(output, encoded...)
387+
output = append(output, buf.Bytes()...)
388+
encoder.ReleaseBuffer(buf)
388389

389390
}
390391

0 commit comments

Comments
 (0)