diff --git a/artiq/runtime/ksupport.c b/artiq/runtime/ksupport.c index 780818dc2..3fcedfba3 100644 --- a/artiq/runtime/ksupport.c +++ b/artiq/runtime/ksupport.c @@ -475,6 +475,7 @@ void send_rpc(int service, const char *tag, ...) { struct msg_rpc_send request; + request.now = now; if(service != 0) request.type = MESSAGE_TYPE_RPC_SEND; else diff --git a/artiq/runtime/messages.h b/artiq/runtime/messages.h index 1a297d630..a3aa0a819 100644 --- a/artiq/runtime/messages.h +++ b/artiq/runtime/messages.h @@ -87,6 +87,7 @@ struct msg_watchdog_clear { struct msg_rpc_send { int type; + long long int now; int service; const char *tag; va_list args; diff --git a/artiq/runtime/session.c b/artiq/runtime/session.c index 517614e90..201c79dee 100644 --- a/artiq/runtime/session.c +++ b/artiq/runtime/session.c @@ -983,6 +983,12 @@ static int process_kmsg(struct msg_base *umsg) case MESSAGE_TYPE_RPC_BATCH: { struct msg_rpc_send *msg = (struct msg_rpc_send *)umsg; + /* + * save now in case the RPC stops the kernel + * (e.g. pause with preemption) + */ + now = msg->now; + if(!send_rpc_request(msg->service, msg->tag, msg->args)) { core_log("Failed to send RPC request (service %d, tag %s)\n", msg->service, msg->tag);