fix actors not running correctly

This commit is contained in:
2025-06-07 23:35:47 -05:00
parent cbda7dfbc9
commit 34dcd0a235

View File

@@ -499,9 +499,8 @@ void set_actor_state(cell_rt *actor)
SDL_UnlockSpinlock(&queue_lock); SDL_UnlockSpinlock(&queue_lock);
SDL_SignalSemaphore(ready_sem); SDL_SignalSemaphore(ready_sem);
} }
} else if (!arrlen(actor->letters) && !hmlen(actor->timers)) { } else if (!arrlen(actor->letters) && !hmlen(actor->timers))
actor->ar = SDL_AddTimerNS(actor->ar_secs*1e9, actor_remove_cb, actor); actor->ar = SDL_AddTimerNS(actor->ar_secs*1e9, actor_remove_cb, actor);
}
break; break;
} }
@@ -768,7 +767,9 @@ static int actor_runner(void *data)
SDL_AddAtomicInt(&runners_count, 1); SDL_AddAtomicInt(&runners_count, 1);
while (!SDL_GetAtomicInt(&shutting_down)) { while (!SDL_GetAtomicInt(&shutting_down)) {
SDL_WaitSemaphore(ready_sem);
SDL_LockSpinlock(&queue_lock); SDL_LockSpinlock(&queue_lock);
cell_rt *actor = NULL; cell_rt *actor = NULL;
if (arrlen(ready_queue) > 0) { if (arrlen(ready_queue) > 0) {
actor = ready_queue[0]; actor = ready_queue[0];
@@ -778,9 +779,6 @@ static int actor_runner(void *data)
if (actor) if (actor)
actor_turn(actor); actor_turn(actor);
SDL_WaitSemaphore(ready_sem);
if (SDL_GetAtomicInt(&shutting_down)) break;
} }
SDL_AddAtomicInt(&runners_count, -1); SDL_AddAtomicInt(&runners_count, -1);
@@ -817,17 +815,9 @@ static void add_runners(int n)
static void loop() static void loop()
{ {
/* Initialize synchronization primitives */ int msgs = 0;
ready_sem = SDL_CreateSemaphore(0);
main_sem = SDL_CreateSemaphore(0);
actors_mutex = SDL_CreateMutex();
SDL_SetAtomicInt(&shutting_down, 0);
SDL_SetAtomicInt(&runners_count, 0);
add_runners(SDL_GetNumLogicalCPUCores());
while (!SDL_GetAtomicInt(&shutting_down)) { while (!SDL_GetAtomicInt(&shutting_down)) {
SDL_WaitSemaphore(main_sem); SDL_WaitSemaphore(main_sem);
SDL_LockSpinlock(&main_queue_lock); SDL_LockSpinlock(&main_queue_lock);
cell_rt *actor = NULL; cell_rt *actor = NULL;
if (arrlen(main_queue) > 0) { if (arrlen(main_queue) > 0) {
@@ -835,13 +825,9 @@ static void loop()
arrdel(main_queue, 0); arrdel(main_queue, 0);
} }
SDL_UnlockSpinlock(&main_queue_lock); SDL_UnlockSpinlock(&main_queue_lock);
msgs++;
if (actor) { actor_turn(actor);
printf("running %s\n", actor->id); continue;
printf("message is %d\n", actor->letters[0].type);
actor_turn(actor);
continue;
}
} }
} }
@@ -937,6 +923,17 @@ int main(int argc, char **argv)
wota_write_array(&startwota, actor_argc - 1); wota_write_array(&startwota, actor_argc - 1);
for (int i = 1; i < actor_argc; i++) for (int i = 1; i < actor_argc; i++)
wota_write_text(&startwota, actor_argv[i]); wota_write_text(&startwota, actor_argv[i]);
/* Initialize synchronization primitives */
ready_sem = SDL_CreateSemaphore(0);
main_sem = SDL_CreateSemaphore(0);
actors_mutex = SDL_CreateMutex();
SDL_SetAtomicInt(&shutting_down, 0);
SDL_SetAtomicInt(&runners_count, 0);
add_runners(SDL_GetNumLogicalCPUCores());
root_cell = create_actor(startwota.data); root_cell = create_actor(startwota.data);
/* Set up signal and exit handlers */ /* Set up signal and exit handlers */