Unverified Commit d82125c9 authored by Steven Allen's avatar Steven Allen Committed by GitHub

Merge pull request #7 from libp2p/feat/fast-close

don't hold the lock when closing
parents 709299bf 3b66fd3b
...@@ -105,9 +105,6 @@ func (s *writer) WriteMsg(msg []byte) (err error) { ...@@ -105,9 +105,6 @@ func (s *writer) WriteMsg(msg []byte) (err error) {
} }
func (s *writer) Close() error { func (s *writer) Close() error {
s.lock.Lock()
defer s.lock.Unlock()
if c, ok := s.W.(io.Closer); ok { if c, ok := s.W.(io.Closer); ok {
return c.Close() return c.Close()
} }
...@@ -216,9 +213,6 @@ func (s *reader) ReleaseMsg(msg []byte) { ...@@ -216,9 +213,6 @@ func (s *reader) ReleaseMsg(msg []byte) {
} }
func (s *reader) Close() error { func (s *reader) Close() error {
s.lock.Lock()
defer s.lock.Unlock()
if c, ok := s.R.(io.Closer); ok { if c, ok := s.R.(io.Closer); ok {
return c.Close() return c.Close()
} }
......
...@@ -3,12 +3,13 @@ package msgio ...@@ -3,12 +3,13 @@ package msgio
import ( import (
"bytes" "bytes"
"fmt" "fmt"
randbuf "github.com/jbenet/go-randbuf"
"io" "io"
"math/rand" "math/rand"
"sync" "sync"
"testing" "testing"
"time" "time"
randbuf "github.com/jbenet/go-randbuf"
) )
func TestReadWrite(t *testing.T) { func TestReadWrite(t *testing.T) {
...@@ -32,6 +33,20 @@ func TestReadWriteMsgSync(t *testing.T) { ...@@ -32,6 +33,20 @@ func TestReadWriteMsgSync(t *testing.T) {
SubtestReadWriteMsgSync(t, writer, reader) SubtestReadWriteMsgSync(t, writer, reader)
} }
func TestReadClose(t *testing.T) {
r, w := io.Pipe()
writer := NewWriter(w)
reader := NewReader(r)
SubtestReadClose(t, writer, reader)
}
func TestWriteClose(t *testing.T) {
r, w := io.Pipe()
writer := NewWriter(w)
reader := NewReader(r)
SubtestWriteClose(t, writer, reader)
}
func SubtestReadWrite(t *testing.T, writer WriteCloser, reader ReadCloser) { func SubtestReadWrite(t *testing.T, writer WriteCloser, reader ReadCloser) {
msgs := [1000][]byte{} msgs := [1000][]byte{}
...@@ -195,3 +210,37 @@ func TestBadSizes(t *testing.T) { ...@@ -195,3 +210,37 @@ func TestBadSizes(t *testing.T) {
} }
_ = msg _ = msg
} }
func SubtestReadClose(t *testing.T, writer WriteCloser, reader ReadCloser) {
defer writer.Close()
buf := [10]byte{}
done := make(chan struct{})
go func() {
defer close(done)
time.Sleep(10 * time.Millisecond)
reader.Close()
}()
n, err := reader.Read(buf[:])
if n != 0 || err == nil {
t.Error("expected to read nothing")
}
<-done
}
func SubtestWriteClose(t *testing.T, writer WriteCloser, reader ReadCloser) {
defer reader.Close()
buf := [10]byte{}
done := make(chan struct{})
go func() {
defer close(done)
time.Sleep(10 * time.Millisecond)
writer.Close()
}()
n, err := writer.Write(buf[:])
if n != 0 || err == nil {
t.Error("expected to read nothing")
}
<-done
}
...@@ -49,9 +49,6 @@ func (s *varintWriter) WriteMsg(msg []byte) error { ...@@ -49,9 +49,6 @@ func (s *varintWriter) WriteMsg(msg []byte) error {
} }
func (s *varintWriter) Close() error { func (s *varintWriter) Close() error {
s.lock.Lock()
defer s.lock.Unlock()
if c, ok := s.W.(io.Closer); ok { if c, ok := s.W.(io.Closer); ok {
return c.Close() return c.Close()
} }
...@@ -162,9 +159,6 @@ func (s *varintReader) ReleaseMsg(msg []byte) { ...@@ -162,9 +159,6 @@ func (s *varintReader) ReleaseMsg(msg []byte) {
} }
func (s *varintReader) Close() error { func (s *varintReader) Close() error {
s.lock.Lock()
defer s.lock.Unlock()
if c, ok := s.R.(io.Closer); ok { if c, ok := s.R.(io.Closer); ok {
return c.Close() return c.Close()
} }
......
...@@ -3,6 +3,7 @@ package msgio ...@@ -3,6 +3,7 @@ package msgio
import ( import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"io"
"testing" "testing"
) )
...@@ -64,3 +65,17 @@ func SubtestVarintWrite(t *testing.T, msg []byte) { ...@@ -64,3 +65,17 @@ func SubtestVarintWrite(t *testing.T, msg []byte) {
t.Fatalf("wrote incorrect number of bytes: %d != %d", len(bb), bblen) t.Fatalf("wrote incorrect number of bytes: %d != %d", len(bb), bblen)
} }
} }
func TestVarintReadClose(t *testing.T) {
r, w := io.Pipe()
writer := NewVarintWriter(w)
reader := NewVarintReader(r)
SubtestReadClose(t, writer, reader)
}
func TestVarintWriteClose(t *testing.T) {
r, w := io.Pipe()
writer := NewVarintWriter(w)
reader := NewVarintReader(r)
SubtestWriteClose(t, writer, reader)
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment