mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 07:40:56 +08:00 
			
		
		
		
	内容压缩算法使用Pool管理
This commit is contained in:
		
							
								
								
									
										61
									
								
								internal/compressions/writer_pool.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								internal/compressions/writer_pool.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
// 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:
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user