Files
fasthttp/userdata.go
T
Erik Dubbelboer 0324e8d2a2 Make sure removed/resetted user valeus get garbage collected
Since our userData slice isn't shrunk when we delete values, it can
still keep pointing to things that have been removed. Set these pointers
to nil so that the key and value can be garbage collected.

Fixes https://github.com/valyala/fasthttp/issues/1812
2024-07-28 11:06:17 +02:00

109 lines
1.5 KiB
Go

package fasthttp
import (
"io"
)
type userDataKV struct {
key any
value any
}
type userData []userDataKV
func (d *userData) Set(key, value any) {
if b, ok := key.([]byte); ok {
key = string(b)
}
args := *d
n := len(args)
for i := 0; i < n; i++ {
kv := &args[i]
if kv.key == key {
kv.value = value
return
}
}
if value == nil {
return
}
c := cap(args)
if c > n {
args = args[:n+1]
kv := &args[n]
kv.key = key
kv.value = value
*d = args
return
}
kv := userDataKV{}
kv.key = key
kv.value = value
args = append(args, kv)
*d = args
}
func (d *userData) SetBytes(key []byte, value any) {
d.Set(key, value)
}
func (d *userData) Get(key any) any {
if b, ok := key.([]byte); ok {
key = b2s(b)
}
args := *d
n := len(args)
for i := 0; i < n; i++ {
kv := &args[i]
if kv.key == key {
return kv.value
}
}
return nil
}
func (d *userData) GetBytes(key []byte) any {
return d.Get(key)
}
func (d *userData) Reset() {
args := *d
n := len(args)
for i := 0; i < n; i++ {
v := args[i].value
if vc, ok := v.(io.Closer); ok {
vc.Close()
}
(*d)[i].value = nil
(*d)[i].key = nil
}
*d = (*d)[:0]
}
func (d *userData) Remove(key any) {
if b, ok := key.([]byte); ok {
key = b2s(b)
}
args := *d
n := len(args)
for i := 0; i < n; i++ {
kv := &args[i]
if kv.key == key {
n--
args[i], args[n] = args[n], args[i]
args[n].key = nil
args[n].value = nil
args = args[:n]
*d = args
return
}
}
}
func (d *userData) RemoveBytes(key []byte) {
d.Remove(key)
}