From 9ff091038ae4b858c12220a36a1e9297d604e15b Mon Sep 17 00:00:00 2001 From: Tai Groot Date: Thu, 8 Apr 2021 17:58:26 -0700 Subject: [PATCH] Remove mutexes, allow the GC to take care of things --- logger.go | 43 ++++++++++++++++++++++++++++++++++--------- logger_test.go | 7 ++++++- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/logger.go b/logger.go index b45edf0..5f75803 100644 --- a/logger.go +++ b/logger.go @@ -4,6 +4,7 @@ import ( "fmt" "runtime" "strings" + "sync" "github.com/sirupsen/logrus" ) @@ -21,7 +22,8 @@ const ( ) var logger = logrus.New() -var clients []Client +var clients []*Client +var sliceTex sync.Mutex func init() { stderrClient := CreateClient() @@ -30,22 +32,40 @@ func init() { } func (c *Client) logStdErr() { - select { - case entry := <-c.writer: - if c.LogLevel >= entry.level { - fmt.Println(entry.Output) + for { + select { + case entry, more := <-c.writer: + if c.LogLevel >= entry.level { + fmt.Println(entry.Output) + } + if !more { + return + } } } } func CreateClient() *Client { var client Client - client.writer = make(LogWriter, 10) - clients = append(clients, client) + client.writer = make(LogWriter, 100) + sliceTex.Lock() + clients = append(clients, &client) + sliceTex.Unlock() return &client } func (c *Client) Destroy() error { + var otherClients []*Client + sliceTex.Lock() + c.writer = nil + c = nil + for _, x := range clients { + if x != nil { + otherClients = append(otherClients, x) + } + } + clients = otherClients + sliceTex.Unlock() return nil } @@ -54,11 +74,16 @@ func (c *Client) GetLogLevel() Level { } func createLog(e Entry) { + sliceTex.Lock() for _, c := range clients { - go func(c Client, e Entry) { - c.writer <- e + go func(c *Client, e Entry) { + select { + case c.writer <- e: + default: + } }(c, e) } + sliceTex.Unlock() } // SetLogLevel set log level of logger diff --git a/logger_test.go b/logger_test.go index a3d4b08..f0b1a8b 100644 --- a/logger_test.go +++ b/logger_test.go @@ -4,10 +4,15 @@ import ( "testing" ) +func TestCreateDestroy(t *testing.T) { + c := CreateClient() + c.Destroy() +} + // SetLogLevel set log level of logger func TestSetLogLevel(t *testing.T) { logLevels := [...]Level{LTrace, LDebug, LInfo, LWarn, LError, LPanic, LFatal} - var c Client + c := CreateClient() for _, x := range logLevels { c.SetLogLevel(x) if c.GetLogLevel() != x {