static SCM call_callable(SCM scm_args) { SCM stack = scm_make_stack(SCM_BOOL_T, SCM_EOL); SCM frame = scm_stack_ref(stack, scm_from_int(0)); SCM proc = scm_frame_procedure(frame); PyObject *callable = scm_to_pointer(scm_assq_ref(gsubr_alist, proc)); scm_dynwind_begin(0); PyObject *py_args = scm2py(scm_args); if (py_args == NULL) py2scm_exception(); /* does not return */ scm_dynwind_py_decref(py_args); struct call_callable_data data = { callable, py_args }; PyObject *py_result = (PyObject *)scm_without_guile( (void *(*)(void *))call_callable1, &data); if (py_result == NULL) py2scm_exception(); /* does not return */ scm_dynwind_py_decref(py_result); SCM scm_result = py2scm(py_result); scm_dynwind_end(); return scm_result; }
static void* finalization_thread_proc (void *unused) { while (1) { struct finalization_pipe_data data; scm_without_guile (read_finalization_pipe_data, &data); if (data.n <= 0 && data.err != EINTR) { perror ("error in finalization thread"); return NULL; } switch (data.byte) { case 0: scm_run_finalizers (); break; case 1: return NULL; default: abort (); } } }