fix poll/send race condition and panic on errors instead of ignoring
This commit is contained in:
parent
221cbab51a
commit
f5ebd3b5f1
3 changed files with 37 additions and 8 deletions
|
|
@ -38,6 +38,10 @@ func (app *App) Poll(since int) (num int, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) Last(n int) (err error) {
|
func (app *App) Last(n int) (err error) {
|
||||||
|
if n == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
if _, err := fmt.Fprintf(app.conn, "LAST %d\n", n); err != nil {
|
if _, err := fmt.Fprintf(app.conn, "LAST %d\n", n); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -52,6 +56,10 @@ func (app *App) Last(n int) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if nsrv == 0 {
|
||||||
|
goto count
|
||||||
|
}
|
||||||
|
|
||||||
for range nsrv {
|
for range nsrv {
|
||||||
if !app.scanner.Scan() {
|
if !app.scanner.Scan() {
|
||||||
return app.scanner.Err()
|
return app.scanner.Err()
|
||||||
|
|
@ -59,6 +67,7 @@ func (app *App) Last(n int) (err error) {
|
||||||
app.incoming <- Message(app.scanner.Text())
|
app.incoming <- Message(app.scanner.Text())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
count:
|
||||||
var last int
|
var last int
|
||||||
if !app.scanner.Scan() {
|
if !app.scanner.Scan() {
|
||||||
return app.scanner.Err()
|
return app.scanner.Err()
|
||||||
|
|
|
||||||
24
event.go
24
event.go
|
|
@ -4,25 +4,37 @@ type IncomingEvent interface {
|
||||||
HandleIncoming(*App)
|
HandleIncoming(*App)
|
||||||
}
|
}
|
||||||
type OutgoingEvent interface {
|
type OutgoingEvent interface {
|
||||||
HandleOutgoing(*App)
|
HandleOutgoing(*App) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type Message string
|
type Message string
|
||||||
|
|
||||||
func (m Message) HandleIncoming(app *App) {
|
func (m Message) HandleIncoming(app *App) {
|
||||||
app.AppendMessage(string(m))
|
app.AppendMessage(string(m))
|
||||||
|
|
||||||
}
|
}
|
||||||
func (m Message) HandleOutgoing(app *App) {
|
func (m Message) HandleOutgoing(app *App) error {
|
||||||
num, _ := app.Send(string(m))
|
num, err := app.Send(string(m))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
app.incoming <- SetLast(num)
|
app.incoming <- SetLast(num)
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type Poll int
|
type Poll int
|
||||||
|
|
||||||
func (p Poll) HandleOutgoing(app *App) {
|
func (p Poll) HandleOutgoing(app *App) error {
|
||||||
num, _ := app.Poll(int(p))
|
num, err := app.Poll(int(p))
|
||||||
go app.Last(num)
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = app.Last(num)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type SetLast int
|
type SetLast int
|
||||||
|
|
|
||||||
12
main.go
12
main.go
|
|
@ -59,6 +59,7 @@ type App struct {
|
||||||
|
|
||||||
incoming chan IncomingEvent
|
incoming chan IncomingEvent
|
||||||
outgoing chan OutgoingEvent
|
outgoing chan OutgoingEvent
|
||||||
|
error chan error
|
||||||
|
|
||||||
vx *vaxis.Vaxis
|
vx *vaxis.Vaxis
|
||||||
w struct {
|
w struct {
|
||||||
|
|
@ -82,14 +83,18 @@ func (app *App) Connect(host, port string) (err error) {
|
||||||
app.scanner = bufio.NewScanner(app.conn)
|
app.scanner = bufio.NewScanner(app.conn)
|
||||||
app.incoming = make(chan IncomingEvent)
|
app.incoming = make(chan IncomingEvent)
|
||||||
app.outgoing = make(chan OutgoingEvent)
|
app.outgoing = make(chan OutgoingEvent)
|
||||||
app.ticker = time.NewTicker(2 * time.Second)
|
app.error = make(chan error)
|
||||||
|
app.ticker = time.NewTicker(1 * time.Second)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
app.Last(50)
|
app.Last(50)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case ev := <-app.outgoing:
|
case ev := <-app.outgoing:
|
||||||
ev.HandleOutgoing(app)
|
if err := ev.HandleOutgoing(app); err != nil {
|
||||||
|
app.error <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
case <-app.ctx.Done():
|
case <-app.ctx.Done():
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -179,6 +184,9 @@ func main() {
|
||||||
ev.HandleIncoming(&app)
|
ev.HandleIncoming(&app)
|
||||||
case <-app.ticker.C:
|
case <-app.ticker.C:
|
||||||
app.outgoing <- Poll(app.last)
|
app.outgoing <- Poll(app.last)
|
||||||
|
case err := <-app.error:
|
||||||
|
app.FinishUI()
|
||||||
|
panic(err)
|
||||||
case <-app.ctx.Done():
|
case <-app.ctx.Done():
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue