commit - 87c6cf4550e8bf9dac847f1c6437e453aadef7c8
commit + f8c69a179645d6b19ee60c05c3ab4e6725a49ccc
blob - 80b1e9479bb7f916e95e8c9e0734ed4a889ac404
blob + 2c5ec955994e20ddbba22d86b7c3b9c475d23344
--- server.go
+++ server.go
"fmt"
"log"
"net"
+ "sync"
"time"
"golang.org/x/net/context"
session Session
ch Channel
handler Handler
- closed chan struct{}
- err error // terminal error for the conn
+
+ once sync.Once
+ closed chan struct{}
+ err error // terminal error for the conn
}
// activeRequest includes information about the active request.
}
func (c *conn) CloseWithError(err error) error {
- select {
- case <-c.closed:
- return c.err
- default:
- close(c.closed)
+ c.once.Do(func() {
if err == nil {
- c.err = err
- } else {
- c.err = ErrClosed
+ err = ErrClosed
}
- return c.err
- }
+ c.err = err
+ close(c.closed)
+ })
+
+ return c.err
}