Callbacks as Python function not run from C code
Ok, so I am not sure at all if this is really a bug. Maybe I am doing something wrong. This is basically the continuation of my comment at #24 (comment 564968).
So basically in GIMP, we have this struct GimpPlugInInfo
with a few callbacks as properties. I fail to just set these callbacks by just running info.init_proc = init
(where init
is a python function), which is the problem in #24 (closed).
So instead I tried to add a new C API:
void
gimp_plug_in_info_set_callbacks (GimpPlugInInfo *info,
GimpInitProc init_proc,
GimpQuitProc quit_proc,
GimpQueryProc query_proc,
GimpRunProc run_proc)
{
info->init_proc = init_proc;
info->quit_proc = quit_proc;
info->query_proc = query_proc;
info->run_proc = run_proc;
}
Then I run from Python info.set_callbacks (init, quit, query, run)
which runs fine (i.e. no crash at least).
Unfortunately then the plug-in crashes when it actually tries to run one of the callbacks.
So are we doing something wrong? Or is it not possible to set Python callbacks through GI? Callbacks are heavily used by GObject code, so this had to be made possible, no? (I see some test files about GObject signalling for instance, which uses callback, what's the difference?)
Backtrace of a crash:
Using host libthread_db library "/lib64/libthread_db.so.1".
0x00007ff604fabe02 in read () from /lib64/libpthread.so.0
Id Target Id Frame
* 1 Thread 0x7ff604c40740 (LWP 12687) "python3" 0x00007ff604fabe02 in read () from /lib64/libpthread.so.0
Thread 1 (Thread 0x7ff604c40740 (LWP 12687)):
#0 0x00007ff604fabe02 in read () at /lib64/libpthread.so.0
#1 0x00007ff5f6cc9e11 in gimp_stack_trace_print (prog_name=prog_name@entry=0x5635043a9f50 "/home/jehan/.config/GIMP/2.99/plug-ins/plop/plop.py", stream=0x7ff604e04780 <_IO_2_1_stdout_>, trace=trace@entry=0x0) at /home/jehan/dev/src//gimp/libgimpbase/../libgimpbase/gimputils.c:1300
status = -4
stack_printed = 0
gtrace = 0x0
gimp_pid = "12687\000\000\000\001\000\000\000\000\000\000"
buffer = "\000|\313\366\365\177\000\000@\366\315\366\365\177\000\000p\274\213(\377\177\000\000P\237:\004\065V\000\000\220\034\315\366\365\177\000\000\220w\216(\377\177\000\000Pw\216(\377\177\000\000D\345:\005\366\177\000\000\001", '\000' <repeats 15 times>, "Pv\216(\377\177\000\000X\201\313\366\365\177\000\000P\274\213(\377\177\000\000\236R;\005\366\177\000\000S\000\000\000\000\000\000\000\210\"\255\373", '\000' <repeats 12 times>, "\200G\340\004\366\177\000\000P\237:\004\065V\000\000B\266\065\004\065V\000\000\340X\340\004\366\177\000\000\236R;\005\366\177\000\000\000\000\000\000\000\000\000\000A\270\307\004\366\177\000\000\000\000\000\000\000\000\000\000"...
read_n = <optimized out>
sync_fd = {4, 5}
out_fd = {6, 7}
fork_pid = 12688
pid = 12687
eintr_count = 0
tid = 12687
#2 0x00007ff5f6cca270 in gimp_stack_trace_query (prog_name=0x5635043a9f50 "/home/jehan/.config/GIMP/2.99/plug-ins/plop/plop.py") at /home/jehan/dev/src//gimp/libgimpbase/../libgimpbase/gimputils.c:1470
buf = "s\n\000\000\000\000\000\000\v\000\000\000\000\000\000"
#3 0x00007ff5f673353f in gimp_plugin_sigfatal_handler (sig_num=<optimized out>) at /home/jehan/dev/src//gimp/libgimp/../libgimp/gimp.c:1985
sigset = {__val = {0 <repeats 16 times>}}
#4 0x00007ff604fad070 in <signal handler called> () at /lib64/libpthread.so.0
#5 0x00007ff5f785d77a in ffi_closure_unix64_inner (closure=0x7ff6053c8090, rvalue=0x7fff288e7710, reg_args=0x7fff288e7660, argp=0x7fff288e7730 "") at ../src/x86/ffi64.c:585
cif = 0x563504379e98
avalue = 0x7fff288bc3f0
arg_types = <optimized out>
i = <optimized out>
avn = <optimized out>
gprcount = 0
ssecount = 0
ngpr = 70958576
nsse = 22069
ret = <optimized out>
#6 0x00007ff5f785dc36 in ffi_closure_unix64 () at ../src/x86/unix64.S:229
#7 0x00007ff5f6733e76 in gimp_main (info=<optimized out>, argc=<optimized out>, argv=0x5635043abea0) at /home/jehan/dev/src//gimp/libgimp/../libgimp/gimp.c:684
basename = <optimized out>
env_string = <optimized out>
debug_string = <optimized out>
protocol_version = <optimized out>
__func__ = "gimp_main"
#8 0x00007ff5f785dace in ffi_call_unix64 () at ../src/x86/unix64.S:76
#9 0x00007ff5f785d48f in ffi_call (cif=<optimized out>, fn=<optimized out>, rvalue=<optimized out>, avalue=<optimized out>) at ../src/x86/ffi64.c:525
classes = {X86_64_INTEGER_CLASS, X86_64_NO_CLASS, 87358656, 32758}
stack = <optimized out>
argp = <optimized out>
arg_types = <optimized out>
gprcount = <optimized out>
ssecount = <optimized out>
ngpr = 1
nsse = 0
i = <optimized out>
avn = <optimized out>
ret_in_memory = <optimized out>
reg_args = <optimized out>
#10 0x00007ff5f7a6c8c5 in () at /usr/lib64/python3.7/site-packages/gi/_gi.cpython-37m-x86_64-linux-gnu.so
#11 0x00007ff5f7a6e3dc in () at /usr/lib64/python3.7/site-packages/gi/_gi.cpython-37m-x86_64-linux-gnu.so
#12 0x00007ff60516facc in _PyObject_FastCallKeywords () at /lib64/libpython3.7m.so.1.0
#13 0x00007ff6051bfdda in _PyEval_EvalFrameDefault () at /lib64/libpython3.7m.so.1.0
#14 0x00007ff60510a9f8 in _PyEval_EvalCodeWithName () at /lib64/libpython3.7m.so.1.0
#15 0x00007ff60510b903 in PyEval_EvalCodeEx () at /lib64/libpython3.7m.so.1.0
#16 0x00007ff60510b92b in PyEval_EvalCode () at /lib64/libpython3.7m.so.1.0
#17 0x00007ff6052319c2 in () at /lib64/libpython3.7m.so.1.0
#18 0x00007ff605231d57 in PyRun_FileExFlags () at /lib64/libpython3.7m.so.1.0
#19 0x00007ff605234748 in PyRun_SimpleFileExFlags () at /lib64/libpython3.7m.so.1.0
#20 0x00007ff605236531 in () at /lib64/libpython3.7m.so.1.0
#21 0x00007ff60523676c in _Py_UnixMain () at /lib64/libpython3.7m.so.1.0
#22 0x00007ff604c67413 in __libc_start_main () at /lib64/libc.so.6
#23 0x0000563503fb108e in _start ()