Addresses concurrent map read and write (#688)

This commit is contained in:
James Read 2025-11-05 00:46:10 +00:00 committed by GitHub
commit d94f2aca1c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 4 deletions

View File

@ -60,15 +60,38 @@ func GetAll() *variableBase {
} }
func GetEntities() entitiesByClass { func GetEntities() entitiesByClass {
return contents.Entities rwmutex.RLock()
copiedEntities := make(entitiesByClass, len(contents.Entities))
for entityName, entityInstances := range contents.Entities {
copiedInstances := make(entityInstancesByKey, len(entityInstances))
for key, entity := range entityInstances {
copiedInstances[key] = entity
}
copiedEntities[entityName] = copiedInstances
}
rwmutex.RUnlock()
return copiedEntities
} }
func GetEntityInstances(entityName string) entityInstancesByKey { func GetEntityInstances(entityName string) entityInstancesByKey {
rwmutex.RLock()
defer rwmutex.RUnlock()
if entities, ok := contents.Entities[entityName]; ok { if entities, ok := contents.Entities[entityName]; ok {
return entities copiedInstances := make(entityInstancesByKey, len(entities))
for key, entity := range entities {
copiedInstances[key] = entity
}
return copiedInstances
} }
return nil return make(entityInstancesByKey, 0)
} }
func AddEntity(entityName string, entityKey string, data any) { func AddEntity(entityName string, entityKey string, data any) {

View File

@ -91,7 +91,7 @@ func ParseTemplateWithArgs(source string, ent *Entity, args map[string]string) s
} }
templateVariables := &variableBase{ templateVariables := &variableBase{
OliveTin: contents.OliveTin, OliveTin: GetAll().OliveTin,
Arguments: args, Arguments: args,
CurrentEntity: entdata, CurrentEntity: entdata,
} }
@ -126,5 +126,8 @@ func ParseTemplateBoolWith(source string, ent *Entity) bool {
} }
func ClearEntities(entityType string) { func ClearEntities(entityType string) {
rwmutex.Lock()
defer rwmutex.Unlock()
delete(contents.Entities, entityType) delete(contents.Entities, entityType)
} }