summaryrefslogtreecommitdiff
path: root/pkg/server/socket/defer.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/socket/defer.go')
-rw-r--r--pkg/server/socket/defer.go49
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
}