Kami mempelajari mesin VoIP Mediastreamer2. Bagian 12

Materi artikel diambil dari saluran zen saya .



Dalam artikel terakhir , saya berjanji untuk mempertimbangkan masalah memperkirakan beban pada ticker dan cara-cara untuk menangani beban komputasi yang berlebihan di streamer media. Tetapi saya memutuskan bahwa akan lebih logis untuk membahas masalah debugging filter kerajinan yang terkait dengan pemindahan data dan baru kemudian mempertimbangkan masalah optimisasi kinerja.


Filter kerajinan debug


Setelah kami memeriksa mekanisme untuk memindahkan data dalam streamer media di artikel sebelumnya, akan logis untuk berbicara tentang bahaya yang mengintai di dalamnya. Salah satu fitur dari prinsip "aliran data" adalah bahwa alokasi memori dari tumpukan terjadi di filter yang terletak di sumber aliran data, dan filter yang terletak di ujung jalur aliran membuat memori bebas dan kembali ke tumpukan. Selain itu, pembuatan data baru dan penghancurannya dapat terjadi di suatu tempat di titik tengah. Dalam kasus umum, membebaskan memori dilakukan oleh filter yang salah yang menciptakan blok data.


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


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

, , . .


, . , , .


Pada artikel berikutnya, kami akan mempertimbangkan masalah memperkirakan beban pada ticker dan cara-cara untuk menangani beban komputasi yang berlebihan di streamer media.


All Articles