threads.run
This commit is contained in:
parent
c2cd319d0c
commit
fa67393723
31
main.c
31
main.c
@ -78,6 +78,34 @@ static size_t threads_parallel(LVM *lvm, void *ud, size_t argn, set_LValueU *hea
|
|||||||
return 0;
|
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) {
|
static char* read_full_file(const char *fn) {
|
||||||
FILE *f = fn ? fopen(fn, "rb") : stdin;
|
FILE *f = fn ? fopen(fn, "rb") : stdin;
|
||||||
fseek(f, 0, SEEK_END);
|
fseek(f, 0, SEEK_END);
|
||||||
@ -112,6 +140,9 @@ int main(int argc, char **argv) {
|
|||||||
ltable_set(threads,
|
ltable_set(threads,
|
||||||
lvalue_from_string(lstring_newz("parallel")),
|
lvalue_from_string(lstring_newz("parallel")),
|
||||||
lvalue_from_func(lvm_func_from_native(threads_parallel, NULL)));
|
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,
|
ltable_set(env,
|
||||||
lvalue_from_string(lstring_newz("threads")),
|
lvalue_from_string(lstring_newz("threads")),
|
||||||
|
Loading…
Reference in New Issue
Block a user