static int add_py_callback(unsigned int gpio, PyObject *cb_func) { struct py_callback *new_py_cb; struct py_callback *cb = py_callbacks; // add callback to py_callbacks list new_py_cb = malloc(sizeof(struct py_callback)); if (new_py_cb == 0) { PyErr_NoMemory(); return -1; } new_py_cb->py_cb = cb_func; Py_XINCREF(cb_func); // Add a reference to new callback new_py_cb->gpio = gpio; new_py_cb->next = NULL; if (py_callbacks == NULL) { py_callbacks = new_py_cb; } else { // add to end of list while (cb->next != NULL) cb = cb->next; cb->next = new_py_cb; } add_edge_callback(gpio, run_py_callbacks); return 0; }