From 26710b173410c2f4683a1bad15a4a71a257a06b7 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Wed, 25 Nov 2015 11:06:36 -0800 Subject: [PATCH] Remove listenbuffer package Signed-off-by: Alexander Morozov --- listenbuffer/README.md | 27 ----------- listenbuffer/buffer.go | 76 ------------------------------ listenbuffer/listen_buffer_test.go | 41 ---------------- 3 files changed, 144 deletions(-) delete mode 100644 listenbuffer/README.md delete mode 100644 listenbuffer/buffer.go delete mode 100644 listenbuffer/listen_buffer_test.go diff --git a/listenbuffer/README.md b/listenbuffer/README.md deleted file mode 100644 index 2273509..0000000 --- a/listenbuffer/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# listenbuffer - -listenbuffer uses the kernel's listening backlog functionality to queue -connections, allowing applications to start listening immediately and handle -connections later. This is signaled by closing the activation channel passed to -the constructor. - -The maximum amount of queued connections depends on the configuration of your -kernel (typically called SOMAXXCON) and cannot be configured in Go with the -net package. See `src/net/sock_platform.go` in the Go tree or consult your -kernel's manual. - - activator := make(chan struct{}) - buffer, err := NewListenBuffer("tcp", "localhost:4000", activator) - if err != nil { - panic(err) - } - - // will block until activator has been closed or is sent an event - client, err := buffer.Accept() - -Somewhere else in your application once it's been booted: - - close(activator) - -`buffer.Accept()` will return the first client in the kernel listening queue, or -continue to block until a client connects or an error occurs. diff --git a/listenbuffer/buffer.go b/listenbuffer/buffer.go deleted file mode 100644 index aa47471..0000000 --- a/listenbuffer/buffer.go +++ /dev/null @@ -1,76 +0,0 @@ -/* -Package listenbuffer uses the kernel's listening backlog functionality to queue -connections, allowing applications to start listening immediately and handle -connections later. This is signaled by closing the activation channel passed to -the constructor. - -The maximum amount of queued connections depends on the configuration of your -kernel (typically called SOMAXXCON) and cannot be configured in Go with the -net package. See `src/net/sock_platform.go` in the Go tree or consult your -kernel's manual. - - activator := make(chan struct{}) - buffer, err := NewListenBuffer("tcp", "localhost:4000", activator) - if err != nil { - panic(err) - } - - // will block until activator has been closed or is sent an event - client, err := buffer.Accept() - -Somewhere else in your application once it's been booted: - - close(activator) - -`buffer.Accept()` will return the first client in the kernel listening queue, or -continue to block until a client connects or an error occurs. -*/ -package listenbuffer - -import "net" - -// NewListenBuffer returns a net.Listener listening on addr with the protocol -// passed. The channel passed is used to activate the listenbuffer when the -// caller is ready to accept connections. -func NewListenBuffer(proto, addr string, activate <-chan struct{}) (net.Listener, error) { - wrapped, err := net.Listen(proto, addr) - if err != nil { - return nil, err - } - - return &defaultListener{ - wrapped: wrapped, - activate: activate, - }, nil -} - -// defaultListener is the buffered wrapper around the net.Listener -type defaultListener struct { - wrapped net.Listener // The net.Listener wrapped by listenbuffer - ready bool // Whether the listenbuffer has been activated - activate <-chan struct{} // Channel to control activation of the listenbuffer -} - -// Close closes the wrapped socket. -func (l *defaultListener) Close() error { - return l.wrapped.Close() -} - -// Addr returns the listening address of the wrapped socket. -func (l *defaultListener) Addr() net.Addr { - return l.wrapped.Addr() -} - -// Accept returns a client connection on the wrapped socket if the listen buffer -// has been activated. To active the listenbuffer the activation channel passed -// to NewListenBuffer must have been closed or sent an event. -func (l *defaultListener) Accept() (net.Conn, error) { - // if the listen has been told it is ready then we can go ahead and - // start returning connections - if l.ready { - return l.wrapped.Accept() - } - <-l.activate - l.ready = true - return l.Accept() -} diff --git a/listenbuffer/listen_buffer_test.go b/listenbuffer/listen_buffer_test.go deleted file mode 100644 index 6ffd2f7..0000000 --- a/listenbuffer/listen_buffer_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package listenbuffer - -import ( - "io/ioutil" - "net" - "testing" -) - -func TestListenBufferAllowsAcceptingWhenActivated(t *testing.T) { - lock := make(chan struct{}) - buffer, err := NewListenBuffer("tcp", "", lock) - if err != nil { - t.Fatal("Unable to create listen buffer: ", err) - } - - go func() { - conn, err := net.Dial("tcp", buffer.Addr().String()) - if err != nil { - t.Fatal("Client failed to establish connection to server: ", err) - } - - conn.Write([]byte("ping")) - conn.Close() - }() - - close(lock) - - client, err := buffer.Accept() - if err != nil { - t.Fatal("Failed to accept client: ", err) - } - - response, err := ioutil.ReadAll(client) - if err != nil { - t.Fatal("Failed to read from client: ", err) - } - - if string(response) != "ping" { - t.Fatal("Expected to receive ping from client, received: ", string(response)) - } -}