From 7892eed092fc33caaf0e57236a75d341f3d8f441 Mon Sep 17 00:00:00 2001
From: Hendrik Buschmeier <hbuschme@uni-bielefeld.de>
Date: Thu, 7 Jan 2016 12:16:36 +0100
Subject: [PATCH] ipaaca-python: Moved rsb initialisation from module to
 Buffer.

---
 ipaacalib/python/src/ipaaca/__init__.py | 90 ++++++++++++++-----------
 ipaacalib/python/src/ipaaca/buffer.py   |  1 +
 2 files changed, 51 insertions(+), 40 deletions(-)

diff --git a/ipaacalib/python/src/ipaaca/__init__.py b/ipaacalib/python/src/ipaaca/__init__.py
index 09321c0..998fe65 100755
--- a/ipaacalib/python/src/ipaaca/__init__.py
+++ b/ipaacalib/python/src/ipaaca/__init__.py
@@ -32,6 +32,8 @@
 
 from __future__ import division, print_function
 
+import threading
+
 import rsb
 import rsb.converter
 
@@ -44,46 +46,54 @@ from ipaaca.misc import enable_logging, IpaacaArgumentParser
 from ipaaca.payload import Payload
 
 
-def initialize_ipaaca_rsb():
-	''''Register own RSB Converters and initialise RSB from default config file.'''
-	rsb.converter.registerGlobalConverter(
-		ipaaca.converter.IntConverter(
-			wireSchema="int32",
-			dataType=int))
-
-	rsb.converter.registerGlobalConverter(
-		ipaaca.converter.IUConverter(
-			wireSchema="ipaaca-iu",
-			dataType=IU))
-
-	rsb.converter.registerGlobalConverter(
-		ipaaca.converter.MessageConverter(
-			wireSchema="ipaaca-messageiu",
-			dataType=Message))
-
-	rsb.converter.registerGlobalConverter(
-		ipaaca.converter.IULinkUpdateConverter(
-			wireSchema="ipaaca-iu-link-update",
-			dataType=converter.IULinkUpdate))
-
-	rsb.converter.registerGlobalConverter(
-		ipaaca.converter.IUPayloadUpdateConverter(
-			wireSchema="ipaaca-iu-payload-update",
-			dataType=converter.IUPayloadUpdate))
-
-	rsb.converter.registerGlobalConverter(
-		rsb.converter.ProtocolBufferConverter(
-			messageClass=ipaaca_pb2.IUCommission))
-
-	rsb.converter.registerGlobalConverter(
-		rsb.converter.ProtocolBufferConverter(
-			messageClass=ipaaca_pb2.IUResendRequest))
+__RSB_INITIALIZER_LOCK = threading.Lock()
+__RSB_INITIALIZED = False
 
-	rsb.converter.registerGlobalConverter(
-		rsb.converter.ProtocolBufferConverter(
-			messageClass=ipaaca_pb2.IURetraction))
 
-	rsb.__defaultParticipantConfig = rsb.ParticipantConfig.fromDefaultSources()
+def initialize_ipaaca_rsb_if_needed():
+	'''Register own RSB Converters and initialise RSB from default config file.'''
+	global __RSB_INITIALIZED
+	with __RSB_INITIALIZER_LOCK:
+		if __RSB_INITIALIZED:
+			return
+		else:
+			rsb.converter.registerGlobalConverter(
+				ipaaca.converter.IntConverter(
+					wireSchema="int32",
+					dataType=int))
+		
+			rsb.converter.registerGlobalConverter(
+				ipaaca.converter.IUConverter(
+					wireSchema="ipaaca-iu",
+					dataType=IU))
+		
+			rsb.converter.registerGlobalConverter(
+				ipaaca.converter.MessageConverter(
+					wireSchema="ipaaca-messageiu",
+					dataType=Message))
+		
+			rsb.converter.registerGlobalConverter(
+				ipaaca.converter.IULinkUpdateConverter(
+					wireSchema="ipaaca-iu-link-update",
+					dataType=converter.IULinkUpdate))
+		
+			rsb.converter.registerGlobalConverter(
+				ipaaca.converter.IUPayloadUpdateConverter(
+					wireSchema="ipaaca-iu-payload-update",
+					dataType=converter.IUPayloadUpdate))
+		
+			rsb.converter.registerGlobalConverter(
+				rsb.converter.ProtocolBufferConverter(
+					messageClass=ipaaca_pb2.IUCommission))
+		
+			rsb.converter.registerGlobalConverter(
+				rsb.converter.ProtocolBufferConverter(
+					messageClass=ipaaca_pb2.IUResendRequest))
+		
+			rsb.converter.registerGlobalConverter(
+				rsb.converter.ProtocolBufferConverter(
+					messageClass=ipaaca_pb2.IURetraction))
+		
+			rsb.__defaultParticipantConfig = rsb.ParticipantConfig.fromDefaultSources()
 
-# Initialise module
-initialize_ipaaca_rsb()
+			__RSB_INITIALIZED = True
diff --git a/ipaacalib/python/src/ipaaca/buffer.py b/ipaacalib/python/src/ipaaca/buffer.py
index ff6bacf..6a40834 100644
--- a/ipaacalib/python/src/ipaaca/buffer.py
+++ b/ipaacalib/python/src/ipaaca/buffer.py
@@ -157,6 +157,7 @@ class Buffer(object):
 		participant_config -- RSB configuration
 		'''
 		super(Buffer, self).__init__()
+		ipaaca.initialize_ipaaca_rsb_if_needed()
 		self._owning_component_name = owning_component_name
 		self._channel = channel if channel is not None else ipaaca.defaults.IPAACA_DEFAULT_CHANNEL
 		self._participant_config = rsb.ParticipantConfig.fromDefaultSources() if participant_config is None else participant_config
-- 
GitLab