mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 16:00:25 +08:00 
			
		
		
		
	
		
			
	
	
		
			57 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			57 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package compressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"io"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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) {
							 | 
						||
| 
								 | 
							
									select {
							 | 
						||
| 
								 | 
							
									case this.c <- reader:
							 | 
						||
| 
								 | 
							
									default:
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |