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
30- from collections import defaultdict
3129import logging
30+ from collections import defaultdict
31+ from abc import ABC , abstractmethod
3232
3333from cqc .cqcHeader import (
3434 CQCCmdHeader ,
@@ -178,6 +178,7 @@ def __init__(self, factory):
178178
179179 # Convenience
180180 self .name = factory .name
181+ self .return_messages = defaultdict (list ) # Dictionary of all cqc messages to return per app_id
181182
182183 # List of all cqc messages to return
183184 self .return_messages = []
@@ -191,38 +192,38 @@ def handle_cqc_message(self, header, message, transport=None):
191192 """
192193 This calls the correct method to handle the cqcmessage, based on the type specified in the header
193194 """
194- self .return_messages = []
195-
195+ self .return_messages [header .app_id ] = []
196196 if header .tp in self .messageHandlers :
197197 try :
198198 should_notify = yield self .messageHandlers [header .tp ](header , message )
199199
200200 if should_notify :
201201 # Send a notification that we are done if successful
202202 logging .debug ("CQC %s: Command successful, sent done." , self .name )
203- self .return_messages .append (
203+ self .return_messages [ header . app_id ] .append (
204204 self .create_return_message (header .app_id , CQC_TP_DONE , cqc_version = header .version ))
205205 except UnknownQubitError :
206206 logging .error ("CQC {}: Couldn't find qubit with given ID" .format (self .name ))
207- self .return_messages .append (
207+ self .return_messages [ header . app_id ] .append (
208208 self .create_return_message (header .app_id , CQC_ERR_UNKNOWN , cqc_version = header .version ))
209209 except NotImplementedError :
210210 logging .error ("CQC {}: Command not implemented yet" .format (self .name ))
211- self .return_messages .append (
211+ self .return_messages [ header . app_id ] .append (
212212 self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
213213 except Exception as err :
214214 logging .error (
215215 "CQC {}: Got the following unexpected error when handling CQC message: {}" .format (self .name , err )
216216 )
217- self .return_messages .append (
217+ self .return_messages [ header . app_id ] .append (
218218 self .create_return_message (header .app_id , CQC_ERR_GENERAL , cqc_version = header .version ))
219219 else :
220220 logging .error ("CQC %s: Could not find cqc type %d in handlers." , self .name , header .yp )
221- self .return_messages .append (
221+ self .return_messages [ header . app_id ] .append (
222222 self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
223223
224- def retrieve_return_messages (self ):
225- return self .return_messages
224+ def retrieve_return_messages (self , app_id ):
225+ """Retrieve the return messages of a given app_id"""
226+ return self .return_messages [app_id ]
226227
227228 @staticmethod
228229 def create_return_message (app_id , msg_type , length = 0 , cqc_version = CQC_VERSION ):
@@ -315,13 +316,13 @@ def _process_command(self, cqc_header, length, data, is_locked=False):
315316 if cmd .instr not in self .commandHandlers :
316317 logging .debug ("CQC {}: Unknown command {}" .format (self .name , cmd .instr ))
317318 msg = self .create_return_message (cqc_header .app_id , CQC_ERR_UNSUPP , cqc_version = cqc_header .version )
318- self .return_messages .append (msg )
319+ self .return_messages [ cqc_header . app_id ] .append (msg )
319320 return False , 0
320321 try :
321322 succ = yield self .commandHandlers [cmd .instr ](cqc_header , cmd , xtra )
322323 except NotImplementedError :
323324 logging .error ("CQC {}: Command not implemented yet" .format (self .name ))
324- self .return_messages .append (
325+ self .return_messages [ cqc_header . app_id ] .append (
325326 self .create_return_message (cqc_header .app_id , CQC_ERR_UNSUPP , cqc_version = cqc_header .verstion ))
326327 return False , 0
327328 except Exception as err :
@@ -331,7 +332,7 @@ def _process_command(self, cqc_header, length, data, is_locked=False):
331332 )
332333 )
333334 msg = self .create_return_message (cqc_header .app_id , CQC_ERR_GENERAL , cqc_version = cqc_header .version )
334- self .return_messages .append (msg )
335+ self .return_messages [ cqc_header . app_id ] .append (msg )
335336 return False , 0
336337
337338 if succ is False : # only if it explicitly is false, if succ is None then we assume it went fine
@@ -346,7 +347,7 @@ def handle_factory(self, header, data):
346347 # Get factory header
347348 if len (data ) < header .length :
348349 logging .debug ("CQC %s: Missing header(s) in factory" , self .name )
349- self .return_messages .append (
350+ self .return_messages [ header . app_id ] .append (
350351 self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
351352 return False
352353 fact_header = CQCFactoryHeader (data [:fact_l ])
@@ -369,7 +370,7 @@ def handle_factory(self, header, data):
369370 logging .error (
370371 "CQC {}: Got the following unexpected error when processing factory: {}" .format (self .name , err )
371372 )
372- self .return_messages .append (
373+ self .return_messages [ header . app_id ] .append (
373374 self .create_return_message (header .app_id , CQC_ERR_GENERAL , cqc_version = header .version ))
374375 return False
375376
0 commit comments