attempt fix

This commit is contained in:
2025-06-05 16:19:06 -05:00
parent 4fe78c4a63
commit 0d7be6a94e
6 changed files with 59 additions and 66 deletions

View File

@@ -11,13 +11,14 @@ var video
$_.start(e => {
if (e.type !== 'greet') return
video = e.actor
loop()
graphics = use('graphics', video)
send(video, {kind:"window", op:"makeRenderer"}, e => {
log.console("MADE A WINDOW! so now renderer")
$_.start(e => {
if (gameactor) return
gameactor = e.actor
$_.couple(gameactor)
loop()
}, args[0])
})
}, 'prosperon/sdl_video', {
@@ -100,13 +101,6 @@ var graphics
var gameactor
var last = time.number()
// FPS tracking
var fps_samples = []
var fps_sample_count = 60
var fps_sum = 0
var images = {}
// Convert high-level draw commands to low-level renderer commands
@@ -243,21 +237,19 @@ function translate_draw_commands(commands) {
function loop(time)
{
log.console("LOOP")
send(video, {kind:'input', op:'get'}, e => {
for (var event of e) {
if (event.type === 'quit')
$_.stop()
}
log.console(json.encode(e))
})
if (!gameactor) {
$_.clock(loop)
return
}
send(gameactor, {kind:'update', dt:1/60});
$_.delay(loop, 1/60);
return;
// Update the game
send(gameactor, {kind:'update', dt:1/60}, e => {
send(gameactor, {kind:'che', dt:1/60}, e => {
// Get draw commands from game
send(gameactor, {kind:'draw'}, draw_commands => {
var batch_commands = []
@@ -287,10 +279,11 @@ function loop(time)
op: "batch",
data: batch_commands
}, _ => {
$_.clock(loop)
})
})
})
$_.delay(loop, 1/30)
}
$_.receiver(e => {
@@ -304,6 +297,4 @@ $_.receiver(e => {
if (e.d_pos)
e.d_pos.y *= -1
}
send(gameactor, e)
})

View File

@@ -61,13 +61,6 @@ var default_window = {
var config = Object.assign({}, default_window, arg[0] || {});
win = new video.window(config);
log.console(win.title)
log.console(win.size)
log.console(win.visible)
log.console(win.minimized)
log.console(win.position)
win.maximized = true
// Resource tracking
var resources = {
texture: {},

View File

@@ -92,11 +92,11 @@ function disrupt(err)
var reason = (err instanceof Error) ? err.stack : err
report_to_overling({type:'disrupt', reason})
}
log.error(err)
log.console("DISRUPTING")
log.console(err);
if (err.stack)
log.console(err.stack)
actor_mod.disrupt()
}

View File

@@ -18,6 +18,19 @@
#include <stdio.h> // perror(), printf()
#include <stdlib.h> // exit()
#ifdef __APPLE__
#include <sys/types.h>
#include <sys/sysctl.h>
#endif
#ifdef _WIN32
#include <windows.h>
#endif
#if !defined(__APPLE__) && !defined(_WIN32) && !defined(__linux__)
#include <sys/ptrace.h>
#endif
#include <SDL3/SDL_atomic.h>
#define WOTA_IMPLEMENTATION
@@ -156,22 +169,6 @@ void actor_free(cell_rt *actor)
SDL_UnlockMutex(actors_mutex);
}
JSValue js_actor_remove_cb(JSContext *js, JSValue this_val, int argc, JSValue *argv)
{
cell_rt *actor = JS_GetContextOpaque(js);
if (JS_IsUndefined(actor->unneeded))
actor_free(actor);
else {
SDL_LockMutex(actor->mutex);
JSValue ret = JS_Call(actor->context, actor->unneeded, JS_UNDEFINED, 0, NULL);
uncaught_exception(actor->context, ret);
SDL_UnlockMutex(actor->mutex);
actor_free(actor);
}
return JS_UNDEFINED;
}
void js_dofree(JSRuntime *rt, void *opaque, void *ptr)
{
js_free_rt(rt, ptr);
@@ -386,6 +383,7 @@ const char *send_message(const char *id, void *msg)
l.wota_data = msg;
SDL_LockMutex(target->msg_mutex);
arrput(target->letters, l);
if (target->ar) {
remove_timer(target->ar);
@@ -406,7 +404,8 @@ static Uint32 actor_remove_cb(Uint32 id, Uint32 interval, cell_rt *actor)
uncaught_exception(actor->context, ret);
SDL_UnlockMutex(actor->mutex);
}
actor_free(actor);
actor_disrupt(actor);
return 0;
}
@@ -432,10 +431,6 @@ Uint32 actor_delay_cb(SDL_TimerID id, Uint32 interval, cell_rt *actor)
void set_actor_state(cell_rt *actor)
{
if (actor->disrupt) {
actor_free(actor);
return;
}
SDL_LockMutex(actor->msg_mutex);
switch(actor->state) {
@@ -502,10 +497,12 @@ void actor_turn(cell_rt *actor)
JS_FreeValue(actor->context, l.callback);
}
// now idle
actor->state = ACTOR_IDLE;
SDL_UnlockMutex(actor->mutex);
// now idle
SDL_LockMutex(actor->msg_mutex);
actor->state = ACTOR_IDLE;
SDL_UnlockMutex(actor->msg_mutex);
#ifdef TRACY_ENABLE
if (tracy_profiling_enabled)
@@ -625,6 +622,10 @@ void tracy_end_hook(JSContext *js, JSValue fn)
void actor_disrupt(cell_rt *crt)
{
crt->disrupt = 1;
printf("actor %s disrupted\n", crt->id);
actor_free(crt);
}
static int actor_interrupt_cb(JSRuntime *rt, cell_rt *crt)
@@ -694,7 +695,10 @@ int uncaught_exception(JSContext *js, JSValue v)
return 1;
}
printf("UNCAUGHT EXCEPTION IN ACTOR %s\n", rt->id);
JSValue exp = JS_GetException(js);
JSValue ret = JS_Call(js, rt->on_exception, JS_UNDEFINED, 1, &exp);
JS_FreeValue(js,ret);
JS_FreeValue(js, exp);
@@ -724,6 +728,8 @@ static int actor_runner(void *data)
static void signal_handler(int sig)
{
printf("SIG %d\n", sig);
exit_handler();
const char *str = NULL;
switch (sig) {
case SIGABRT: str = "SIGABRT"; break;
@@ -757,6 +763,7 @@ queue_cond = SDL_CreateCondition();
mainqueue_mutex = SDL_CreateMutex();
mainqueue_cond = SDL_CreateCondition();
actors_mutex = SDL_CreateMutex();
timer_init();
add_runners(SDL_GetNumLogicalCPUCores()-1);
@@ -889,7 +896,6 @@ int main(int argc, char **argv)
signal(SIGTERM, signal_handler);
signal(SIGSEGV, signal_handler);
signal(SIGABRT, signal_handler);
atexit(exit_handler);
loop();

View File

@@ -28,12 +28,12 @@ uint64_t get_time_ns(void)
Uint32 add_timer_ns(uint64_t delay_ns, TimerCallback callback, void *param)
{
timer_t t;
SDL_LockMutex(timer_mutex);
t.id = next_timer_id++;
t.interval_ns = delay_ns;
t.due_ns = get_time_ns() + delay_ns;
t.callback = callback;
t.param = param;
SDL_LockMutex(timer_mutex);
arrput(timers, t);
SDL_UnlockMutex(timer_mutex);
SDL_SignalCondition(mainqueue_cond);
@@ -80,18 +80,21 @@ void process_due_timers(void)
uint64_t next_timeout_ns(void)
{
SDL_LockMutex(timer_mutex);
if (!timers || arrlen(timers) == 0) {
SDL_UnlockMutex(timer_mutex);
return UINT64_MAX;
}
uint64_t min_due = UINT64_MAX;
uint64_t now = get_time_ns();
uint64_t min_due = timers[0].due_ns;
for (int i = 1; i < arrlen(timers); i++) {
if (timers[i].due_ns < min_due)
min_due = timers[i].due_ns;
SDL_LockMutex(timer_mutex);
if (timers && arrlen(timers) > 0) {
min_due = timers[0].due_ns;
for (int i = 1; i < arrlen(timers); i++) {
if (timers[i].due_ns < min_due)
min_due = timers[i].due_ns;
}
}
SDL_UnlockMutex(timer_mutex);
if (min_due == UINT64_MAX)
return UINT64_MAX;
if (min_due <= now)
return 0;
return min_due - now;

View File

@@ -406,4 +406,4 @@ log.console("Passed: " + passed);
log.console("Failed: " + failed);
log.console("\nOverall: " + (failed === 0 ? "PASSED" : "FAILED"));
os.exit(failed === 0 ? 0 : 1);
$_.stop()