26
26
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
27
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
28
29
- from abc import ABC , abstractmethod
30
29
import logging
30
+ from collections import defaultdict
31
+ from abc import ABC , abstractmethod
31
32
32
33
from cqc .cqcHeader import (
33
34
CQCCmdHeader ,
@@ -152,43 +153,44 @@ def __init__(self, factory):
152
153
153
154
# Convenience
154
155
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
156
157
157
158
@inlineCallbacks
158
159
def handle_cqc_message (self , header , message , transport = None ):
159
160
"""
160
161
This calls the correct method to handle the cqcmessage, based on the type specified in the header
161
162
"""
162
- self .return_messages = []
163
+ self .return_messages [ header . app_id ] = []
163
164
if header .tp in self .messageHandlers :
164
165
try :
165
166
should_notify = yield self .messageHandlers [header .tp ](header , message )
166
167
if should_notify :
167
168
# Send a notification that we are done if successful
168
169
logging .debug ("CQC %s: Command successful, sent done." , self .name )
169
- self .return_messages .append (
170
+ self .return_messages [ header . app_id ] .append (
170
171
self .create_return_message (header .app_id , CQC_TP_DONE , cqc_version = header .version ))
171
172
except UnknownQubitError :
172
173
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 (
174
175
self .create_return_message (header .app_id , CQC_ERR_UNKNOWN , cqc_version = header .version ))
175
176
except NotImplementedError :
176
177
logging .error ("CQC {}: Command not implemented yet" .format (self .name ))
177
- self .return_messages .append (
178
+ self .return_messages [ header . app_id ] .append (
178
179
self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
179
180
except Exception as err :
180
181
logging .error (
181
182
"CQC {}: Got the following unexpected error when handling CQC message: {}" .format (self .name , err )
182
183
)
183
- self .return_messages .append (
184
+ self .return_messages [ header . app_id ] .append (
184
185
self .create_return_message (header .app_id , CQC_ERR_GENERAL , cqc_version = header .version ))
185
186
else :
186
187
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 (
188
189
self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
189
190
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 ]
192
194
193
195
@staticmethod
194
196
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):
278
280
if cmd .instr not in self .commandHandlers :
279
281
logging .debug ("CQC {}: Unknown command {}" .format (self .name , cmd .instr ))
280
282
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 )
282
284
return False , 0
283
285
try :
284
286
succ = yield self .commandHandlers [cmd .instr ](cqc_header , cmd , xtra )
285
287
except NotImplementedError :
286
288
logging .error ("CQC {}: Command not implemented yet" .format (self .name ))
287
- self .return_messages .append (
289
+ self .return_messages [ cqc_header . app_id ] .append (
288
290
self .create_return_message (cqc_header .app_id , CQC_ERR_UNSUPP , cqc_version = cqc_header .verstion ))
289
291
return False , 0
290
292
except Exception as err :
@@ -294,7 +296,7 @@ def _process_command(self, cqc_header, length, data, is_locked=False):
294
296
)
295
297
)
296
298
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 )
298
300
return False , 0
299
301
if succ is False : # only if it explicitly is false, if succ is None then we assume it went fine
300
302
return False , 0
@@ -319,7 +321,7 @@ def _process_command(self, cqc_header, length, data, is_locked=False):
319
321
"CQC {}: Got the following unexpected error when process commands: {}" .format (self .name , err )
320
322
)
321
323
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 )
323
325
return False , 0
324
326
325
327
should_notify = should_notify or retNotify
@@ -340,7 +342,7 @@ def handle_factory(self, header, data):
340
342
# Get factory header
341
343
if len (data ) < header .length :
342
344
logging .debug ("CQC %s: Missing header(s) in factory" , self .name )
343
- self .return_messages .append (
345
+ self .return_messages [ header . app_id ] .append (
344
346
self .create_return_message (header .app_id , CQC_ERR_UNSUPP , cqc_version = header .version ))
345
347
return False
346
348
fact_header = CQCFactoryHeader (data [:fact_l ])
@@ -363,7 +365,7 @@ def handle_factory(self, header, data):
363
365
logging .error (
364
366
"CQC {}: Got the following unexpected error when processing factory: {}" .format (self .name , err )
365
367
)
366
- self .return_messages .append (
368
+ self .return_messages [ header . app_id ] .append (
367
369
self .create_return_message (header .app_id , CQC_ERR_GENERAL , cqc_version = header .version ))
368
370
return False
369
371
0 commit comments