утечка памяти в extention

Alexandre

PHPПенсионер
утечка памяти в extention

обнаружил утечку памяти в коде
Код:
LEAK SUMMARY:
    definitely lost: 49 bytes in 5 blocks.
    possibly lost:   0 bytes in 0 blocks.
    still reachable: 5199 bytes in 9 blocks.
         suppressed: 0 bytes in 0 blocks.
PHP:
        server = gethostbyname(host);
        if (server == NULL) {
            zend_throw_exception( PHP_STORD_EXCEPTION, "Unknow host", 0 TSRMLS_CC);
            RETURN_FALSE;
        }

        bzero((char *) &serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        bcopy((char *)server->h_addr,
               (char *)&serv_addr.sin_addr.s_addr,
                server->h_length);
        serv_addr.sin_port = htons(intern->port);
это утечка системных вызовов или исп. функц gethostbyname()
ее как-то можно устранить?
 

tony2001

TeaM PHPClub
>LEAK SUMMARY:
зачем гадать по summary, если можно выяснить точный источник?

valgrind --tool=memcheck --num-callers=30 --leak-check=yes --show-reachable=yes /path/to/php /path/to/script.php
 

ys

отодвинутый новичок
> это утечка системных вызовов или исп. функц gethostbyname()

Читал про косяки с данной функцией (C API)...
Есть пара вопросов:
1. ОС (вопрос снят)
2. SMP?
 

ys

отодвинутый новичок
Alexandre

>2. SMP - что это?
Это несколько процессоров.

Помимо, того, что написал tony, есть еще такая фишка, встречается во многих пакетах для FreeBSD:

#if !defined(HAVE_GETHOSTBYNAME_R_5) && !defined(HAVE_GETHOSTBYNAME_R_6
/* Reentrant replacement for gethostbyname for BSD-based systems. */
Тут замена для gethostbyname
.....

#endif
 

Alexandre

PHPПенсионер
ys а где взять замену для gethostbyname?
дай ссылку.

сколько процессоров, скажу позже, когда приду на работу ;)
а какое это имеет значение?

-~{}~ 05.12.07 13:04:

судя по Гуглю, это FreeBSD 5.x
Да пятая ветка... какакя именно - скажу позже.
 

ys

отодвинутый новичок
> где взять замену для gethostbyname?
Если приложение не многопоточное, то оно не нужно.
Если многопоточное, то нужно дергать mutex, т.к. функция не "повторно входимая".


В mysql багтракере написали просто:

Note, the same happens with any program using functions like gethostbyname(). Functions of these family allocate some in-memory cache to make subsequent calls faster. So, vagrind reports some not-freed memory at the end of the program. But this is not really *memory leak*.
 

Alexandre

PHPПенсионер
Если приложение не многопоточное, то оно не нужно.
Если многопоточное, то нужно дергать mutex, т.к. функция не "повторно входимая".
я так понимаю, что- нет

-~{}~ 05.12.07 15:38:

OS: FreeBSD 6.2-RELEASE (GENERIC) #0: Fri Jan 12 10:40:27 UTC 2007
1 processor
 

fixxxer

К.О.
Партнер клуба
php extension по определению может выполняццо в многопоточной среде (зачем думаешь все эти извраты с TS*_CC?)

вообще же в пхп уже должна быть реентерабельная реализация gethostbyname, ни? http://ru2.php.net/gethostbyname
или там реентерабельность зендовской инфраструктурой обеспечивается, это тони лучше пускай скажет :)

-~{}~ 05.12.07 16:03:

ну и конечно это никакой не лик а кэш резолвера
 

tony2001

TeaM PHPClub
причем тут reentrant или нет?

> ну и конечно это никакой не лик а кэш резолвера

типа того.
хотя, конечно, криво это всё.
 

Alexandre

PHPПенсионер
вообще же в пхп уже должна быть реентерабельная реализация gethostbyname, ни? http://ru2.php.net/gethostbyname
PHP:
<? echo gethostbyname('phpclub.ru'); ?>
LEAK SUMMARY:
==6010== definitely lost: 49 bytes in 5 blocks.
==6010== possibly lost: 0 bytes in 0 blocks.
==6010== still reachable: 5199 bytes in 9 blocks.
==6010== suppressed: 0 bytes in 0 blocks.
 

fixxxer

К.О.
Партнер клуба
мля, один сказал про треды, я зачем то прокомментировал :) НЕ ПРИ ЧЕМ ЭТО.

резолвер выделяет память под кэш, чтобы когда ты второй раз дернешь gethostbyname с таким же параметром, отдать сразу из кэша. никакой это не лик, ОС все замечетально освободит (хотя разумеется, память выделена и явно не освобождена, валгринд сообщает. такая реализация кэша вообще спорная и с точки зрения эстетики кривая, но это уже вопрос не относящийся к делу).

про треды же я завел разговор в контексте того, что вообще говоря стандартная реализация gethostbyname нереентерабельная (не берусь утверждать насчет конкретных реализаций), и при работе в threaded mpm можно огрести неприятностей типа классической взаимоблокировки, порчи того самого статического буфера итп. просто раз уж упомянули:).
 
Сверху