From fa67393723ace1ad801ce33a55763264d85a74d6 Mon Sep 17 00:00:00 2001 From: Mid <> Date: Sat, 6 Sep 2025 15:06:03 +0300 Subject: [PATCH] threads.run --- main.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/main.c b/main.c index 49aa261..da83640 100644 --- a/main.c +++ b/main.c @@ -78,6 +78,34 @@ static size_t threads_parallel(LVM *lvm, void *ud, size_t argn, set_LValueU *hea return 0; } +struct ThreadsRunCtx { + LVM *L; + LFunc *func; +}; +static int threads_run_worker(void *arg) { + struct ThreadsRunCtx *ctx = arg; + + LRegSet regs = {}; + lvm_reset_regs(®s); + lvm_run(ctx->L, ctx->func, 0, ®s); + + free(ctx); + + return 0; +} +static size_t threads_run(LVM *lvm, void *ud, size_t argn, set_LValueU *heap, LRegSet *regset) { + LFunc *func = (LFunc*) (regset->regs[0].u & ~LTAG_MASK); + + struct ThreadsRunCtx *ctx = calloc(1, sizeof(*ctx)); + ctx->L = lvm; + ctx->func = func; + + thrd_t thrd; + thrd_create(&thrd, threads_run_worker, ctx); + + return 0; +} + static char* read_full_file(const char *fn) { FILE *f = fn ? fopen(fn, "rb") : stdin; fseek(f, 0, SEEK_END); @@ -112,6 +140,9 @@ int main(int argc, char **argv) { ltable_set(threads, lvalue_from_string(lstring_newz("parallel")), lvalue_from_func(lvm_func_from_native(threads_parallel, NULL))); + ltable_set(threads, + lvalue_from_string(lstring_newz("run")), + lvalue_from_func(lvm_func_from_native(threads_run, NULL))); } ltable_set(env, lvalue_from_string(lstring_newz("threads")),