mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-12 14:30:54 +08:00
内容压缩增加繁忙(busy)检测
This commit is contained in:
@@ -3,40 +3,58 @@
|
||||
package compressions
|
||||
|
||||
import (
|
||||
teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
|
||||
"github.com/TeaOSLab/EdgeNode/internal/goman"
|
||||
"io"
|
||||
"time"
|
||||
)
|
||||
|
||||
const maxWriterHits = 1 << 20
|
||||
|
||||
var isBusy = false
|
||||
|
||||
func init() {
|
||||
if !teaconst.IsMain {
|
||||
return
|
||||
}
|
||||
|
||||
goman.New(func() {
|
||||
var ticker = time.NewTicker(100 * time.Millisecond)
|
||||
for range ticker.C {
|
||||
if isBusy {
|
||||
isBusy = false
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func IsBusy() bool {
|
||||
return isBusy
|
||||
}
|
||||
|
||||
type WriterPool struct {
|
||||
m map[int]chan Writer // level => chan Writer
|
||||
c chan Writer // level => chan Writer
|
||||
newFunc func(writer io.Writer, level int) (Writer, error)
|
||||
}
|
||||
|
||||
func NewWriterPool(maxSize int, maxLevel int, newFunc func(writer io.Writer, level int) (Writer, error)) *WriterPool {
|
||||
func NewWriterPool(maxSize int, newFunc func(writer io.Writer, level int) (Writer, error)) *WriterPool {
|
||||
if maxSize <= 0 {
|
||||
maxSize = 1024
|
||||
}
|
||||
|
||||
var m = map[int]chan Writer{}
|
||||
for i := 0; i <= maxLevel; i++ {
|
||||
m[i] = make(chan Writer, maxSize)
|
||||
}
|
||||
|
||||
return &WriterPool{
|
||||
m: m,
|
||||
c: make(chan Writer, maxSize),
|
||||
newFunc: newFunc,
|
||||
}
|
||||
}
|
||||
|
||||
func (this *WriterPool) Get(parentWriter io.Writer, level int) (Writer, error) {
|
||||
c, ok := this.m[level]
|
||||
if !ok {
|
||||
c = this.m[0]
|
||||
if isBusy {
|
||||
return nil, ErrIsBusy
|
||||
}
|
||||
|
||||
select {
|
||||
case writer := <-c:
|
||||
case writer := <-this.c:
|
||||
writer.Reset(parentWriter)
|
||||
writer.ResetFinish()
|
||||
return writer, nil
|
||||
@@ -56,13 +74,9 @@ func (this *WriterPool) Put(writer Writer) {
|
||||
return
|
||||
}
|
||||
|
||||
var level = writer.Level()
|
||||
c, ok := this.m[level]
|
||||
if !ok {
|
||||
c = this.m[0]
|
||||
}
|
||||
select {
|
||||
case c <- writer:
|
||||
case this.c <- writer:
|
||||
default:
|
||||
isBusy = true
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user