kittenipc/kitcom/internal/tsgo/project/programcounter.go
2025-10-15 10:12:44 +03:00

34 lines
721 B
Go

package project
import (
"sync/atomic"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/collections"
"efprojects.com/kitten-ipc/kitcom/internal/tsgo/compiler"
)
type programCounter struct {
refs collections.SyncMap[*compiler.Program, *atomic.Int32]
}
func (c *programCounter) Ref(program *compiler.Program) {
counter, _ := c.refs.LoadOrStore(program, &atomic.Int32{})
counter.Add(1)
}
func (c *programCounter) Deref(program *compiler.Program) bool {
counter, ok := c.refs.Load(program)
if !ok {
panic("program not found in counter")
}
count := counter.Add(-1)
if count < 0 {
panic("program reference count went below zero")
}
if count == 0 {
c.refs.Delete(program)
return true
}
return false
}