Skip to content

Commit 46fc013

Browse files
committed
timeout the client udp listen. wait for server ready message
1 parent 3ad5a80 commit 46fc013

File tree

2 files changed

+50
-11
lines changed

2 files changed

+50
-11
lines changed

client.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,23 @@ func (c *Client) Connect(addr string, timeout time.Duration) error {
163163
}
164164

165165
// listen for OSC messages
166-
go func() {
167-
if err := c.oscConn.Serve(c.oscHandlers()); !c.isClosed() {
168-
c.errChan <- err
166+
go func(errChan chan error) {
167+
var (
168+
start = time.Now()
169+
err error
170+
)
171+
for time.Now().Sub(start) < timeout {
172+
err = c.oscConn.Serve(c.oscHandlers())
173+
if err != nil {
174+
time.Sleep(100 * time.Second)
175+
continue
176+
}
177+
}
178+
if err != nil {
179+
errChan <- err
169180
}
170-
}()
181+
}(c.errChan)
182+
171183
return nil
172184
}
173185

server.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package sc
22

33
import (
4+
"bufio"
45
"errors"
56
"fmt"
7+
"io"
68
"os"
79
"os/exec"
810
"strconv"
@@ -89,26 +91,51 @@ func (s *Server) args() ([]string, error) {
8991
return args, nil
9092
}
9193

94+
const ServerReadyMessage = "server ready"
95+
9296
// Start starts a new instance of scsynth.
93-
func (s *Server) Start() error {
97+
// If the server doesn't print a line containing ServerReadyMessage
98+
// within the timeout then ErrTimeout is returned.
99+
func (s *Server) Start(timeout time.Duration) (io.ReadCloser, io.ReadCloser, error) {
94100
args, err := s.args()
95101
if err != nil {
96-
return err
102+
return nil, nil, err
97103
}
98104

99105
serverPath, err := s.getServerPath()
100106
if err != nil {
101-
return err
107+
return nil, nil, err
102108
}
103109

104110
s.Cmd = exec.Command(serverPath, args...)
111+
stdout, err := s.StdoutPipe()
112+
if err != nil {
113+
return nil, nil, err
114+
}
115+
stderr, err := s.StderrPipe()
116+
if err != nil {
117+
return nil, nil, err
118+
}
105119
if err := s.Cmd.Start(); err != nil {
106-
return err
120+
return nil, nil, err
107121
}
108122

109-
// Wait until the server returns a status.
110-
_, err = NewClient(s.Network, "0.0.0.0:0", fmt.Sprintf("0.0.0.0:%d", s.Port), 5*time.Second)
111-
return err
123+
// Wait until the server prints a ready message.
124+
var (
125+
scanner = bufio.NewScanner(stdout)
126+
start = time.Now()
127+
)
128+
for i := 0; scanner.Scan(); i++ {
129+
if time.Now().Sub(start) > timeout {
130+
return nil, nil, ErrTimeout
131+
}
132+
if strings.Index(scanner.Text(), ServerReadyMessage) == -1 {
133+
continue
134+
} else {
135+
break
136+
}
137+
}
138+
return stdout, stderr, scanner.Err()
112139
}
113140

114141
// Stop stops a running server.

0 commit comments

Comments
 (0)