diff options
Diffstat (limited to 'pkg/server/socket/defer.go')
| -rw-r--r-- | pkg/server/socket/defer.go | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/pkg/server/socket/defer.go b/pkg/server/socket/defer.go index bfb2157..7ed303d 100644 --- a/pkg/server/socket/defer.go +++ b/pkg/server/socket/defer.go @@ -9,10 +9,11 @@ type deferSocket struct { S } -type deferChannel struct { - s *deferSocket - c chan Channel - e env.Env +type deferConn struct { + sock *deferSocket + wait chan bool + env env.Env + conn Conn } func newDeferSocket(proto, addr string) (S, error) { @@ -24,42 +25,43 @@ func newDeferSocket(proto, addr string) (S, error) { return &deferSocket{s}, nil } -func (s *deferSocket) Open(env env.Env) (Channel, error) { - c := &deferChannel{ - s: s, - c: make(chan Channel), - e: env, +func (s *deferSocket) Open(env env.Env) (Conn, error) { + c := &deferConn{ + sock: s, + wait: make(chan bool), + env: env, } return c, nil } -func (c *deferChannel) String() string { +func (c *deferConn) String() string { return "defer" } -func (c *deferChannel) Send(wq queue.Q) error { - if x := <-c.c; x == nil { +func (c *deferConn) Send(wq queue.Q) error { + if !<-c.wait { return nil } else { - return x.Send(wq) + return c.conn.Send(wq) } } -func (c *deferChannel) Recv(rq queue.Q) error { +func (c *deferConn) Recv(rq queue.Q) error { b := <-rq if b == nil { - close(c.c) + c.wait <- false return nil } - x, err := c.s.S.Open(c.e) + conn, err := c.sock.S.Open(c.env) if err != nil { - close(c.c) + c.wait <- false return err } - c.c <- x + c.conn = conn + c.wait <- true q := queue.New() @@ -71,10 +73,13 @@ func (c *deferChannel) Recv(rq queue.Q) error { defer q.Dry() - return x.Recv(q) + return c.conn.Recv(q) } -/* TODO */ -func (c *deferChannel) Close() error { - return nil +func (c *deferConn) Close() (err error) { + if c.conn != nil { + err = c.conn.Close() + } + + return } |
