Skip to content

Commit 21c5315

Browse files
committed
dispatch every message in a new goroutine
1 parent fb44ffb commit 21c5315

File tree

1 file changed

+25
-22
lines changed

1 file changed

+25
-22
lines changed

udp.go

+25-22
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type UDPConn struct {
2020
udpConn
2121
closeChan chan struct{}
2222
ctx context.Context
23+
errChan chan error
2324
}
2425

2526
// DialUDP creates a new OSC connection over UDP.
@@ -37,6 +38,7 @@ func DialUDPContext(ctx context.Context, network string, laddr, raddr *net.UDPAd
3738
udpConn: conn,
3839
closeChan: make(chan struct{}),
3940
ctx: ctx,
41+
errChan: make(chan error),
4042
}, nil
4143
}
4244

@@ -55,6 +57,7 @@ func ListenUDPContext(ctx context.Context, network string, laddr *net.UDPAddr) (
5557
udpConn: conn,
5658
closeChan: make(chan struct{}),
5759
ctx: ctx,
60+
errChan: make(chan error),
5861
}, nil
5962
}
6063

@@ -94,9 +97,7 @@ func (conn *UDPConn) Serve(dispatcher Dispatcher) error {
9497

9598
go func() {
9699
for {
97-
if err := conn.serve(dispatcher); err != nil {
98-
errChan <- err
99-
}
100+
conn.serve(dispatcher, errChan)
100101
}
101102
}()
102103

@@ -112,36 +113,38 @@ func (conn *UDPConn) Serve(dispatcher Dispatcher) error {
112113
}
113114

114115
// serve retrieves OSC packets.
115-
func (conn *UDPConn) serve(dispatcher Dispatcher) error {
116+
func (conn *UDPConn) serve(dispatcher Dispatcher, errChan chan error) {
116117
data := make([]byte, readBufSize)
117118

118119
_, sender, err := conn.ReadFromUDP(data)
119120
if err != nil {
120-
return err
121+
errChan <- err
121122
}
122123

123124
switch data[0] {
124125
case BundleTag[0]:
125-
bundle, err := ParseBundle(data, sender)
126-
if err != nil {
127-
return err
128-
}
129-
if err := dispatcher.Dispatch(bundle); err != nil {
130-
return errors.Wrap(err, "dispatch bundle")
131-
}
126+
go func() {
127+
bundle, err := ParseBundle(data, sender)
128+
if err != nil {
129+
errChan <- err
130+
}
131+
if err := dispatcher.Dispatch(bundle); err != nil {
132+
errChan <- errors.Wrap(err, "dispatch bundle")
133+
}
134+
}()
132135
case MessageChar:
133-
msg, err := ParseMessage(data, sender)
134-
if err != nil {
135-
return err
136-
}
137-
if err := dispatcher.Invoke(msg); err != nil {
138-
return errors.Wrap(err, "dispatch message")
139-
}
136+
go func() {
137+
msg, err := ParseMessage(data, sender)
138+
if err != nil {
139+
errChan <- err
140+
}
141+
if err := dispatcher.Invoke(msg); err != nil {
142+
errChan <- errors.Wrap(err, "dispatch message")
143+
}
144+
}()
140145
default:
141-
return ErrParse
146+
errChan <- ErrParse
142147
}
143-
144-
return nil
145148
}
146149

147150
// SetContext sets the context associated with the conn.

0 commit comments

Comments
 (0)