You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2023/08/01 20:25:00 UTC
[plc4x] branch develop updated: feat(plc4go/tools): reworked alpha support to use defer to always unlock lock
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new d7c7fe9fd6 feat(plc4go/tools): reworked alpha support to use defer to always unlock lock
d7c7fe9fd6 is described below
commit d7c7fe9fd69c62272e842dfd64fa079478c9bb1f
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Aug 1 22:24:52 2023 +0200
feat(plc4go/tools): reworked alpha support to use defer to always unlock lock
---
plc4go/internal/cbus/AlphaGenerator_plc4xgen.go | 9 ++++-
plc4go/internal/cbus/Connection.go | 2 +-
plc4go/internal/cbus/Reader.go | 6 +--
plc4go/internal/cbus/Subscriber.go | 2 +-
plc4go/internal/cbus/Subscriber_plc4xgen.go | 51 ++++++++++++++-----------
plc4go/tools/plc4xgenerator/gen.go | 49 +++++++++++++++++++-----
6 files changed, 81 insertions(+), 38 deletions(-)
diff --git a/plc4go/internal/cbus/AlphaGenerator_plc4xgen.go b/plc4go/internal/cbus/AlphaGenerator_plc4xgen.go
index 23c5ee03a6..8a7bde9f03 100644
--- a/plc4go/internal/cbus/AlphaGenerator_plc4xgen.go
+++ b/plc4go/internal/cbus/AlphaGenerator_plc4xgen.go
@@ -42,8 +42,15 @@ func (d *AlphaGenerator) SerializeWithWriteBuffer(ctx context.Context, writeBuff
if err := writeBuffer.PushContext("AlphaGenerator"); err != nil {
return err
}
+ if err := func() error {
+ d.lock.Lock()
+ defer d.lock.Unlock()
- if err := writeBuffer.WriteByte("currentAlpha", d.currentAlpha); err != nil {
+ if err := writeBuffer.WriteByte("currentAlpha", d.currentAlpha); err != nil {
+ return err
+ }
+ return nil
+ }(); err != nil {
return err
}
if err := writeBuffer.PopContext("AlphaGenerator"); err != nil {
diff --git a/plc4go/internal/cbus/Connection.go b/plc4go/internal/cbus/Connection.go
index 238e3cb854..c84a07c032 100644
--- a/plc4go/internal/cbus/Connection.go
+++ b/plc4go/internal/cbus/Connection.go
@@ -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
}
diff --git a/plc4go/internal/cbus/Reader.go b/plc4go/internal/cbus/Reader.go
index 4de47034a9..9dfa6c11ce 100644
--- a/plc4go/internal/cbus/Reader.go
+++ b/plc4go/internal/cbus/Reader.go
@@ -168,7 +168,7 @@ 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 {
@@ -176,8 +176,8 @@ func (m *Reader) sendMessageOverTheWire(ctx context.Context, transaction transac
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
diff --git a/plc4go/internal/cbus/Subscriber.go b/plc4go/internal/cbus/Subscriber.go
index 8ca29b091b..45f6b8c5b6 100644
--- a/plc4go/internal/cbus/Subscriber.go
+++ b/plc4go/internal/cbus/Subscriber.go
@@ -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
diff --git a/plc4go/internal/cbus/Subscriber_plc4xgen.go b/plc4go/internal/cbus/Subscriber_plc4xgen.go
index 4db417c08c..dae32c24c5 100644
--- a/plc4go/internal/cbus/Subscriber_plc4xgen.go
+++ b/plc4go/internal/cbus/Subscriber_plc4xgen.go
@@ -42,31 +42,38 @@ func (d *Subscriber) SerializeWithWriteBuffer(ctx context.Context, writeBuffer u
if err := writeBuffer.PushContext("Subscriber"); err != nil {
return err
}
- if err := writeBuffer.PushContext("consumers", utils.WithRenderAsList(true)); err != nil {
- return err
- }
- for _name, elem := range d.consumers {
- name := fmt.Sprintf("%v", &_name)
+ if err := func() error {
+ d.consumersMutex.Lock()
+ defer d.consumersMutex.Unlock()
+ if err := writeBuffer.PushContext("consumers", utils.WithRenderAsList(true)); err != nil {
+ return err
+ }
+ for _name, elem := range d.consumers {
+ name := fmt.Sprintf("%v", &_name)
- var elem any = elem
- if serializable, ok := elem.(utils.Serializable); ok {
- if err := writeBuffer.PushContext(name); err != nil {
- return err
- }
- if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
- return err
- }
- if err := writeBuffer.PopContext(name); err != nil {
- return err
- }
- } else {
- elemAsString := fmt.Sprintf("%v", elem)
- if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
- return err
+ var elem any = elem
+ if serializable, ok := elem.(utils.Serializable); ok {
+ if err := writeBuffer.PushContext(name); err != nil {
+ return err
+ }
+ if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+ return err
+ }
+ if err := writeBuffer.PopContext(name); err != nil {
+ return err
+ }
+ } else {
+ elemAsString := fmt.Sprintf("%v", elem)
+ if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
+ return err
+ }
}
}
- }
- if err := writeBuffer.PopContext("consumers", utils.WithRenderAsList(true)); err != nil {
+ if err := writeBuffer.PopContext("consumers", utils.WithRenderAsList(true)); err != nil {
+ return err
+ }
+ return nil
+ }(); err != nil {
return err
}
diff --git a/plc4go/tools/plc4xgenerator/gen.go b/plc4go/tools/plc4xgenerator/gen.go
index 128a74181c..fba94c11e1 100644
--- a/plc4go/tools/plc4xgenerator/gen.go
+++ b/plc4go/tools/plc4xgenerator/gen.go
@@ -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
}
@@ -259,35 +264,50 @@ 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
}
@@ -295,7 +315,10 @@ func (g *Generator) generate(typeName string) {
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
}
@@ -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
}
@@ -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)