So I'm almost done. Now I have a working code that calls the python callback function.
Now all I have to do is pass the argument to the python callback function.
My callback.c:
#include <stdio.h>
typedef void (*CALLBACK)(void);
CALLBACK my_callback = 0;
void set_callback(CALLBACK c);
void test(void);
void set_callback(CALLBACK c) {
my_callback = c;
}
void test(void) {
printf("Testing the callback function\n");
if (my_callback) (*my_callback)();
else printf("No callback registered\n");
}
My callback.i:
%module callback
%{
typedef void (*CALLBACK)(void);
extern CALLBACK my_callback;
extern void set_callback(CALLBACK c);
extern void my_set_callback(PyObject *PyFunc);
extern void test(void);
%}
extern CALLBACK my_callback;
extern void set_callback(CALLBACK c);
extern void my_set_callback(PyObject *PyFunc);
extern void test(void);
%{
static PyObject *my_pycallback = NULL;
static void PythonCallBack(void)
{
PyObject *func, *arglist;
PyObject *result;
func = my_pycallback;
arglist = Py_BuildValue("()");
result = PyEval_CallObject(func, arglist);
Py_DECREF(arglist);
Py_XDECREF(result);
return ;
}
void my_set_callback(PyObject *PyFunc)
{
Py_XDECREF(my_pycallback);
Py_XINCREF(PyFunc);
my_pycallback = PyFunc;
set_callback(PythonCallBack);
}
%}
%typemap(python, in) PyObject *PyFunc {
if (!PyCallable_Check($input)) {
PyErr_SetString(PyExc_TypeError, "Need a callable object!");
return NULL;
}
$1 = $input;
}
It works well. What should I do, can I pass an argument my_callback? Any help would be greatly appreciated!
source
share