파이썬 바인딩을 위한 툴을 찾을때
boost::python 과 swig 를 놓고 고민하다가
swig 를 고르지 못한 이유는 메모릭 릭이 있다는 소문 때문이었습니다.

crtdbg 로 돌려보니 정말 메모리 릭이 있더군요 (-_-);

프로그램 실행도중 딱 한번만 할당 되는 부분이라
그다지 심각한 메모리릭은 아니지만 일단 찜찜해서 수정하는 코드를 만들어보았습니다.


SWIG_CLIENT_DATA_LEAK_CODE = """SWIGRUNTIME void
PySwigClientData_Del(PySwigClientData* data)
{
Py_XDECREF(data->newraw);
Py_XDECREF(data->newargs);
Py_XDECREF(data->destroy);
}"""


SWIG_CLIENT_DATA_SAFE_CODE = """SWIGRUNTIME void
PySwigClientData_Del(PySwigClientData* data)
{
Py_XDECREF(data->newraw);
Py_XDECREF(data->newargs);
Py_XDECREF(data->destroy);
free(data);
}"""

SWIG_GLOBALS_LEAK_CODE = """SWIGRUNTIME void
SWIG_Python_DestroyModule(void *vptr)
{
swig_module_info *swig_module = (swig_module_info *) vptr;
swig_type_info **types = swig_module->types;
size_t i;
for (i =0; i < swig_module->size; ++i) {
swig_type_info *ty = types[i];
if (ty->owndata) {
PySwigClientData *data = (PySwigClientData *) ty->clientdata;
if (data) PySwigClientData_Del(data);
}
}
Py_DECREF(SWIG_This());
}
"""

SWIG_GLOBALS_SAFE_CODE = """SWIGINTERN PyObject * SWIG_globals(void);
SWIGRUNTIME void
SWIG_Python_DestroyModule(void *vptr)
{
swig_module_info *swig_module = (swig_module_info *) vptr;
swig_type_info **types = swig_module->types;
size_t i;
for (i =0; i < swig_module->size; ++i) {
swig_type_info *ty = types[i];
if (ty->owndata) {
PySwigClientData *data = (PySwigClientData *) ty->clientdata;
if (data) PySwigClientData_Del(data);
}
}
Py_DECREF(SWIG_globals());
Py_DECREF(SWIG_This());
}
"""

def Fix(path):
print path
code = open(path).read()
code = code.replace(SWIG_CLIENT_DATA_LEAK_CODE, SWIG_CLIENT_DATA_SAFE_CODE)
code = code.replace(SWIG_GLOBALS_LEAK_CODE, SWIG_GLOBALS_SAFE_CODE)
open(path, "w").write(code)

if "__main__" == __name__:
import sys
if len(sys.argv) >= 2:
Fix(sys.argv[1])


swig.exe 실행후 나온 출력 파일을 인자로 코드를 수정해주는 스크립트입니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/02/08 16:50 2009/02/08 16:50