From a8dc73b4d9db5edf85e78314c9759b9d12a79b71 Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Tue, 26 Mar 2019 19:42:52 -0600 Subject: Performance testing Load function --- listeners.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'listeners.go') diff --git a/listeners.go b/listeners.go index 962cb1d..0a2fe1c 100644 --- a/listeners.go +++ b/listeners.go @@ -3,15 +3,29 @@ package caddy2 import ( "fmt" "net" + "sync" "sync/atomic" ) // Listen returns a listener suitable for use in a Caddy module. func Listen(proto, addr string) (net.Listener, error) { + lnKey := proto + "/" + addr + + listenersMu.Lock() + defer listenersMu.Unlock() + + // if listener already exists, return it + if ln, ok := listeners[lnKey]; ok { + return &fakeCloseListener{Listener: ln}, nil + } + + // or, create new one and save it ln, err := net.Listen(proto, addr) if err != nil { return nil, err } + listeners[lnKey] = ln + return &fakeCloseListener{Listener: ln}, nil } @@ -49,3 +63,8 @@ func (fcl *fakeCloseListener) CloseUnderlying() error { // Close() is called, indicating that it is pretending to // be closed so that the server using it can terminate. var ErrSwappingServers = fmt.Errorf("listener 'closed' 😉") + +var ( + listeners = make(map[string]net.Listener) + listenersMu sync.Mutex +) -- cgit v1.2.3