2013-04-11 3 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); 
    } 
} 

파이썬 측면 : 내가 ARM로 이동 한 때 우분투 데스크탑 플랫폼과의 작업에이 코드를 테스트하지만, 한

def on_inactivity(): 
    print 'inactivity' 

register_inactivity_callback(on_inactivity) 

는, 프로그램이 시작 충돌/PyEval_CallingObject를 닫습니다.

내가 코드에서 수행하고있는 의심스러운 항목이 있습니까? 미리 감사드립니다.

+0

명백한 것을 볼 수 없습니다. 디버거를 통해 포인터를 실행하거나 valgrind 또는 유사한 방법을 사용하여 메모리 손상 여부를 확인하려고했을 때 포인터가 올바로 보이나요? 여러분이 시도 할 수있는 가장 빠른 방법은 일시적으로'Py_ [X] DECREFs'를 제거하고 메모리가 누출 될 수 있음에도 충돌을 방지 할 수 있는지 확인하는 것입니다. – Aya

+0

크래시의 스택 추적은 무엇입니까? – ulidtko

답변

0

근본 원인을 찾았습니다. PyEval_CallObject 함수는 PyGILState_Ensure/Release 함수에 의해 래핑되어야합니다. http://docs.python.org/2/c-api/init.html (비 파이썬이 작성한 스레드)을 참조하십시오.

gstate = PyGILState_Ensure(); 
PyEval_CallObject(inactivity_callback, arglist); 
PyGILState_Release(gstate); 
관련 문제