Stefan Krah <stefan-use...@bytereef.org> added the comment: I've verified the leak manually. The cause is that global variables in unicodeobject.c, e.g. free_list, are used before _PyUnicode_Init() is called. Later on _PyUnicode_Init() sets these variables to NULL, losing the allocated memory.
Here is an example of the earliest use of free_list during _Py_ReadyTypes (), well before _PyUnicode_Init(): Breakpoint 1, unicode_dealloc (unicode=0x1b044c0) at Objects/unicodeobject.c:392 392 switch (PyUnicode_CHECK_INTERNED(unicode)) { (gdb) bt #0 unicode_dealloc (unicode=0x1b044c0) at Objects/unicodeobject.c:392 #1 0x000000000044fc69 in PyUnicode_InternInPlace (p=0x7fff303852b8) at Objects/unicodeobject.c:9991 #2 0x000000000044fed3 in PyUnicode_InternFromString (cp=0x568861 "__len__") at Objects/unicodeobject.c:10025 #3 0x00000000004344d0 in init_slotdefs () at Objects/typeobject.c:5751 #4 0x0000000000434840 in add_operators (type=0x7be260) at Objects/typeobject.c:5905 #5 0x000000000042eec8 in PyType_Ready (type=0x7be260) at Objects/typeobject.c:3810 #6 0x000000000042edfc in PyType_Ready (type=0x7bde60) at Objects/typeobject.c:3774 #7 0x000000000041aa5f in _Py_ReadyTypes () at Objects/object.c:1514 #8 0x00000000004992ff in Py_InitializeEx (install_sigs=1) at Python/pythonrun.c:232 #9 0x000000000049957f in Py_Initialize () at Python/pythonrun.c:321 #10 0x00000000004b289f in Py_Main (argc=1, argv=0x1afa010) at Modules/main.c:590 #11 0x0000000000417dcc in main (argc=1, argv=0x7fff30385758) at ./Modules/python.c:59 (gdb) n 411 if (PyUnicode_CheckExact(unicode) && (gdb) 414 if (unicode->length >= KEEPALIVE_SIZE_LIMIT) { (gdb) 419 if (unicode->defenc) { (gdb) 423 *(PyUnicodeObject **)unicode = free_list; (gdb) n 424 free_list = unicode; (gdb) n 425 numfree++; (gdb) n 411 if (PyUnicode_CheckExact(unicode) && A possible fix could be to initialize the globals right at the start in main.c. Note that there are still several Unicode API functions in main.c before PyType_Ready has been called on the Unicode type. With the patch, Valgrind does not show the leak any longer. ---------- keywords: +patch priority: normal -> high stage: -> patch review title: Memory leak (r70459) -> Initialization of globals in unicodeobject.c Added file: http://bugs.python.org/file19336/unicode_init_globals.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue10156> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com