From 7fe16da96f86fe39f3524c91226916975d112c9f Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 25 Mar 2021 06:50:11 -0700 Subject: vm: allow signals during vm execution. I have experimented with several approaches, and found that this one has an immeasurably small effect on performance, below the noise floor. * vm.c (vm_jmp): Call sig_check_fast whenever there is a backwards branch. (vm_execute): Check for signals once, on entry. --- vm.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/vm.c b/vm.c index 3fc03d68..da06d156 100644 --- a/vm.c +++ b/vm.c @@ -670,7 +670,10 @@ NOINLINE static void vm_movrr(struct vm *vm, vm_word_t insn) static void vm_jmp(struct vm *vm, vm_word_t insn) { - vm->ip = vm_insn_bigop(insn); + unsigned ip = vm_insn_bigop(insn); + if (ip < vm->ip) + sig_check_fast(); + vm->ip = ip; } NOINLINE static void vm_if(struct vm *vm, vm_word_t insn) @@ -944,6 +947,8 @@ NOINLINE static void vm_close(struct vm *vm, vm_word_t insn) NOINLINE static val vm_execute(struct vm *vm) { + sig_check_fast(); + for (;;) { vm_word_t insn = vm->code[vm->ip++]; vm_op_t opcode = vm_insn_opcode(insn); -- cgit v1.2.3