mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 07:40:56 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
						|
 | 
						|
package caches
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/TeaOSLab/EdgeNode/internal/utils"
 | 
						|
	"github.com/TeaOSLab/EdgeNode/internal/utils/linkedlist"
 | 
						|
)
 | 
						|
 | 
						|
type OpenFilePool struct {
 | 
						|
	c        chan *OpenFile
 | 
						|
	linkItem *linkedlist.Item
 | 
						|
	filename string
 | 
						|
	version  int64
 | 
						|
}
 | 
						|
 | 
						|
func NewOpenFilePool(filename string) *OpenFilePool {
 | 
						|
	var pool = &OpenFilePool{
 | 
						|
		filename: filename,
 | 
						|
		c:        make(chan *OpenFile, 1024),
 | 
						|
		version:  utils.UnixTimeMilli(),
 | 
						|
	}
 | 
						|
	pool.linkItem = linkedlist.NewItem(pool)
 | 
						|
	return pool
 | 
						|
}
 | 
						|
 | 
						|
func (this *OpenFilePool) Filename() string {
 | 
						|
	return this.filename
 | 
						|
}
 | 
						|
 | 
						|
func (this *OpenFilePool) Get() (*OpenFile, bool) {
 | 
						|
	select {
 | 
						|
	case file := <-this.c:
 | 
						|
		err := file.SeekStart()
 | 
						|
		if err != nil {
 | 
						|
			_ = file.Close()
 | 
						|
			return nil, true
 | 
						|
		}
 | 
						|
		file.version = this.version
 | 
						|
 | 
						|
		return file, true
 | 
						|
	default:
 | 
						|
		return nil, false
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (this *OpenFilePool) Put(file *OpenFile) bool {
 | 
						|
	if this.version > 0 && file.version > 0 && file.version != this.version {
 | 
						|
		_ = file.Close()
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	select {
 | 
						|
	case this.c <- file:
 | 
						|
		return true
 | 
						|
	default:
 | 
						|
		// 多余的直接关闭
 | 
						|
		_ = file.Close()
 | 
						|
		return false
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (this *OpenFilePool) Len() int {
 | 
						|
	return len(this.c)
 | 
						|
}
 | 
						|
 | 
						|
func (this *OpenFilePool) Close() {
 | 
						|
Loop:
 | 
						|
	for {
 | 
						|
		select {
 | 
						|
		case file := <-this.c:
 | 
						|
			_ = file.Close()
 | 
						|
		default:
 | 
						|
			break Loop
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |