Skip to content

Commit 9532655

Browse files
committed
made the gdtf parser concurrency safe by moving away from global var for refpointers
1 parent 1591812 commit 9532655

11 files changed

Lines changed: 160 additions & 156 deletions

File tree

gdtf-parser.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,13 @@ func ParseGDTFZipReader(zipfile *zip.Reader, readMeshes bool, readThumbnail bool
5252
// parse XML structs into desired destination structs (kept seperate for breaking changes in GDTF version)
5353
parsedGDTF := gdtfContent.Parse()
5454

55+
refPointers := Types.CreateRefPointersMap()
56+
5557
// create pointers for referencing
56-
parsedGDTF.CreateReferencePointer()
58+
parsedGDTF.CreateReferencePointer(refPointers)
5759

5860
// resolve pointer references
59-
parsedGDTF.ResolveReference()
61+
parsedGDTF.ResolveReference(refPointers)
6062

6163
if readMeshes {
6264
for _, model := range parsedGDTF.FixtureType.Models {

pkg/types/attribute.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@ type AttributeDefinitions struct {
66
Attributes []*Attribute
77
}
88

9-
func (obj *AttributeDefinitions) CreateReferencePointer() {
10-
CreateReferencePointers(&obj.ActivationGroups)
11-
CreateReferencePointers(&obj.FeatureGroups)
12-
CreateReferencePointers(&obj.Attributes)
9+
func (obj *AttributeDefinitions) CreateReferencePointer(refPointers *ReferencePointers) {
10+
CreateReferencePointers(refPointers, &obj.ActivationGroups)
11+
CreateReferencePointers(refPointers, &obj.FeatureGroups)
12+
CreateReferencePointers(refPointers, &obj.Attributes)
1313
}
1414

15-
func (obj *AttributeDefinitions) ResolveReference() {
16-
ResolveReferences(&obj.Attributes)
15+
func (obj *AttributeDefinitions) ResolveReference(refPointers *ReferencePointers) {
16+
ResolveReferences(refPointers, &obj.Attributes)
1717
}
1818

1919
type ActivationGroup struct {
2020
Name string
2121
Attributes []*Attribute
2222
}
2323

24-
func (obj *ActivationGroup) CreateReferencePointer() {
24+
func (obj *ActivationGroup) CreateReferencePointer(refPointers *ReferencePointers) {
2525
refPointers.ActivationGroups[obj.Name] = obj
2626
}
2727

@@ -31,7 +31,7 @@ type FeatureGroup struct {
3131
Features []*Feature
3232
}
3333

34-
func (obj *FeatureGroup) CreateReferencePointer() {
34+
func (obj *FeatureGroup) CreateReferencePointer(refPointers *ReferencePointers) {
3535
for _, element := range obj.Features {
3636
refPointers.Features[obj.Name+"."+element.Name] = element
3737
}
@@ -53,15 +53,15 @@ type Attribute struct {
5353
SubPhysicalUnits *[]*SubPhysicalUnit
5454
}
5555

56-
func (obj *Attribute) CreateReferencePointer() {
56+
func (obj *Attribute) CreateReferencePointer(refPointers *ReferencePointers) {
5757
refPointers.Attributes[obj.Name] = obj
5858
// TODO: find out reference name for SubPhysicalUnits
5959
// for _, element := range *obj.SubPhysicalUnits {
6060
// refPointers.SubPhysicalUnits[obj.Name + "." + element]
6161
// }
6262
}
6363

64-
func (obj *Attribute) ResolveReference() {
64+
func (obj *Attribute) ResolveReference(refPointers *ReferencePointers) {
6565
if obj.ActivationGroup.String != "" {
6666
obj.ActivationGroup.Ptr = refPointers.ActivationGroups[obj.ActivationGroup.String]
6767
refPointers.ActivationGroups[obj.ActivationGroup.String].Attributes =

pkg/types/dmxmode.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ type DMXMode struct {
99
FTMacros []*FTMacro
1010
}
1111

12-
func (obj *DMXMode) CreateReferencePointer() {
12+
func (obj *DMXMode) CreateReferencePointer(refPointers *ReferencePointers) {
1313
refPointers.DMXModes[obj.Name] = obj
1414
for _, element := range obj.DMXChannels {
1515
refPointers.DMXChannels[obj.Name+"."+element.GetName()] = element
@@ -28,12 +28,12 @@ func (obj *DMXMode) CreateReferencePointer() {
2828
}
2929
}
3030

31-
func (obj *DMXMode) ResolveReference() {
31+
func (obj *DMXMode) ResolveReference(refPointers *ReferencePointers) {
3232
obj.Geometry.Ptr = refPointers.Geometries[obj.Geometry.String]
3333
for i := range obj.DMXChannels {
34-
(obj.DMXChannels)[i].ResolveReference(obj)
34+
(obj.DMXChannels)[i].ResolveReference(refPointers, obj)
3535
}
36-
ResolveReferences(&obj.FTMacros)
36+
ResolveReferences(refPointers, &obj.FTMacros)
3737
}
3838

3939
type DMXChannel struct {
@@ -50,10 +50,10 @@ func (element DMXChannel) GetName() string {
5050
return element.Geometry + "_" + element.LogicalChannels[0].Attribute.String
5151
}
5252

53-
func (obj *DMXChannel) ResolveReference(mode *DMXMode) {
53+
func (obj *DMXChannel) ResolveReference(refPointers *ReferencePointers, mode *DMXMode) {
5454
obj.InitialFunction.Ptr = refPointers.ChannelFunctions[mode.Name+"."+obj.InitialFunction.String]
5555
// obj.Geometry.Ptr = refPointers.Geometries[obj.Geometry.String] //TODO: dmxchannels only contain the last part of the reference name -> other solution required?
56-
ResolveReferences(&obj.LogicalChannels)
56+
ResolveReferences(refPointers, &obj.LogicalChannels)
5757
}
5858

5959
type LogicalChannel struct {
@@ -65,9 +65,9 @@ type LogicalChannel struct {
6565
ChannelFunctions []*ChannelFunction
6666
}
6767

68-
func (obj *LogicalChannel) ResolveReference() {
68+
func (obj *LogicalChannel) ResolveReference(refPointers *ReferencePointers) {
6969
obj.Attribute.Ptr = refPointers.Attributes[obj.Attribute.String]
70-
ResolveReferences(&obj.ChannelFunctions)
70+
ResolveReferences(refPointers, &obj.ChannelFunctions)
7171
}
7272

7373
type ChannelFunction struct {
@@ -96,7 +96,7 @@ type ChannelFunction struct {
9696
SubChannelSets []*SubChannelSet
9797
}
9898

99-
func (obj *ChannelFunction) ResolveReference() {
99+
func (obj *ChannelFunction) ResolveReference(refPointers *ReferencePointers) {
100100
obj.Attribute.Ptr = refPointers.Attributes[obj.Attribute.String]
101101
obj.Wheel.Ptr = refPointers.Wheels[obj.Wheel.String]
102102
obj.Emitter.Ptr = refPointers.Emitters[obj.Emitter.String]
@@ -105,8 +105,8 @@ func (obj *ChannelFunction) ResolveReference() {
105105
obj.Gamut.Ptr = refPointers.Gamuts[obj.Gamut.String]
106106
obj.DMXProfile.Ptr = refPointers.DMXProfiles[obj.DMXProfile.String]
107107

108-
ResolveReferences(&obj.ChannelSets)
109-
ResolveReferences(&obj.SubChannelSets)
108+
ResolveReferences(refPointers, &obj.ChannelSets)
109+
ResolveReferences(refPointers, &obj.SubChannelSets)
110110
}
111111

112112
type ChannelSet struct {
@@ -117,7 +117,7 @@ type ChannelSet struct {
117117
WheelSlot NodeReference[WheelSlot]
118118
}
119119

120-
func (obj *ChannelSet) ResolveReference() {
120+
func (obj *ChannelSet) ResolveReference(refPointers *ReferencePointers) {
121121
obj.WheelSlot.Ptr = refPointers.WheelSlots[obj.WheelSlot.String]
122122
}
123123

@@ -129,7 +129,7 @@ type SubChannelSet struct {
129129
DMXProfile NodeReference[DMXProfile]
130130
}
131131

132-
func (obj *SubChannelSet) ResolveReference() {
132+
func (obj *SubChannelSet) ResolveReference(refPointers *ReferencePointers) {
133133
obj.SubPhysicalUnit.Ptr = refPointers.SubPhysicalUnits[obj.SubPhysicalUnit.String]
134134
obj.DMXProfile.Ptr = refPointers.DMXProfiles[obj.DMXProfile.String]
135135
}
@@ -147,33 +147,33 @@ type FTMacro struct {
147147
MacroDMXs []*MacroDMX
148148
}
149149

150-
func (obj *FTMacro) ResolveReference() {
150+
func (obj *FTMacro) ResolveReference(refPointers *ReferencePointers) {
151151
obj.ChannelFunction.Ptr = refPointers.ChannelFunctions[obj.ChannelFunction.String]
152-
ResolveReferences(&obj.MacroDMXs)
152+
ResolveReferences(refPointers, &obj.MacroDMXs)
153153
}
154154

155155
type MacroDMX struct {
156156
Steps []*MacroDMXStep
157157
}
158158

159-
func (obj *MacroDMX) ResolveReference() {
160-
ResolveReferences(&obj.Steps)
159+
func (obj *MacroDMX) ResolveReference(refPointers *ReferencePointers) {
160+
ResolveReferences(refPointers, &obj.Steps)
161161
}
162162

163163
type MacroDMXStep struct {
164164
Duration float32
165165
DMXValues []*MacroDMXValue
166166
}
167167

168-
func (obj *MacroDMXStep) ResolveReference() {
169-
ResolveReferences(&obj.DMXValues)
168+
func (obj *MacroDMXStep) ResolveReference(refPointers *ReferencePointers) {
169+
ResolveReferences(refPointers, &obj.DMXValues)
170170
}
171171

172172
type MacroDMXValue struct {
173173
Value DMXValue
174174
DMXChannel NodeReference[DMXChannel]
175175
}
176176

177-
func (obj *MacroDMXValue) ResolveReference() {
177+
func (obj *MacroDMXValue) ResolveReference(refPointers *ReferencePointers) {
178178
obj.DMXChannel.Ptr = refPointers.DMXChannels[obj.DMXChannel.String]
179179
}

pkg/types/fixturetype.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@ type FixtureType struct {
2626
Protocols Protocol
2727
}
2828

29-
func (obj *FixtureType) CreateReferencePointer() {
30-
obj.AttributeDefinitions.CreateReferencePointer()
31-
CreateReferencePointers(&obj.Wheels)
32-
CreateReferencePointers(&obj.PhysicalDescriptions)
33-
CreateReferencePointers(&obj.Models)
34-
obj.Geometries.CreateGeometryReferencePointer("")
35-
CreateReferencePointersMap(&obj.DMXModes)
36-
// CreateReferencePointers(&obj.Revisions)
37-
// obj.Protocols.CreateReferencePointer()
29+
func (obj *FixtureType) CreateReferencePointer(refPointers *ReferencePointers) {
30+
obj.AttributeDefinitions.CreateReferencePointer(refPointers)
31+
CreateReferencePointers(refPointers, &obj.Wheels)
32+
CreateReferencePointers(refPointers, &obj.PhysicalDescriptions)
33+
CreateReferencePointers(refPointers, &obj.Models)
34+
obj.Geometries.CreateGeometryReferencePointer(refPointers, "")
35+
CreateReferencePointersMap(refPointers, &obj.DMXModes)
36+
// CreateReferencePointers(refPointers, &obj.Revisions)
37+
// obj.Protocols.CreateReferencePointer(refPointers)
3838
}
3939

40-
func (obj *FixtureType) ResolveReference() {
41-
obj.AttributeDefinitions.ResolveReference()
42-
ResolveReferences(&obj.Wheels)
43-
obj.Geometries.ResolveReference()
44-
ResolveReferencesMap(&obj.DMXModes)
40+
func (obj *FixtureType) ResolveReference(refPointers *ReferencePointers) {
41+
obj.AttributeDefinitions.ResolveReference(refPointers)
42+
ResolveReferences(refPointers, &obj.Wheels)
43+
obj.Geometries.ResolveReference(refPointers)
44+
ResolveReferencesMap(refPointers, &obj.DMXModes)
4545
}

pkg/types/gdtf.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ type GDTF struct {
1111
FixtureType FixtureType
1212
}
1313

14-
func (obj *GDTF) CreateReferencePointer() {
15-
obj.FixtureType.CreateReferencePointer()
14+
func (obj *GDTF) CreateReferencePointer(refPointers *ReferencePointers) {
15+
obj.FixtureType.CreateReferencePointer(refPointers)
1616
}
1717

18-
func (obj *GDTF) ResolveReference() {
19-
obj.FixtureType.ResolveReference()
18+
func (obj *GDTF) ResolveReference(refPointers *ReferencePointers) {
19+
obj.FixtureType.ResolveReference(refPointers)
2020
}
2121

2222
// Assemble a mesh based on entire geometry

0 commit comments

Comments
 (0)