Skip to content

Commit

Permalink
feat(plc4go/tools): reworked alpha support to use defer to always unl…
Browse files Browse the repository at this point in the history
…ock lock
  • Loading branch information
sruehl committed Aug 1, 2023
1 parent f6d53d8 commit d7c7fe9
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 38 deletions.
9 changes: 8 additions & 1 deletion plc4go/internal/cbus/AlphaGenerator_plc4xgen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion plc4go/internal/cbus/Connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ import (

//go:generate go run ../../tools/plc4xgenerator/gen.go -type=AlphaGenerator
type AlphaGenerator struct {
currentAlpha byte
currentAlpha byte `hasLocker:"lock"`
lock sync.Mutex
}

Expand Down
6 changes: 3 additions & 3 deletions plc4go/internal/cbus/Reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,16 +168,16 @@ func (m *Reader) sendMessageOverTheWire(ctx context.Context, transaction transac
m.log.Trace().Msg("it is not a confirmation")
return false
}
actualAlpha := confirmation.GetConfirmation().GetAlpha().GetCharacter()
receivedAlpha := confirmation.GetConfirmation().GetAlpha().GetCharacter()
// TODO: assert that this is a CBusMessageToServer indeed (by changing param for example)
alphaRetriever, ok := messageToSend.(readWriteModel.CBusMessageToServer).GetRequest().(interface{ GetAlpha() readWriteModel.Alpha })
if !ok {
m.log.Trace().Msg("no alpha there")
return false
}
expectedAlpha := alphaRetriever.GetAlpha().GetCharacter()
m.log.Trace().Msgf("Comparing expected alpha '%c' to actual alpha '%c'", expectedAlpha, actualAlpha)
return actualAlpha == expectedAlpha
m.log.Trace().Msgf("Comparing expected alpha '%c' to received alpha '%c'", expectedAlpha, receivedAlpha)
return receivedAlpha == expectedAlpha
},
func(receivedMessage spi.Message) error {
// Convert the response into an
Expand Down
2 changes: 1 addition & 1 deletion plc4go/internal/cbus/Subscriber.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import (

//go:generate go run ../../tools/plc4xgenerator/gen.go -type=Subscriber
type Subscriber struct {
consumers map[*spiModel.DefaultPlcConsumerRegistration]apiModel.PlcSubscriptionEventConsumer
consumers map[*spiModel.DefaultPlcConsumerRegistration]apiModel.PlcSubscriptionEventConsumer `hasLocker:"consumersMutex"`
addSubscriber func(subscriber *Subscriber)

consumersMutex sync.RWMutex
Expand Down
51 changes: 29 additions & 22 deletions plc4go/internal/cbus/Subscriber_plc4xgen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 39 additions & 10 deletions plc4go/tools/plc4xgenerator/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -232,12 +232,17 @@ func (g *Generator) generate(typeName string) {
fieldName := field.name
fieldNameUntitled := "\"" + unTitle(fieldName) + "\""
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Lock()\n")
g.Printf("if err := func()error {\n")
g.Printf("\td." + field.hasLocker + ".Lock()\n")
g.Printf("\tdefer d." + field.hasLocker + ".Unlock()\n")
}
if field.isStringer {
g.Printf(stringFieldSerialize, "d."+field.name+".String()", fieldNameUntitled)
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
continue
}
Expand All @@ -259,43 +264,61 @@ func (g *Generator) generate(typeName string) {
if sel.Name == "Uint32" {
g.Printf(uint32FieldSerialize, "d."+field.name+".Load()", fieldNameUntitled)
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
continue
}
if sel.Name == "Uint64" {
g.Printf(uint64FieldSerialize, "d."+field.name+".Load()", fieldNameUntitled)
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
continue
}
if sel.Name == "Int32" {
g.Printf(int32FieldSerialize, "d."+field.name+".Load()", fieldNameUntitled)
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
continue
}
if sel.Name == "Bool" {
g.Printf(boolFieldSerialize, "d."+field.name+".Load()", fieldNameUntitled)
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
continue
}
if sel.Name == "Value" {
g.Printf(serializableFieldTemplate, "d."+field.name+".Load()", fieldNameUntitled)
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
continue
}
}
if xIdent.Name == "sync" {
fmt.Printf("\t skipping field %s because it is %v.%v\n", fieldName, x, sel)
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
continue
}
Expand All @@ -310,7 +333,10 @@ func (g *Generator) generate(typeName string) {
if xIsIdent && xIdent.Name == "atomic" && sel.Name == "Pointer" {
g.Printf(atomicPointerFieldTemplate, "d."+field.name, field.name, fieldNameUntitled)
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
continue
}
Expand Down Expand Up @@ -437,7 +463,10 @@ func (g *Generator) generate(typeName string) {
fmt.Printf("no support implemented %#v\n", fieldType)
}
if field.hasLocker != "" {
g.Printf("d." + field.hasLocker + ".Unlock()\n")
g.Printf("\treturn nil\n")
g.Printf("}(); err != nil {\n")
g.Printf("\treturn err\n")
g.Printf("}\n")
}
}
g.Printf("\tif err := writeBuffer.PopContext(%s); err != nil {\n", logicalTypeName)
Expand Down

0 comments on commit d7c7fe9

Please sign in to comment.