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)