diff --git a/cmd/cgat/main.go b/cmd/cgat/main.go index a738018e66e9cbdf86c07723144decb5dc01b9b8..2a6b2a143353738cde53bd6e37519938cba7ab6d 100644 --- a/cmd/cgat/main.go +++ b/cmd/cgat/main.go @@ -36,10 +36,7 @@ type server struct { func (T server) Do(_ rob.Constraints, w any) { job := w.(work) - err := job.psc.Sync(job.rw, T.pss) - if err != nil { - return - } + job.psc.SetServer(T.pss) T.eqps.SetClient(job.eqpc) bouncers.Bounce(job.rw, T.rw) } diff --git a/lib/middleware/middlewares/ps/client.go b/lib/middleware/middlewares/ps/client.go index 18f68035863dd5ca5aa20e4e8e733f546ba62988..091e2aff2b7566a9143ef7910525ed91432b088f 100644 --- a/lib/middleware/middlewares/ps/client.go +++ b/lib/middleware/middlewares/ps/client.go @@ -12,6 +12,9 @@ type Client struct { parameters map[string]string buf zap.Buf + peer *Server + dirty bool + middleware.Nil } @@ -25,14 +28,19 @@ func (T *Client) Done() { T.buf.Done() } -func (T *Client) updateParameter(w zap.Writer, name, value string) error { +func (T *Client) SetServer(peer *Server) { + T.dirty = true + T.peer = peer +} + +func (T *Client) updateParameter(ctx middleware.Context, name, value string) error { if T.parameters[name] == value { return nil } out := T.buf.Write() packets.WriteParameterStatus(out, name, value) - err := w.Send(out) + err := ctx.Send(out) if err != nil { return err } @@ -42,18 +50,22 @@ func (T *Client) updateParameter(w zap.Writer, name, value string) error { return nil } -func (T *Client) Sync(w zap.Writer, server *Server) error { - // TODO(garet) i don't like this +func (T *Client) sync(ctx middleware.Context) error { + if T.peer == nil || !T.dirty { + return nil + } + T.dirty = false + for name := range T.parameters { - expected := server.parameters[name] - err := T.updateParameter(w, name, expected) + expected := T.peer.parameters[name] + err := T.updateParameter(ctx, name, expected) if err != nil { return err } } - for name, expected := range server.parameters { - err := T.updateParameter(w, name, expected) + for name, expected := range T.peer.parameters { + err := T.updateParameter(ctx, name, expected) if err != nil { return err } @@ -77,7 +89,7 @@ func (T *Client) Send(ctx middleware.Context, out zap.Out) error { } T.parameters[key] = value } - return nil + return T.sync(ctx) } var _ middleware.Middleware = (*Client)(nil)