Wir untersuchen die Mediastreamer2 VoIP-Engine. Teil 12

Artikelmaterial aus meinem Zen-Kanal .



Im letzten Artikel habe ich versprochen, das Problem der Schätzung der Belastung des Tickers und Möglichkeiten zum Umgang mit übermäßiger Rechenlast im Medienstreamer zu berücksichtigen. Ich entschied jedoch, dass es logischer wäre, die Debugging-Probleme von Craft-Filtern im Zusammenhang mit dem Verschieben von Daten zu behandeln und erst dann Probleme mit der Leistungsoptimierung zu berücksichtigen.


Debuggen von Craft-Filtern


Nachdem wir in einem früheren Artikel den Mechanismus zum Verschieben von Daten in einem Media-Streamer untersucht haben, wäre es logisch, über die darin lauernden Gefahren zu sprechen. Eines der Merkmale des "Datenfluss" -Prinzips besteht darin, dass die Zuweisung von Speicher aus dem Heap in den Filtern erfolgt, die sich an der Quelle des Datenstroms befinden, und die Filter am Ende des Stream-Pfads den Speicher frei machen und zum Heap zurückkehren. Darüber hinaus kann die Erstellung neuer Daten und deren Zerstörung irgendwo an Zwischenpunkten erfolgen. Im allgemeinen Fall wird das Freigeben des Speichers durch den falschen Filter ausgeführt, der den Datenblock erstellt hat.


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


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

, , . .


, . , , .


Im nächsten Artikel werden wir uns mit dem Problem der Schätzung der Belastung des Tickers und Möglichkeiten zum Umgang mit übermäßiger Rechenlast im Media Streamer befassen.


All Articles