Could I trouble you for some insight into your GI branch code? I was looking at
static void signal_func_wrapper(struct signal_data *d, gpointer go, guint n_params, const GValue *param_values, GValue *return_value) { struct signal_wrapper_context ctx = { d, n_params, param_values, return_value }; call_with_interpreter(invoke_signal_func, &ctx); }
Why call_with_interpreter instead of just invoke_signal_func(ctx)? I see it has something to do with having the interpreter lock, but what does this give you over a direct function call?
call_with_interpreter() ensures that there is a valid Pike context for the current thread. This is used to handle the case that the signal might have been triggered from some strange non-pike thread.
/grubba