34 lines
721 B
Go
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
|
|
}
|