Skip to content

Commit a70530f

Browse files
neurlangYour Name
authored and
Your Name
committed
threading racing fix
1 parent 78f28fb commit a70530f

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

repo/pre_phonemization_word_steps_repo.go

+31-16
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ type PrePhonWordStepsRepository struct {
2121
steps *interfaces.PrePhonemizationSteps
2222
}
2323

24-
type prephonlanguages map[string]*prephonlanguage
24+
type prephonlanguages struct {
25+
mut sync.RWMutex
26+
lang map[string]*prephonlanguage
27+
}
2528

2629
type prephonlanguage struct {
2730
PrePhonWordSteps []PrePhonWordStep `json:"PrePhonWordSteps"`
@@ -38,45 +41,57 @@ func (p *prephonlanguages) Len(isReverse bool, lang string) int {
3841
if isReverse {
3942
reverse = "_reverse"
4043
}
41-
if p == nil || (*p)[lang+reverse] == nil {
44+
p.mut.RLock()
45+
defer p.mut.RUnlock()
46+
if p.lang == nil || (p.lang)[lang+reverse] == nil {
4247
return 0
4348
}
44-
return len((*p)[lang+reverse].PrePhonWordSteps)
49+
return len((p.lang)[lang+reverse].PrePhonWordSteps)
4550
}
4651
func (p *prephonlanguages) IsNormalize(isReverse bool, lang string, n int) bool {
4752
var reverse string
4853
if isReverse {
4954
reverse = "_reverse"
5055
}
51-
return len((*p)[lang+reverse].PrePhonWordSteps[n].Normalize) > 0
56+
p.mut.RLock()
57+
defer p.mut.RUnlock()
58+
return len((p.lang)[lang+reverse].PrePhonWordSteps[n].Normalize) > 0
5259
}
5360
func (p *prephonlanguages) IsTrim(isReverse bool, lang string, n int) bool {
5461
var reverse string
5562
if isReverse {
5663
reverse = "_reverse"
5764
}
58-
return len((*p)[lang+reverse].PrePhonWordSteps[n].Trim) > 0
65+
p.mut.RLock()
66+
defer p.mut.RUnlock()
67+
return len((p.lang)[lang+reverse].PrePhonWordSteps[n].Trim) > 0
5968
}
6069
func (p *prephonlanguages) IsToLower(isReverse bool, lang string, n int) bool {
6170
var reverse string
6271
if isReverse {
6372
reverse = "_reverse"
6473
}
65-
return (*p)[lang+reverse].PrePhonWordSteps[n].ToLower
74+
p.mut.RLock()
75+
defer p.mut.RUnlock()
76+
return (p.lang)[lang+reverse].PrePhonWordSteps[n].ToLower
6677
}
6778
func (p *prephonlanguages) GetNormalize(isReverse bool, lang string, n int) string {
6879
var reverse string
6980
if isReverse {
7081
reverse = "_reverse"
7182
}
72-
return (*p)[lang+reverse].PrePhonWordSteps[n].Normalize
83+
p.mut.RLock()
84+
defer p.mut.RUnlock()
85+
return (p.lang)[lang+reverse].PrePhonWordSteps[n].Normalize
7386
}
7487
func (p *prephonlanguages) GetTrim(isReverse bool, lang string, n int) string {
7588
var reverse string
7689
if isReverse {
7790
reverse = "_reverse"
7891
}
79-
return (*p)[lang+reverse].PrePhonWordSteps[n].Trim
92+
p.mut.RLock()
93+
defer p.mut.RUnlock()
94+
return (p.lang)[lang+reverse].PrePhonWordSteps[n].Trim
8095
}
8196
func (p *PrePhonWordStepsRepository) LoadLanguage(isReverse bool, lang string) {
8297

@@ -85,9 +100,10 @@ func (p *PrePhonWordStepsRepository) LoadLanguage(isReverse bool, lang string) {
85100
reverse = "_reverse"
86101
}
87102

88-
p.mut.RLock()
89-
existing_lang := (*p.lang)[lang+reverse]
90-
p.mut.RUnlock()
103+
p.mut.Lock()
104+
defer p.mut.Unlock()
105+
106+
existing_lang := (p.lang.lang)[lang+reverse]
91107

92108
if existing_lang != nil {
93109
return
@@ -105,13 +121,12 @@ func (p *PrePhonWordStepsRepository) LoadLanguage(isReverse bool, lang string) {
105121
log.Now().Errorf("Error parsing JSON: %v\n", err)
106122
continue
107123
}
108-
p.mut.Lock()
109-
(*p.lang)[lang+reverse] = &langone
124+
p.lang.lang = make(map[string]*prephonlanguage)
125+
(p.lang.lang)[lang+reverse] = &langone
110126

111-
iface := (interfaces.PrePhonemizationSteps)(&(*p.lang))
127+
iface := (interfaces.PrePhonemizationSteps)((p.lang))
112128

113129
p.steps = &iface
114-
p.mut.Unlock()
115130
}
116131
}
117132

@@ -183,7 +198,7 @@ func (s *PrePhonWordStepsRepository) PrePhonemizeWord(isReverse bool, lang strin
183198

184199
func NewPrePhonWordStepsRepository(di *DependencyInjection) *PrePhonWordStepsRepository {
185200
getter := MustAny[interfaces.DictGetter](di)
186-
langs := make(prephonlanguages)
201+
langs := prephonlanguages{}
187202

188203
return &PrePhonWordStepsRepository{
189204
getter: &getter,

0 commit comments

Comments
 (0)