bug fix:goroutine security improved
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"math/rand"
|
||||
"net"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"b612.me/starnet"
|
||||
@@ -17,6 +18,7 @@ type StarNotifyC struct {
|
||||
Connc net.Conn
|
||||
dialTimeout time.Duration
|
||||
clientSign map[string]chan string
|
||||
mu sync.Mutex
|
||||
// FuncLists 当不使用channel时,使用此记录调用函数
|
||||
FuncLists map[string]func(CMsg)
|
||||
stopSign context.Context
|
||||
@@ -62,7 +64,9 @@ func (star *StarNotifyC) starinitc() {
|
||||
func (star *StarNotifyC) Notify(key string) chan string {
|
||||
if _, ok := star.clientSign[key]; !ok {
|
||||
ch := make(chan string, 20)
|
||||
star.mu.Lock()
|
||||
star.clientSign[key] = ch
|
||||
star.mu.Unlock()
|
||||
}
|
||||
return star.clientSign[key]
|
||||
}
|
||||
@@ -71,7 +75,9 @@ func (star *StarNotifyC) store(key, value string) {
|
||||
if _, ok := star.clientSign[key]; !ok {
|
||||
ch := make(chan string, 20)
|
||||
ch <- value
|
||||
star.mu.Lock()
|
||||
star.clientSign[key] = ch
|
||||
star.mu.Unlock()
|
||||
return
|
||||
}
|
||||
star.clientSign[key] <- value
|
||||
@@ -212,7 +218,7 @@ func (star *StarNotifyC) SendValueWait(name, value string, tmout time.Duration)
|
||||
return CMsg{}, errors.New("Do Not Use UseChannel Mode!")
|
||||
}
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
mode := "cr" + fmt.Sprintf("%05d", rand.Intn(99999))
|
||||
mode := "cr" + fmt.Sprintf("%d%06d", time.Now().UnixNano(), rand.Intn(999999))
|
||||
var key []byte
|
||||
for _, v := range []byte(name) {
|
||||
if v == byte(124) || v == byte(92) {
|
||||
@@ -229,11 +235,15 @@ func (star *StarNotifyC) SendValueWait(name, value string, tmout time.Duration)
|
||||
}
|
||||
var source CMsg
|
||||
source.wait = make(chan int, 2)
|
||||
star.mu.Lock()
|
||||
star.lockPool[mode] = source
|
||||
star.mu.Unlock()
|
||||
select {
|
||||
case <-source.wait:
|
||||
res := star.lockPool[mode]
|
||||
star.mu.Lock()
|
||||
delete(star.lockPool, mode)
|
||||
star.mu.Unlock()
|
||||
return res, nil
|
||||
case <-tmceed:
|
||||
return CMsg{}, errors.New("Time Exceed")
|
||||
@@ -263,7 +273,7 @@ func (star *StarNotifyC) cnotify() {
|
||||
}
|
||||
data, err := star.Queue.RestoreOne()
|
||||
if err != nil {
|
||||
time.Sleep(time.Millisecond * 20)
|
||||
time.Sleep(time.Microsecond * 2)
|
||||
continue
|
||||
}
|
||||
if string(data.Msg) == "b612ryzstop" {
|
||||
@@ -301,7 +311,9 @@ func (star *StarNotifyC) cnotify() {
|
||||
sa.Key = key
|
||||
sa.Value = value
|
||||
sa.mode = mode
|
||||
star.mu.Lock()
|
||||
star.lockPool[mode] = sa
|
||||
star.mu.Unlock()
|
||||
sa.wait <- 1
|
||||
} else {
|
||||
if msg, ok := star.FuncLists[key]; ok {
|
||||
|
||||
Reference in New Issue
Block a user