mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 16:00:25 +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:
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |