client: add finalizer (fix #36)

This commit is contained in:
Aleksandr Razumov
2018-04-29 13:57:38 +03:00
parent fcd7531045
commit bb835f8153
2 changed files with 88 additions and 3 deletions

View File

@@ -4,7 +4,9 @@ import (
"errors"
"fmt"
"io"
"log"
"net"
"runtime"
"sync"
"time"
)
@@ -56,9 +58,25 @@ func NewClient(options ClientOptions) (*Client, error) {
c.wg.Add(2)
go c.readUntilClosed()
go c.collectUntilClosed()
runtime.SetFinalizer(c, clientFinalizer)
return c, nil
}
func clientFinalizer(c *Client) {
if c == nil {
return
}
err := c.Close()
if err == ErrClientClosed {
return
}
if err == nil {
log.Println("client: called finalizer on non-closed client")
return
}
log.Println("client: called finalizer on non-closed client:", err)
}
// Connection wraps Reader, Writer and Closer interfaces.
type Connection interface {
io.Reader
@@ -171,9 +189,18 @@ func (c *Client) Close() error {
}
c.closed = true
c.closedMux.Unlock()
agentErr := c.a.Close()
connErr := c.c.Close()
close(c.close)
var (
agentErr, connErr error
)
if c.a != nil {
agentErr = c.a.Close()
}
if c.c != nil {
connErr = c.c.Close()
}
if c.close != nil {
close(c.close)
}
c.wg.Wait()
if agentErr == nil && connErr == nil {
return nil