diff options
author | Matthew Holt <mholt@users.noreply.github.com> | 2019-03-26 19:42:52 -0600 |
---|---|---|
committer | Matthew Holt <mholt@users.noreply.github.com> | 2019-03-26 19:42:52 -0600 |
commit | a8dc73b4d9db5edf85e78314c9759b9d12a79b71 (patch) | |
tree | c1283aa94e2b2d605985130cdef070a24d03815e /listeners.go | |
parent | 86e2d1b0a48fbd84590291969611f1870471c3e0 (diff) |
Performance testing Load function
Diffstat (limited to 'listeners.go')
-rw-r--r-- | listeners.go | 19 |
1 files changed, 19 insertions, 0 deletions
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 +) |