Estudamos o mecanismo VoIP do Mediastreamer2. Parte 12

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:


, , , . , ( ). , . , , , "" . , . "" , . ( ). "" , .


-


. :


/*  iso_filter.h    . */

#ifndef iso_filter_h
#define iso_filter_h

/*   . */
#include <mediastreamer2/msfilter.h>

#define MY_ISO_FILTER_ID 1024

extern MSFilterDesc iso_filter_desc;

#endif

:


/*  iso_filter.c    . */

#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.


All Articles