Estudiamos el motor VoIP Mediastreamer2. Parte 12

Material del artículo tomado de mi canal zen .



En el último artículo , prometí considerar la cuestión de estimar la carga en el ticker y las formas de lidiar con la carga informática excesiva en el transmisor de medios. Pero decidí que sería más lógico cubrir los problemas de depuración de los filtros artesanales asociados con el movimiento de datos y solo entonces considerar los problemas de optimización del rendimiento.


Depuración de filtros artesanales


Después de examinar el mecanismo para mover datos en un transmisor de medios en un artículo anterior, sería lógico hablar sobre los peligros que acechan en él. Una de las características del principio de "flujo de datos" es que la asignación de memoria del montón se produce en los filtros ubicados en la fuente del flujo de datos, y los filtros ubicados al final de la ruta del flujo liberan la memoria y vuelven al montón. Además, la creación de nuevos datos y su destrucción puede ocurrir en algún punto intermedio. En el caso general, la liberación de la memoria se realiza mediante el filtro incorrecto que creó el bloque de datos.


, , , , . — , . , , — / .


, , ( ). "" "" . , . . "" , 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);

, , . .


, . , , .


En el próximo artículo, consideraremos la cuestión de estimar la carga en el ticker y las formas de lidiar con una carga informática excesiva en el transmisor de medios.


All Articles