LINUX.ORG.RU

Как корректно освободить ресурсы snd_pcm?

 , , ,


0

2

Простой пример:

#include <alsa/asoundlib.h>

int
main()
{
    snd_pcm_t *dev;

    snd_pcm_open(&dev, "default", SND_PCM_STREAM_PLAYBACK, 0);
    snd_pcm_close(dev);

    return 0;
}

Валгринд такой:

==20334== LEAK SUMMARY:
==20334==    definitely lost: 0 bytes in 0 blocks
==20334==    indirectly lost: 0 bytes in 0 blocks
==20334==      possibly lost: 65,525 bytes in 2,020 blocks
==20334==    still reachable: 298 bytes in 6 blocks
==20334==         suppressed: 0 bytes in 0 blocks
==20334== Reachable blocks (those to which a pointer was found) are not shown.
==20334== To see them, rerun with: --leak-check=full --show-reachable=yes
==20334== 
==20334== ERROR SUMMARY: 116 errors from 116 contexts (suppressed: 4 from 4)
--20334-- 
--20334-- used_suppression:      2 dl-hack3-cond-1
--20334-- used_suppression:      2 glibc-2.5.x-on-SUSE-10.2-(PPC)-2a
==20334== 
==20334== ERROR SUMMARY: 116 errors from 116 contexts (suppressed: 4 from 4)
Без вызова snd_pcm_close() имеем 117 errors from 117 contexts.

Эти ошибки реально мешают тестировать свой говнокод.

UPD:

Т.к. это все продолжение вот этого: Как правильно запилить звуковой буфер с кроссфейдером? то кастану наверное снова waker и i-rinat там помогли понять что к чему и тут можт помогут.

Там «possibly lost». Если переоткрывать несколько раз, то количество «ошибок» не меняется. Это скорее всего глобальные данные «libalsa».

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Там «possibly lost»

Да хоть что - мешает же длинющий высер валгринда. Свои касяки то как ловить в этой каше?

deep-purple ★★★★★ ()
Ответ на: комментарий от bj

Есть такое, уже тоже нагуглил. Но всеравно осталось:

ERROR SUMMARY: 2 errors from 2 contexts

Ладно хоть не каша.

deep-purple ★★★★★ ()

К valgrind им же самим можно сгенерировать suppression файл, чтобы известные «утечки» глаза не мозолили.

i-rinat ★★★★★ ()
Ответ на: комментарий от deep-purple
valgrind --leak-check=full --gen-suppressions=all --log-file=log ./a.out

Вытаскиваешь из лога понравившиеся блоки в фигурных скобках в отдельный файл, а потом скармливаешь при следующем запуске:

valgrind --leak-check=full --suppressions=libasound2.supp ./a.out

Но с ALSA проще snd_config_update_free_global() вставить в конце программы. С libc тоже что-то есть, но там Valgrind сам нужную функцию вызывает.

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

snd_config_update_free_global()

Обсудили выше. Не помогаэ до конца: http://paste.ofcode.org/ezCMTBPvcLP9SmYanfSv88

скармливаешь при следующем запуске

Вытащил, скормил, но супресс не влияет на показ лик суммари, там кажет те же пять потерянных. С этим что-то сделать можно?

deep-purple ★★★★★ ()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Не помогаэ до конца

Странно, у меня результат получше:

==16260== Memcheck, a memory error detector
==16260== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==16260== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==16260== Command: ./a.out
==16260== 
==16260== 
==16260== HEAP SUMMARY:
==16260==     in use at exit: 61,587 bytes in 153 blocks
==16260==   total heap usage: 2,177 allocs, 2,024 frees, 371,918 bytes allocated
==16260== 
==16260== LEAK SUMMARY:
==16260==    definitely lost: 0 bytes in 0 blocks
==16260==    indirectly lost: 0 bytes in 0 blocks
==16260==      possibly lost: 0 bytes in 0 blocks
==16260==    still reachable: 61,587 bytes in 153 blocks
==16260==         suppressed: 0 bytes in 0 blocks
==16260== Reachable blocks (those to which a pointer was found) are not shown.
==16260== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==16260== 
==16260== For counts of detected and suppressed errors, rerun with: -v
==16260== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

С этим что-то сделать можно?

Без понятия. Это надо в сам valgrind смотреть.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

А с какими флагами собираешь и запускаешь? Я так:

gcc -Wall -Werror -Wextra -W -g -lasound ./alsa.c -o ./alsa
valgrind -v --track-origins=yes --trace-children=yes --leak-check=full ./alsa

deep-purple ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.