Exec cycle limit

This commit is contained in:
2026-04-24 14:42:32 +03:00
parent c907d45763
commit 14b005dbb3
4 changed files with 24 additions and 2 deletions

View File

@@ -11,4 +11,5 @@ enum ExecPrompt: byte {
table ExecCtrlMessage {
prompt: ExecPrompt;
tick_count: uint64 = 0; // 0 = run indefinitely, >0 = auto-pause after N ticks
}

View File

@@ -27,6 +27,7 @@ typedef struct {
uint8_t* resetRequest;
uint8_t* emulState;
uint64_t* clockCounter;
uint64_t* tickTarget; // 0 = run indefinitely, >0 = auto-pause at this tick
LinkedListEntry** clientsHead;
uint8_t* utilizedFlag;
OutgoingBuffers* outBufs;

View File

@@ -480,6 +480,7 @@ int main(int argc, char** argv)
LinkedListEntry* clientsLinkedListHead = NULL;
uint64_t clockCounter = 0;
uint64_t tickTarget = 0;
uint8_t resetRequest = 0;
uint8_t utilizedFlag = 0;
@@ -487,6 +488,7 @@ int main(int argc, char** argv)
&resetRequest,
&emulState,
&clockCounter,
&tickTarget,
&clientsLinkedListHead,
&utilizedFlag,
&outBufs,
@@ -746,6 +748,15 @@ int main(int argc, char** argv)
clockCounter++;
if(tickTarget > 0 && clockCounter >= tickTarget)
{
tickTarget = 0;
emulState = EMUL_STATE_PAUSE;
size_t notify_len;
uint8_t* notify_msg = fb_build_exec_notify(0, clockCounter, EMUL_STATE_PAUSE, &notify_len);
broadcastClients(&emulContext, notify_msg, notify_len);
}
if(emulContext.simRateLimit > 0)
{
lastTickAt = getCurrentUsec();

View File

@@ -51,8 +51,11 @@ void handleIncomingCtrlMessage(
hmmmm_ctrl_exec_ExecPrompt_enum_t prompt =
hmmmm_ctrl_exec_ExecCtrlMessage_prompt(exec);
uint64_t tick_count =
hmmmm_ctrl_exec_ExecCtrlMessage_tick_count(exec);
printf("[CTRL/EXEC] prompt=%s\n", hmmmm_ctrl_exec_ExecPrompt_name(prompt));
printf("[CTRL/EXEC] prompt=%s tick_count=%lu\n",
hmmmm_ctrl_exec_ExecPrompt_name(prompt), tick_count);
uint8_t state_op = prompt_to_state_op(prompt);
if (state_op == 0) {
@@ -69,6 +72,12 @@ void handleIncomingCtrlMessage(
*emulContext->emulState = new_state;
printf("[CTRL/EXEC] state -> %u\n", new_state);
if (new_state == EMUL_STATE_EXEC && tick_count > 0) {
*emulContext->tickTarget = *emulContext->clockCounter + tick_count;
} else if (new_state == EMUL_STATE_EXEC) {
*emulContext->tickTarget = 0;
}
size_t msg_len;
uint8_t* out = fb_build_exec_notify(0, *emulContext->clockCounter, new_state, &msg_len);
broadcastClients(emulContext, out, msg_len);