summaryrefslogtreecommitdiff
path: root/listeners.go
diff options
context:
space:
mode:
authorMatthew Holt <mholt@users.noreply.github.com>2019-03-26 19:42:52 -0600
committerMatthew Holt <mholt@users.noreply.github.com>2019-03-26 19:42:52 -0600
commita8dc73b4d9db5edf85e78314c9759b9d12a79b71 (patch)
treec1283aa94e2b2d605985130cdef070a24d03815e /listeners.go
parent86e2d1b0a48fbd84590291969611f1870471c3e0 (diff)
Performance testing Load function
Diffstat (limited to 'listeners.go')
-rw-r--r--listeners.go19
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
+)