2626# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2727# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828
29- from abc import ABC , abstractmethod
3029import logging
30+ from collections import defaultdict
31+ from abc import ABC , abstractmethod
3132
3233from cqc .cqcHeader import (
3334 CQCCmdHeader ,
@@ -152,43 +153,44 @@ def __init__(self, factory):
152153
153154 # Convenience
154155 self .name = factory .name
155- self .return_messages = [] # List of all cqc messages to return
156+ self .return_messages = defaultdict ( list ) # Dictionary of all cqc messages to return per app_id
156157
157158 @inlineCallbacks
158159 def handle_cqc_message (self , header , message , transport = None ):
159160 """
160161 This calls the correct method to handle the cqcmessage, based on the type specified in the header
161162 """
162- self .return_messages = []
163+ self .return_messages [ header . app_id ] = []
163164 if header .tp in self .messageHandlers :
164165 try :
165166 should_notify = yield self .messageHandlers [header .tp ](header , message )
166167 if should_notify :
167168 # Send a notification that we are done if successful
168169 logging .debug ("CQC %s: Command successful, sent done." , self .name )
169- self .return_messages .append (
170+ self .return_messages [ header . app_id ] .append (
170171 self .create_return_message (header .app_id , CQC_TP_DONE , cqc_version = header .version ))
171172 except UnknownQubitError :
172173 logging .error ("CQC {}: Couldn't find qubit with given ID" .format (self .name ))
173- self .return_messages .append (
174+ self .return_messages [ header . app_id ] .append (
174175 self .create_return_message (header .app_id , CQC_ERR_UNKNOWN , cqc_version = header .version ))
175176 except NotImplementedError :
176177 logging .error ("CQC {}: Command not implemented yet" .format (self .name ))
177- self .return_messages .append (
178+ self .return_messages [ header . app_id ] .append (
178179 self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
179180 except Exception as err :
180181 logging .error (
181182 "CQC {}: Got the following unexpected error when handling CQC message: {}" .format (self .name , err )
182183 )
183- self .return_messages .append (
184+ self .return_messages [ header . app_id ] .append (
184185 self .create_return_message (header .app_id , CQC_ERR_GENERAL , cqc_version = header .version ))
185186 else :
186187 logging .error ("CQC %s: Could not find cqc type %d in handlers." , self .name , header .yp )
187- self .return_messages .append (
188+ self .return_messages [ header . app_id ] .append (
188189 self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
189190
190- def retrieve_return_messages (self ):
191- return self .return_messages
191+ def retrieve_return_messages (self , app_id ):
192+ """Retrieve the return messages of a given app_id"""
193+ return self .return_messages [app_id ]
192194
193195 @staticmethod
194196 def create_return_message (app_id , msg_type , length = 0 , cqc_version = CQC_VERSION ):
@@ -278,13 +280,13 @@ def _process_command(self, cqc_header, length, data, is_locked=False):
278280 if cmd .instr not in self .commandHandlers :
279281 logging .debug ("CQC {}: Unknown command {}" .format (self .name , cmd .instr ))
280282 msg = self .create_return_message (cqc_header .app_id , CQC_ERR_UNSUPP , cqc_version = cqc_header .version )
281- self .return_messages .append (msg )
283+ self .return_messages [ cqc_header . app_id ] .append (msg )
282284 return False , 0
283285 try :
284286 succ = yield self .commandHandlers [cmd .instr ](cqc_header , cmd , xtra )
285287 except NotImplementedError :
286288 logging .error ("CQC {}: Command not implemented yet" .format (self .name ))
287- self .return_messages .append (
289+ self .return_messages [ cqc_header . app_id ] .append (
288290 self .create_return_message (cqc_header .app_id , CQC_ERR_UNSUPP , cqc_version = cqc_header .verstion ))
289291 return False , 0
290292 except Exception as err :
@@ -294,7 +296,7 @@ def _process_command(self, cqc_header, length, data, is_locked=False):
294296 )
295297 )
296298 msg = self .create_return_message (cqc_header .app_id , CQC_ERR_GENERAL , cqc_version = cqc_header .version )
297- self .return_messages .append (msg )
299+ self .return_messages [ cqc_header . app_id ] .append (msg )
298300 return False , 0
299301 if succ is False : # only if it explicitly is false, if succ is None then we assume it went fine
300302 return False , 0
@@ -319,7 +321,7 @@ def _process_command(self, cqc_header, length, data, is_locked=False):
319321 "CQC {}: Got the following unexpected error when process commands: {}" .format (self .name , err )
320322 )
321323 msg = self .create_return_message (cqc_header .app_id , CQC_ERR_GENERAL , cqc_version = cqc_header .version )
322- self .return_messages .append (msg )
324+ self .return_messages [ cqc_header . app_id ] .append (msg )
323325 return False , 0
324326
325327 should_notify = should_notify or retNotify
@@ -340,7 +342,7 @@ def handle_factory(self, header, data):
340342 # Get factory header
341343 if len (data ) < header .length :
342344 logging .debug ("CQC %s: Missing header(s) in factory" , self .name )
343- self .return_messages .append (
345+ self .return_messages [ header . app_id ] .append (
344346 self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
345347 return False
346348 fact_header = CQCFactoryHeader (data [:fact_l ])
@@ -363,7 +365,7 @@ def handle_factory(self, header, data):
363365 logging .error (
364366 "CQC {}: Got the following unexpected error when processing factory: {}" .format (self .name , err )
365367 )
366- self .return_messages .append (
368+ self .return_messages [ header . app_id ] .append (
367369 self .create_return_message (header .app_id , CQC_ERR_GENERAL , cqc_version = header .version ))
368370 return False
369371
0 commit comments