Material do artigo retirado do meu canal zen .

No último artigo , prometi considerar a questão de estimar a carga no ticker e maneiras de lidar com a carga excessiva de computação no streamer de mídia. Mas decidi que seria mais lógico cobrir os problemas de depuração dos filtros artesanais associados à movimentação de dados e só então considerar os problemas de otimização de desempenho.
Depurando filtros de artesanato
Depois de examinarmos o mecanismo para mover dados em uma serpentina de mídia em um artigo anterior, seria lógico falar sobre os perigos à espreita nele. Um dos recursos do princípio "fluxo de dados" é que a alocação de memória do heap ocorre nos filtros localizados na origem do fluxo de dados e os filtros localizados no final do caminho do fluxo liberam a memória e retornam ao heap. Além disso, a criação de novos dados e sua destruição podem ocorrer em algum ponto em pontos intermediários. Geralmente, a liberação da memória é realizada pelo filtro errado que criou o bloco de dados.
, , , , . — , . , , — / .
, , ( ). "" "" . , . . "" , MS_TEE , . , : ms_free(). , , .. "". ( ) .
"" , . — . , . , , , "" , .
?
, top , .
, - , . , . , , ..
( ). Valgrind ( ) gcc MemorySanitizer - . , , .
, , . "" , , , . , , .
"" , , .
, . , .
. .

, F1...F4, , . , . , , N- . , MS_VOID_SOURCE. — . . .. .
, , , , "" , , . . , , . — , . - .
voidsourse:

, , , . , ( ). , . , , , "" . , . "" , . ( ). "" , .
-
. :
#ifndef iso_filter_h
#define iso_filter_h
#include <mediastreamer2/msfilter.h>
#define MY_ISO_FILTER_ID 1024
extern MSFilterDesc iso_filter_desc;
#endif
:
#include "iso_filter.h"
static void
iso_init (MSFilter * f)
{
}
static void
iso_uninit (MSFilter * f)
{
}
static void
iso_process (MSFilter * f)
{
mblk_t *im;
while ((im = ms_queue_get (f->inputs[0])) != NULL)
{
ms_queue_put (f->outputs[0], copymsg (im));
freemsg (im);
}
}
static MSFilterMethod iso_methods[] = {
{0, NULL}
};
MSFilterDesc iso_filter_desc = {
MY_ISO_FILTER_ID,
"iso_filter",
"A filter that reads from input and copy to its output.",
MS_FILTER_OTHER,
NULL,
1,
1,
iso_init,
NULL,
iso_process,
NULL,
iso_uninit,
iso_methods
};
MS_FILTER_DESC_EXPORT (iso_desc)
, , ", ". . :
OrtpMemoryFunctions reserv;
OrtpMemoryFunctions my;
reserv.malloc_fun = ortp_malloc;
reserv.realloc_fun = ortp_realloc;
reserv.free_fun = ortp_free;
my.malloc_fun = &my_malloc;
my.realloc_fun = &my_realloc;
my.free_fun = &my_free;
ortp_set_memory_functions(&my);
, , . .
, . , , .
No próximo artigo, consideraremos a questão de estimar a carga no ticker e as formas de lidar com a carga excessiva de computação na serpentina de mídia.