mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-05 01:14:01 +08:00
62 lines
1.1 KiB
Go
62 lines
1.1 KiB
Go
|
|
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
||
|
|
|
||
|
|
package compressions
|
||
|
|
|
||
|
|
import (
|
||
|
|
"io"
|
||
|
|
)
|
||
|
|
|
||
|
|
type WriterPool struct {
|
||
|
|
m map[int]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 {
|
||
|
|
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,
|
||
|
|
newFunc: newFunc,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *WriterPool) Get(parentWriter io.Writer, level int) (Writer, error) {
|
||
|
|
c, ok := this.m[level]
|
||
|
|
if !ok {
|
||
|
|
c = this.m[0]
|
||
|
|
}
|
||
|
|
|
||
|
|
select {
|
||
|
|
case writer := <-c:
|
||
|
|
writer.Reset(parentWriter)
|
||
|
|
writer.ResetFinish()
|
||
|
|
return writer, nil
|
||
|
|
default:
|
||
|
|
writer, err := this.newFunc(parentWriter, level)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
writer.SetPool(this)
|
||
|
|
return writer, nil
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (this *WriterPool) Put(writer Writer) {
|
||
|
|
var level = writer.Level()
|
||
|
|
c, ok := this.m[level]
|
||
|
|
if !ok {
|
||
|
|
c = this.m[0]
|
||
|
|
}
|
||
|
|
select {
|
||
|
|
case c <- writer:
|
||
|
|
default:
|
||
|
|
}
|
||
|
|
}
|