segfault when calling Python from C thread

Travis Berg bergt at cs.pdx.edu
Sat Feb 19 20:31:52 EST 2005


I'm running into a problem when trying to perform a callback to a Python
function from a C extension.  Specifically, the callback is being made by
a pthread that seems to cause the problem.  If I call the callback from
the parent process, it works fine.  The PyObject is static, and holds the
same value in both Parent and thread, so I'm at a loss as to what would be
different in the pthread from the parent that would cause a segfault on
the callback.  The machine specifics are an x86 intel processor with
RedHat linux.

Here is some clips of the C callback code showing how I'm storing the
callback, then what the actual callback function is like.  Any ideas?
The function being called is a simply to display the string of text, and
execution never seems to reach back to the Python code at all.

Thanks,
Travis B.


/* callback function to the Python code */
static PyObject * my_callback = NULL;

/* setting callback function */
static PyObject * my_set_callback(PyObject *dummy, PyObject *args)
{
    PyObject *result = NULL;
    PyObject *temp;
    PyObject *arglist;

    if (PyArg_ParseTuple(args, "O:set_callback", &temp)) {
        if (!PyCallable_Check(temp)) {
            PyErr_SetString(PyExc_TypeError,
				"parameter must be callable");
            return NULL;
        }
        Py_XINCREF(temp);         /* Add a reference to new callback */
        Py_XDECREF(my_callback);  /* Dispose of previous callback */
        my_callback = temp;       /* Remember new callback */
        /* return "None" */
        Py_INCREF(Py_None);
        result = Py_None;
    }
    return result;
}

/* calling callback */
void callback(char * str) {
    PyObject *arglist;
    PyObject *result;
    if(str == NULL)
        return;

    if(my_callback == NULL) {
        printf("no callback function provided, returning...\n");
        return;
    }

    /* Time to call the callback */
    arglist = Py_BuildValue("(s)", str);
    result = PyEval_CallObject(my_callback, arglist);
    Py_DECREF(arglist);
    if(result == NULL)
        return;
    Py_DECREF(result);
}



More information about the Python-list mailing list