2013-04-11 120 views
1

我想在python腳本中使用C模塊,所以當代碼到達PyEval_Callobject時調用程序崩潰/關閉。當調用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。

我在代碼中有什麼可疑的事情嗎? 在此先感謝。

+0

看不到任何明顯的東西。當通過調試器運行指針時,指針看起來是否有效,並且/或者您是否嘗試使用valgrind或類似方法來檢查內存損壞?你可以嘗試的一個快速的方法是暫時刪除'Py_ [X] DECREFs',看看它是否能夠防止崩潰,儘管你最終可能會泄漏內存。 – Aya 2013-04-11 13:59:32

+0

什麼是崩潰堆棧跟蹤? – ulidtko 2013-04-11 14:52:40

回答

0

我找到了根本原因。 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); 
相關問題