aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2021-09-06 18:26:24 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2021-09-06 18:26:24 +0200
commitd87cc0484f99882b26f7cc2de2220459b58339ca (patch)
tree7e492028150e6a5f8d2aa1531754fbbcfb7ca683
parent18a80c7a57639a540965f9b101db18c6490cd804 (diff)
Only load plugins once + memory optimisations
-rw-r--r--client_conn.go4
-rw-r--r--cmd/mt-multiserver-proxy/proxy.go (renamed from cmd/mt-multiserver-proxy/main.go)4
-rw-r--r--listen.go4
-rw-r--r--plugin.go23
4 files changed, 15 insertions, 20 deletions
diff --git a/client_conn.go b/client_conn.go
index 9278578..bffc0e7 100644
--- a/client_conn.go
+++ b/client_conn.go
@@ -566,8 +566,7 @@ func handleClt(cc *ClientConn) {
cc.Log("-->", append([]string{"cmd", cmdName}, args...))
- pluginsMu.RLock()
- for _, p := range plugins {
+ for p := range plugins {
sym, err := p.Lookup("HandleChatCmd")
if err != nil {
cc.Log("-->", err)
@@ -581,7 +580,6 @@ func handleClt(cc *ClientConn) {
}
}
}
- pluginsMu.RUnlock()
if !handled {
cc.SendCmd(&mt.ToCltChatMsg{
diff --git a/cmd/mt-multiserver-proxy/main.go b/cmd/mt-multiserver-proxy/proxy.go
index e1b2b19..71c1f33 100644
--- a/cmd/mt-multiserver-proxy/main.go
+++ b/cmd/mt-multiserver-proxy/proxy.go
@@ -19,9 +19,7 @@ func main() {
}
if !proxy.Conf().NoPlugins {
- if err := proxy.LoadPlugins(); err != nil {
- log.Fatal("{←|⇶} ", err)
- }
+ proxy.LoadPlugins()
}
var err error
diff --git a/listen.go b/listen.go
index d51940a..a31c75d 100644
--- a/listen.go
+++ b/listen.go
@@ -10,7 +10,7 @@ import (
type Listener struct {
mt.Listener
- mu sync.RWMutex
+ mu sync.RWMutex
clts map[*ClientConn]struct{}
}
@@ -18,7 +18,7 @@ type Listener struct {
func Listen(pc net.PacketConn) *Listener {
return &Listener{
Listener: mt.Listen(pc),
- clts: make(map[*ClientConn]struct{}),
+ clts: make(map[*ClientConn]struct{}),
}
}
diff --git a/plugin.go b/plugin.go
index 2f7a803..d388d1d 100644
--- a/plugin.go
+++ b/plugin.go
@@ -8,13 +8,17 @@ import (
"sync"
)
-var plugins []*plugin.Plugin
-var pluginsMu sync.RWMutex
+var plugins map[*plugin.Plugin]struct{}
+var pluginsOnce sync.Once
-func LoadPlugins() error {
+func LoadPlugins() {
+ pluginsOnce.Do(loadPlugins)
+}
+
+func loadPlugins() {
executable, err := os.Executable()
if err != nil {
- return err
+ log.Fatal("{←|⇶} ", err)
}
path := filepath.Dir(executable) + "/plugins"
@@ -22,14 +26,10 @@ func LoadPlugins() error {
dir, err := os.ReadDir(path)
if err != nil {
- return err
+ log.Fatal("{←|⇶} ", err)
}
- pluginsMu.Lock()
- defer pluginsMu.Unlock()
-
- plugins = []*plugin.Plugin{}
-
+ plugins = make(map[*plugin.Plugin]struct{})
for _, file := range dir {
p, err := plugin.Open(path + "/" + file.Name())
if err != nil {
@@ -37,9 +37,8 @@ func LoadPlugins() error {
continue
}
- plugins = append(plugins, p)
+ plugins[p] = struct{}{}
}
log.Print("{←|⇶} load plugins")
- return nil
}