Hi Andrew,
Users need to be extra careful using the cancel functions because
there's a potential race condition where an OK or ERROR for the command
being cancelled arrives just the same moment the next command in the
queue is being submitted, and is treated as a response to that command.
This is why this is just a really bad idea. The only one I think we should
cancel (and most vendors support reliably) is an ATD...
Are you sure your CSIM STATUS poll would actually time out or would the modem
return a +CME/+CMS error? In the end the modem does this polling itself...
@@ -1040,18 +1041,20 @@ gboolean g_at_chat_cancel(GAtChat *chat,
guint id)
if (!l)
return FALSE;
- if (l == g_queue_peek_head(chat->command_queue) &&
- chat->cmd_bytes_written > 0) {
- struct at_command *c = l->data;
+ head = l->data == g_queue_peek_head(chat->command_queue);
- /* We can't actually remove it since it is most likely
- * already in progress, just null out the callback
- * so it won't be called
- */
- c->callback = NULL;
- } else {
- at_command_destroy(l->data);
- g_queue_remove(chat->command_queue, l->data);
+ at_command_destroy(l->data);
+ g_queue_remove(chat->command_queue, l->data);
+
+ if (head) {
+ chat->cmd_bytes_written = 0;
+
+ g_slist_foreach(chat->response_lines, (GFunc)g_free, NULL);
+ g_slist_free(chat->response_lines);
+ chat->response_lines = NULL;
+
+ if (g_queue_get_length(chat->command_queue) > 0)
+ chat_wakeup_writer(chat);
Quoting V.250 5.6.1:
"Some action commands that require time to execute may be aborted while in
progress; these are explicitly noted in the description of the command.
Aborting of commands is accomplished by the transmission from the DTE to the
DCE of any character. A single character shall be sufficient to abort the
command in progress; however, characters transmitted during the first 125
milliseconds after transmission of the termination character shall be ignored
(to allow for the DTE to append additional control characters such as line
feed after the command line termination character)."
Sounds like your device's AT parser is 'not quite' compliant ;)
Regards,
-Denis