mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 16:00:25 +08:00 
			
		
		
		
	* 取消用户设置的压缩级别,现在压缩级别通过系统自动设置 * Pool中的对象命中100万次时自动销毁,避免内存泄漏 * 降低Pool中的对象数量,避免占用太多内存 * 根据系统CPU线程数自动计算压缩级别,避免消耗太多CPU * zstd限制解码的最大Window * zstd使用低内存模式
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
						|
 | 
						|
package compressions
 | 
						|
 | 
						|
import (
 | 
						|
	"io"
 | 
						|
)
 | 
						|
 | 
						|
const maxReadHits = 1 << 20
 | 
						|
 | 
						|
type ReaderPool struct {
 | 
						|
	c       chan Reader
 | 
						|
	newFunc func(reader io.Reader) (Reader, error)
 | 
						|
}
 | 
						|
 | 
						|
func NewReaderPool(maxSize int, newFunc func(reader io.Reader) (Reader, error)) *ReaderPool {
 | 
						|
	if maxSize <= 0 {
 | 
						|
		maxSize = 1024
 | 
						|
	}
 | 
						|
 | 
						|
	return &ReaderPool{
 | 
						|
		c:       make(chan Reader, maxSize),
 | 
						|
		newFunc: newFunc,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (this *ReaderPool) Get(parentReader io.Reader) (Reader, error) {
 | 
						|
	select {
 | 
						|
	case reader := <-this.c:
 | 
						|
		err := reader.Reset(parentReader)
 | 
						|
		if err != nil {
 | 
						|
			// create new
 | 
						|
			reader, err = this.newFunc(parentReader)
 | 
						|
			if err != nil {
 | 
						|
				return nil, err
 | 
						|
			}
 | 
						|
			reader.SetPool(this)
 | 
						|
			return reader, nil
 | 
						|
		}
 | 
						|
		reader.ResetFinish()
 | 
						|
		return reader, nil
 | 
						|
	default:
 | 
						|
		// create new
 | 
						|
		reader, err := this.newFunc(parentReader)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		reader.SetPool(this)
 | 
						|
		return reader, nil
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (this *ReaderPool) Put(reader Reader) {
 | 
						|
	if reader.IncreaseHit() > maxReadHits {
 | 
						|
		// do nothing to discard it
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	select {
 | 
						|
	case this.c <- reader:
 | 
						|
	default:
 | 
						|
	}
 | 
						|
}
 |