Explorar el Código

SVI Упрощение буферизованного лога; 100.0%

SVI hace 1 año
padre
commit
c2ff7085c4
Se han modificado 1 ficheros con 56 adiciones y 141 borrados
  1. 56 141
      kc/log_buf/log_buf.go

+ 56 - 141
kc/log_buf/log_buf.go

@@ -3,6 +3,7 @@ package log_buf
 
 import (
 	"fmt"
+	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/kc/log_buf/log_msg"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
@@ -10,148 +11,24 @@ import (
 
 // logBuf -- потокобезопасный буфер лога
 type logBuf struct {
-	chGetIn  chan int
-	chGetOut chan ILogMsg
-
-	chDebugIn  chan tMsg
-	chDebugOut chan int
-
-	chInfoIn  chan tMsg
-	chInfoOut chan int
-
-	chWarnIn  chan tMsg
-	chWarnOut chan int
-
-	chErrorIn chan tMsg
-
-	lst []ILogMsg
-
-	chGetErrIn  chan int
-	chGetErrOut chan ILogMsg
-	lstErr      []ILogMsg
-
-	chSizeIn  chan int
-	chSizeOut chan int
+	sync.RWMutex
+	lst    []ILogMsg
+	lstErr []ILogMsg
 }
 
 // NewLogBuf -- возвращает новый потокобезопасный буфер лога
 func NewLogBuf() ILogBuf {
 	sf := &logBuf{
-		chGetIn:  make(chan int, 2),
-		chGetOut: make(chan ILogMsg, 2),
-
-		chDebugIn:  make(chan tMsg, 2),
-		chDebugOut: make(chan int, 2),
-
-		chInfoIn:  make(chan tMsg, 2),
-		chInfoOut: make(chan int, 2),
-
-		chWarnIn:  make(chan tMsg, 2),
-		chWarnOut: make(chan int, 2),
-
-		chErrorIn: make(chan tMsg, 2),
-
-		lst: []ILogMsg{},
-
-		chGetErrIn:  make(chan int, 2),
-		chGetErrOut: make(chan ILogMsg, 2),
-		lstErr:      []ILogMsg{},
-
-		chSizeIn:  make(chan int, 2),
-		chSizeOut: make(chan int, 2),
+		lst:    []ILogMsg{},
+		lstErr: []ILogMsg{},
 	}
-	go sf.run()
 	return sf
 }
 
 // GetErr -- возвращает сообщение ошибки по номеру
 func (sf *logBuf) GetErr(num int) ILogMsg {
-	sf.chGetErrIn <- num
-	return <-sf.chGetErrOut
-}
-
-// Get -- возвращает сообщение по номеру
-func (sf *logBuf) Get(num int) ILogMsg {
-	sf.chGetIn <- num
-	return <-sf.chGetOut
-}
-
-type tMsg struct {
-	text string
-	args []any
-}
-
-// Debug -- сообщение отладки
-func (sf *logBuf) Debug(fMsg string, args ...any) {
-	msg := tMsg{
-		text: fMsg,
-		args: args,
-	}
-	sf.chDebugIn <- msg
-	<-sf.chDebugOut
-}
-
-// Info -- информационные сообщения
-func (sf *logBuf) Info(fMsg string, args ...any) {
-	msg := tMsg{
-		text: fMsg,
-		args: args,
-	}
-	sf.chInfoIn <- msg
-	<-sf.chInfoOut
-}
-
-// Warn -- предупреждающие сообщения
-func (sf *logBuf) Warn(fMsg string, args ...any) {
-	msg := tMsg{
-		text: fMsg,
-		args: args,
-	}
-	sf.chWarnIn <- msg
-	<-sf.chWarnOut
-}
-
-// Err -- сообщения об ошибках
-func (sf *logBuf) Err(fMsg string, args ...any) {
-	msg := tMsg{
-		text: fMsg,
-		args: args,
-	}
-	sf.chErrorIn <- msg
-}
-
-// Size -- возвращает размер буфера
-func (sf *logBuf) Size() int {
-	sf.chSizeIn <- 1
-	return <-sf.chSizeOut
-}
-
-func (sf *logBuf) run() {
-	for {
-		select {
-		case num := <-sf.chGetErrIn:
-			sf.chGetErrOut <- sf.getErr(num)
-		case num := <-sf.chGetIn:
-			sf.chGetOut <- sf.get(num)
-		case msg := <-sf.chDebugIn:
-			sf.debug(msg)
-			sf.chDebugOut <- 1
-		case msg := <-sf.chInfoIn:
-			sf.info(msg)
-			sf.chInfoOut <- 1
-		case msg := <-sf.chWarnIn:
-			sf.warn(msg)
-			sf.chWarnOut <- 1
-		case msg := <-sf.chErrorIn:
-			sf.err(msg)
-		case <-sf.chSizeIn:
-			sf.chSizeOut <- len(sf.lst)
-		}
-	}
-}
-
-// Возвращает сообщение ошибки по номеру
-func (sf *logBuf) getErr(num int) ILogMsg {
+	sf.RLock()
+	defer sf.RUnlock()
 	if len(sf.lstErr) == 0 {
 		return log_msg.NewLogMsg(log_msg.DEBUG, "not error msg")
 	}
@@ -164,8 +41,10 @@ func (sf *logBuf) getErr(num int) ILogMsg {
 	return sf.lstErr[num]
 }
 
-// возвращает сообщение по номеру
-func (sf *logBuf) get(num int) ILogMsg {
+// Get -- возвращает сообщение по номеру
+func (sf *logBuf) Get(num int) ILogMsg {
+	sf.RLock()
+	defer sf.RUnlock()
 	if len(sf.lst) == 0 {
 		return log_msg.NewLogMsg(log_msg.DEBUG, "*no msg*")
 	}
@@ -178,32 +57,61 @@ func (sf *logBuf) get(num int) ILogMsg {
 	return sf.lst[num]
 }
 
-// сообщение отладки
-func (sf *logBuf) debug(msg tMsg) {
+type tMsg struct {
+	text string
+	args []any
+}
+
+// Debug -- сообщение отладки
+func (sf *logBuf) Debug(fMsg string, args ...any) {
+	sf.Lock()
+	defer sf.Unlock()
+	msg := tMsg{
+		text: fMsg,
+		args: args,
+	}
 	strMsg := fmt.Sprintf(msg.text, msg.args...)
 	_msg := log_msg.NewLogMsg(log_msg.DEBUG, strMsg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 }
 
-// информационные сообщения
-func (sf *logBuf) info(msg tMsg) {
+// Info -- информационные сообщения
+func (sf *logBuf) Info(fMsg string, args ...any) {
+	sf.Lock()
+	defer sf.Unlock()
+	msg := tMsg{
+		text: fMsg,
+		args: args,
+	}
 	strMsg := fmt.Sprintf(msg.text, msg.args...)
 	_msg := log_msg.NewLogMsg(log_msg.INFO, strMsg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 }
 
-// предупреждающие сообщения
-func (sf *logBuf) warn(msg tMsg) {
+// Warn -- предупреждающие сообщения
+func (sf *logBuf) Warn(fMsg string, args ...any) {
+	sf.Lock()
+	defer sf.Unlock()
+	msg := tMsg{
+		text: fMsg,
+		args: args,
+	}
 	strMsg := fmt.Sprintf(msg.text, msg.args...)
 	_msg := log_msg.NewLogMsg(log_msg.WARN, strMsg)
 	sf.lst = append(sf.lst, _msg)
 	sf.checkLen()
 }
 
-// сообщения об ошибках
-func (sf *logBuf) err(msg tMsg) {
+// Err -- сообщения об ошибках
+func (sf *logBuf) Err(fMsg string, args ...any) {
+	sf.Lock()
+	defer sf.Unlock()
+	msg := tMsg{
+		text: fMsg,
+		args: args,
+	}
 	strMsg := fmt.Sprintf(msg.text, msg.args...)
 	_msg := log_msg.NewLogMsg(log_msg.ERROR, strMsg)
 	sf.lst = append(sf.lst, _msg)
@@ -212,6 +120,13 @@ func (sf *logBuf) err(msg tMsg) {
 	sf.checkLenErr()
 }
 
+// Size -- возвращает размер буфера
+func (sf *logBuf) Size() int {
+	sf.RLock()
+	defer sf.RUnlock()
+	return len(sf.lst)
+}
+
 // Проверяет длину общую лога
 func (sf *logBuf) checkLen() {
 	for len(sf.lst) > 100 {