2

Python スクリプトで C モジュールを使用しようとしているため、コードが PyEval_Callobject 呼び出しプログラムに到達すると、プログラムがクラッシュ/終了します。

C側コード:

    static PyObject *register_inactivity_callback(PyObject *self, PyObject *args)
{
    PyObject *temp;

    if (!PyTuple_Check(args) || PyTuple_Size(args) < 0)
    {
        fprintf(stderr, "invalid input parameter\n");
        Py_RETURN_NONE;
    }

    temp = PyTuple_GetItem(args, 0);
    if (!PyCallable_Check(temp))
    {
        fprintf(stderr, "parameter must be callable\n");
        Py_RETURN_FALSE;
    }
    Py_XINCREF(temp);
    Py_XDECREF(inactivity_callback);
    inactivity_callback = temp;

    Py_RETURN_TRUE;
}

void inactivity_callback_internal(void *arg)
{
    PyObject *arglist;
    struct input_event *event = (struct input_event *)arg;

    if (inactivity_callback && event)
    {
        arglist = Py_BuildValue("()");
        PyEval_CallObject(inactivity_callback, arglist);
        Py_DECREF(arglist);
    }
}

Python 側:

def on_inactivity():
    print 'inactivity'

register_inactivity_callback(on_inactivity)

このコードを ubuntu デスクトップ プラットフォームとその動作をテストしましたが、ARM に移行すると、プログラムが PyEval_CallingObject でクラッシュ/クローズし始めました。

コードで行っている疑わしいことはありますか? 前もって感謝します。

4

1 に答える 1

3

根本的な原因を見つけました。PyEval_CallObject 関数は PyGILState_Ensure/Release 関数でラップする必要があります。http://docs.python.org/2/c-api/init.html (Python 以外で作成されたスレッド)を参照してください。

gstate = PyGILState_Ensure();
PyEval_CallObject(inactivity_callback, arglist);
PyGILState_Release(gstate);
于 2013-04-11T16:44:39.380 に答える