2022-01-12 21:09:00 +08:00
|
|
|
// 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:
|
2022-12-05 10:46:44 +08:00
|
|
|
if file != nil {
|
|
|
|
|
err := file.SeekStart()
|
|
|
|
|
if err != nil {
|
|
|
|
|
_ = file.Close()
|
|
|
|
|
return nil, true
|
|
|
|
|
}
|
|
|
|
|
file.version = this.version
|
2022-01-12 21:09:00 +08:00
|
|
|
|
2022-12-05 10:46:44 +08:00
|
|
|
return file, true
|
|
|
|
|
}
|
|
|
|
|
return nil, false
|
2022-01-12 21:09:00 +08:00
|
|
|
default:
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (this *OpenFilePool) Put(file *OpenFile) bool {
|
2022-03-31 11:47:31 +08:00
|
|
|
if this.version > 0 && file.version > 0 && file.version != this.version {
|
2022-01-12 21:09:00 +08:00
|
|
|
_ = 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
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|