á¨á˝áá áááľ á¨á á¨á°áá°á° ááá˘
á¨ááἠáĽáá áľáá´ áá´
- á¨ááἠá ááľ dblk_t
- áááĽááľ mblk_t
- á¨áááĽááśá˝ mblk_t áá á¨ááľáŤáľ á°ááŁáŤáľ
- áá¨á áá¨á_áľ
- á¨áá¨ááá˝ queue_t áá á¨ááľáŤáľ á°ááŁáŤáľ
- ááŁáŞáŤáá˝á á áááááľ áá
- á¨ááἠáá°áľ ááŤá ááááľ ááĽáĽ
- á¨áľááááą á áľá°ááᣠá¨ááááľ ááááľ áĽáá áľáá´áá˝
- ááľ (MSBufferizer)
- á¨MSBufferizer áá áááľáŤáľ á°ááŁáŤáľ
á áá¨á¨áťá
á¨ááἠáĽáá áľáá´ áá´
á áááá áĽááá áĽá¨áľ ááľáĽ á¨ááἠáĽáá áľáá´ á¨áá¨áááá á ááá አá¨á°áááš áá¨ááá˝á á áá áá áá áá¨á_áľ. áĽáá° áááĽááľ ááĽá¨ááááá˝ mblk_t, áĽáŤáłá¸á á¨á˛ááá áááĽá áŤááŤááľ, ááá áá áá° ááłáá, áá° ááŁáŠ áááĽááľ áĽá áá° á¨ááἠáĽááłá á áááá˝ áĽáť áá¸á. á á°á¨ááŞáᣠá á°áá á ááľ á áááľ áááĽááľ áŤáá áááĽááľ á¨ááŤáááá áľ ááľá áĽááłá á á áááľ ááľá áľ áĽáááááᣠáá á á áá á á¨á°ááá á¨áááĽááľ ááááŽá˝á ááá°áŤááľ áŤáľá˝ááᢠá áĽáá°áá ááááľ áááá á¨á°áááą á¨áááĽááľ áĄáľáá áąáá áĽáááááᢠáľááá ááááá á¨áá¨á á áŤá áá á áááĽááľ ááá áá˝ááᢠmblk_t, áĽá ááááŁáľ á¨áááĽááľ tuple áŤáľ ááá áá˝áá mblk_t. áĽáŤááłááą á¨áąáá áááĽááľ á¨áŤáą á¨áááľ áłáł áĽáá ááá¨á áá˝ááᢠááá tuples áĽáá°ááŤáľááá áľáá˝ ááá°á áĽáááááŤáá.
á¨áá áĽáá°á°áááá áááĽááą áŤáą á¨áĽáá áŚá áłáł á¨áááᤠáááááľ áááá áá°á°ááá á áľ á¨ááľáłááť áŚáł á áá áĽáť áááᢠá áá ááá ááľáĽáŁ á¨áá˛áŤ áĽá¨áľ áá°áŤáŤá á á ááá ááľá á áŤááąá âMonsters, Inc.â ááľáĽ áŤááá á¨á áŠá áááá áŤáľáłááłá ᣠá áŽá˝ (á¨áá¨á áá á¨ááááá áľ - áááá˝) á áĽáĽá°áľ ááĽááľ á¨á ááľ ááááŁáá˝ áá ááááłááłá ᣠááááš áá áĽáŤáłá¸á áá¸á ᢠáĽáá áľáá´ á áᣠááá áááŠá˘
á ááᣠá¨áĽááá° á°áá¨áľ áá á ááá á¨áłá˝ áá° ááᣠá áááá áĽááá áĽá¨áľ áá°áŤáŤ ááľáĽ á¨á°áá¨ááŠáľá á¨áá¨á ááľá°ááá፠áá´áá˝ áááá á áŤááľá á áááá áĽáááá¨áľá˘
á¨ááἠáĽááł dblk_t
á¨ááἠáĽááłá áŤáľá áĽá á¨ááἠááľ áŤáŤáľáłáᢠáŤáľáá á áá¨á°áá ááá á ááááťá.
typedef struct datab
{
unsigned char *db_base; // УкаСаŃĐľĐťŃ Đ˝Đ° наŃаНО ĐąŃŃĐľŃ Đ´Đ°Đ˝Đ˝ŃŃ
.
unsigned char *db_lim; // УкаСаŃĐľĐťŃ Đ˝Đ° ĐşĐžĐ˝ĐľŃ ĐąŃŃĐľŃ Đ´Đ°Đ˝Đ˝ŃŃ
.
void (*db_freefn)(void*); // ФŃнкŃĐ¸Ń ĐžŃĐ˛ĐžĐąĐžĐśĐ´ĐľĐ˝Đ¸Ń ĐżĐ°ĐźŃŃи ĐżŃи ŃдаНонии йНОка.
int db_ref; // ĐĄŃĐľŃŃик ŃŃŃНОк.
} dblk_t;
á¨á áááአááľáŽáš á¨á áááá ááááŞáŤáŁ á¨ááŤáŁáá áá¨á¨áť áĽá á¨áá¨á ááąá á¨áá°á¨á á°ááŁá á áááá˝á ááááᢠá áááľ ááľáĽ á¨áá¨á¨áťá á áŤá db_ááŁááť - á¨ááŁááť ááŁáŞ, áᎠáá á¨á°á¨á°, áá áĽááłáá á¨áá á°á¨ áľááľáł ááá°á¨á áĽáá° ááááľ áá áŤááááá. á¨ááἠáĽááłá á á°ááŁáŠ á¨á°áá ᨠáłáłáĽ_á áá() , á¨ááŤá á¨ááἠááľ á¨áŤáľá á áá áá˛áŤáá áá° áá á°á¨ áľááľáł ááááŁá. á ááá˝ á ááá áááłáá˝, ááľ á á°áᨠáŚáł áá ááá áá˝áá. á¨áá¨á ááą á¨á˛ááá ááááá˝á ááá áá á ááŁáŞáŤáá˝ áááľáŹá°á á¨ááááááá ááἠááááá˘
á°ááŁáŠá á áá áá á¨ááἠáĽááł á á˛áľ ááłá á°ááĽáŻááĄ-
dblk_t *datab_alloc(int size);
áĽáá° á¨áá¤áľ áááŞáŤ, áĽááłá á¨ááŤá¨áá˝á áľ á¨ááἠáá á áá°á áá. á°á¨á᪠áá á°á¨ áľááľáł áŤáľá áááľááἠ- ááá á - á á°áá°á á áá á°á¨ áľááľáł ááááŞáŤ áá ááá°áŁá áłáłáĽ. ááá áá ááá˝ á°ááŁáŤáľá á˛á áá áá áááá á¨áá¨á°áľ á áá°ááᥠá á ááłááľ áááłáá˝ á¨áá¨á ááą á¨áłáł áĽáá áŤáľá á°áááś ááá áá˝ááᢠááá áá á áááĽáŠá áľ áá, ááľáŽáš á¨ááááŠá áľ ááľá áá db_base á¨ááἠá áŤáŁá˘ ááááŞáŤ áá á ááá, áĽá db_lim áĽáľá¨ áá¨á¨áťá áľá¨áľ. á¨á ááá áĽááľ db_ááŁááť áá° á ááľ á°áááĽáŻáᢠá¨ááἠááá˝ á°ááŁá á ááá áá° áᎠá°áááĽáŻáá˘
á¨áĽááľá áááááľ mblk_t
áĽáá°á°ááá¸áᣠá¨áá¨á á áŁáá˝ á áááľ áá¸áᢠmblk_tᣠáĽáá°áá¨á°áá ááááťáá˘
typedef struct msgb
{
struct msgb *b_prev; // УкаСаŃĐľĐťŃ Đ˝Đ° ĐżŃодŃĐ´ŃŃиК ŃĐťĐľĐźĐľĐ˝Ń ŃпиŃка.
struct msgb *b_next; // УкаСаŃĐľĐťŃ Đ˝Đ° ŃНодŃŃŃиК ŃĐťĐľĐźĐľĐ˝Ń ŃпиŃка.
struct msgb *b_cont; // УкаСаŃĐľĐťŃ Đ´ĐťŃ ĐżĐžĐ´ĐşĐťĐľĐšĐşĐ¸ Đş ŃООйŃĐľĐ˝Đ¸Ń Đ´ŃŃгиŃ
ŃООйŃониК, Đ´ĐťŃ ŃĐžĐˇĐ´Đ°Đ˝Đ¸Ń ĐşĐžŃŃоМа ŃООйŃониК.
struct datab *b_datap; // УкаСаŃĐľĐťŃ Đ˝Đ° ŃŃŃŃĐşŃŃŃŃ ĐąĐťĐžĐşĐ° даннŃŃ
.
unsigned char *b_rptr; // УкаСаŃĐľĐťŃ Đ˝Đ° наŃаНО ОйНаŃŃи даннŃŃ
Đ´ĐťŃ ŃŃĐľĐ˝Đ¸Ń Đ´Đ°Đ˝Đ˝ŃŃ
ĐąŃŃĐľŃĐ° b_datap.
unsigned char *b_wptr; // УкаСаŃĐľĐťŃ Đ˝Đ° наŃаНО ОйНаŃŃи даннŃŃ
Đ´ĐťŃ ĐˇĐ°ĐżĐ¸Ńи даннŃŃ
ĐąŃŃĐľŃĐ° b_datap.
uint32_t reserved1; // ĐĐ°ŃоСоŃвиŃОваннОо пОНо1, ПодиаŃŃŃĐ¸ĐźĐľŃ ĐżĐžĐźĐľŃĐ°ĐľŃ ŃŃĐ´Đ° ŃĐťŃМойнŃŃ Đ¸Đ˝ŃĐžŃПаŃиŃ.
uint32_t reserved2; // ĐĐ°ŃоСоŃвиŃОваннОо пОНо2, ПодиаŃŃŃĐ¸ĐźĐľŃ ĐżĐžĐźĐľŃĐ°ĐľŃ ŃŃĐ´Đ° ŃĐťŃМойнŃŃ Đ¸Đ˝ŃĐžŃПаŃиŃ.
#if defined(ORTP_TIMESTAMP)
struct timeval timestamp;
#endif
ortp_recv_addr_t recv_addr;
} mblk_t;
ááá á mblk_t ááááŞáŤ áá á áááá˝á ááá b_ááłá, á_ááŁá, áľáἠá¨á°ááá áááá ááá°áŤááľ á áľááá áá¸á (áá á áá¨á áá áá¨á_áľ).
á¨ááŤá á ááá áááŁá á_áááĽáá, áááĽáṠᨠtuple á áŤá á˛áá áĽáť áĽá á áá áááá. á tuple ááľáĽ ááá á¨áá¨á¨áť áááĽááľáŁ áá á áá áá áĽáá°ááá áááŤáá˘
á ááá á áá° á¨ááἠáĽááł á ááá áĽááŤáá b_áłáłááááĽááą á¨áááá áľá˘ á áĽáá áá¨á ááľ ááľáĽ ááłáá áŚáł á áááá˝ áá¨á°ááᢠááľá b_rptr á¨á áŁáá á¨á°ááá áá¨á á¨ááá áĽá áľá áŚáł ááááťáᢠááľá b_wpr áá° ááľ á¨áá˝áá áľá áŚáł áŤááááłáá˘
á¨á°ááŠáľ ááľáŽá˝ á¨á áááááľ áŁá ᪠áŤáá¸á áĽá á¨ááἠááľá°ááá፠áá´ á á áŤá áá á ááááá.
áľá áŤáá á ááľ áááĽááľ á¨áá
á áłá˝ á áᢠm1 áĽá á¨ááἠáĽááł d1.
á¨áá¨á°áá ááľá á¨áśáľáľ áááĽááśá˝á áľáĽáľáĽ áŤáłáŤá m1, m1_1, m1_2.
á¨áááĽááľ áááŞáŤ á°ááŁáŤáľ mblk_t
á á˛áľ áááĽááľ mblk_t á á°ááŁáŠ á¨á°áá á¨áĄ-
mblk_t *allocb(int size, int pri);
á áľááł ááľáĽ á á˛áľ áááĽááľ á áľáááŁáá˝á˘ mblk_t á¨á°á áá°á áá á á¨ááἠáĽááł áá ááááá°á áááá - pri á áá á¨á¤á°-áá˝áááľ áľáŞáľ ááľáĽ áĽá á áá á áááá. áᎠáá ááá¨áľ á áá áľá˘ á°ááŁáŠ á áá°áŤá áľ áá áá á°á¨ áľááľáł áá á˛áą áááĽááľ ááá á ááá°áŁá áĽá á°ááŁáŠ áá áŤá mblk_init(), áá á á¨á°áá ᨠááá áá áááá ááľáŽá˝ áĽáá°áá áŤáľáááŤá áĽá á¨ááŤá á¨áá á¨á°á ááąáľá á áá áá áłáłáĽ_á áá()ᣠá¨ááἠááľ áááĽáŤáᢠá¨á፠á áá á ááá አááľáĽ áŤááľ ááľáŽá˝ ááááŤá-
mp->b_datap=datab;
mp->b_rptr=mp->b_wptr=datab->db_base;
mp->b_next=mp->b_prev=mp->b_cont=NULL;
á áá¤áą áá á á˛áľ áááĽááľ á¨á°ááአááľáŽá˝ áĽá áŁáś á¨ááἠááľ áá°áá°ááᢠáá° áááĽááľ ááἠááá¨á áá° á¨ááἠááá ááľ áá áłáľ áŤáľáááááłááĄ-
memcpy(msg->b_rptr, data, size);
á¨áľ áá¨á á¨ááἠááá á áá áá, áĽá áá - áá áá¸á.
á¨á፠á áááá áá° ááá፠ááĽáĄ áááá áŤáľáááááłá áľááá
á ááľ ááľáĽ ááłáá á¨áá áŚáł ááááŞáŤ áĽáá°áá áá ááá-
msg->b_wptr = msg->b_wptr + size
áŤá ááľ áááĽááľ ááá á á¨áááᣠáłááááĽáĄáŁ á¨á፠á°ááŁáŠá áá áááĄ-
mblk_t *esballoc(uint8_t *buf, int size, int pri, void (*freefn)(void*));
á°ááŁáŠ ᣠáááĽááąá áĽá á¨ááἠáĽááłáá á áááá á¨áá ᨠá áá á áááášá á á áľáŤáťá áá áŁáá ááἠáŤáá áŤáᢠáĄá. áĽáááŤá˘ á áá áá᳠ᣠá¨ááἠááľ á¨áłáł áááá áŤáľá ááľáŽá˝ á áá á¨ááá á áá°áá ᣠáá á¨á°ááŁáŠ áá á¨ááἠááá á˛ááĽáŠ áĽáá°áá á¨á áłáłáĽ_á áá(). áá° á°ááŁáŠ á¨á°áááá ááἠáŤáá ááľ á áá á¨á áľ áááŤáᣠááá áá á á áááá˝ áĽáá á á˛áľ á¨á°áá ᨠá¨ááἠáĽááł áŤáľá áá ááŤáŤááᣠáĽáá á áá áá á¨áľ á¨áááĽááą ááá˘
áá° á ááľ áááĽááľ mblk_t á ááŤáł á¨ááἠáĽááŽá˝ á á á°á á°á¨á°á ááŁáአáá˝ááᢠáá á¨áá¨áááá á áá¨á°áá á°ááŁá áá-
mblk_t * appendb(mblk_t *mp, const char *data, int size, bool_t pad);
mp - áá á¨ááἠáĽááł á¨áá¨ááá áľ áááĽááľ;
áá¨á - áá° áĽááłá á áá, á
áá áá° áááĽááą á¨áá¨ááá áľ;
áá - á¨ááἠáá á;
áĽááľ - á¨á°áá°á á áá
á°á¨ áľááľáł áá á á 4-áŁááľ áá°á áá ááľá°áŤá¨á áŤáá áľ áŁáá˛áŤ (ááááŤá á ááŽáá˝ áá¨áááá)á˘
á áá áŁáá á¨áááĽááľ áłáł ááľ ááľáĽ á á áŚáł áŤáᣠá á˛áą áá¨á áĽá፠áŤáá ááἠá áľá°ááᣠááá ááᢠá áááĽááľ áłáł ááľ ááľáĽ áŤáá° áá áŚáł áŤá áá, á¨ááŤá á á ááľ áá á áŤáá á á˛áľ áááĽááľ ááá áŤá áĽá ááᥠáá° ááľ áááá áŁáᢠáá á á˛áľ áááĽááľ ááᣠá ááá á áá áá á¨ááááŞáŤá áá á¨á°ááá á_áááĽáá. á áá á ááŁá áááĽááą áá° áąááááľ ááááŁá.
áá° tuple áá á¨ááἠáĽáá áá¨á á¨ááá á°ááŁáŠá áá áá áŤáľáááááłá
void msgappend(mblk_t *mp, const char *data, int size, bool_t pad);
á tuple ááľáĽ á¨áá¨á¨áťáá áááĽááľ áłáááá˝ (áĽáą á áá á_áááĽáá áŁáś áááá) áĽá ááá áááĽááľ á°ááŁáŠá áá áŤá appendb().
á°ááŁáŠá á áá áá á áááĽááľ ááá á tuple ááľáĽ áŤááá á¨ááἠáá á ááá áá˝áá-
int msgdsize(const mblk_t *mp);
á tuple ááľáĽ áŤááľá áááá áááĽááśá˝ á ááá á áĽáá፠áááĽááśá˝ á¨ááἠááľ ááľáĽ áŤááá á á ááá á¨ááἠáá á ááááłáᢠááĽáŤááłááą áááĽááľ á¨áá¨áá áá á áĽáá°áá¨á°áá áá°áááĄ-
mp->b_wptr - mp->b_rptr
áááľ áąááá˝á áááŁáá á°ááŁáŠá áá áááĄ-
mblk_t *concatb(mblk_t *mp, mblk_t *newm);
áąááá áľáááá˝á˘ newm áá° áąáá á áŤáľ mp áĽá á áááŤá˝ áá° áá¤áą tuple á¨áá¨á¨áť áááĽááľ ááááłáá˘
á áľááá á¨áá áąáá á¨á ááľ á¨ááἠáĽáá áá áá° á ááľ áááĽááľ ááá¨á áá˝áá ᣠáá á¨áá¨áááá á áá¨á°áá á°ááŁá áá-
void msgpullup(mblk_t *mp,int len);
áááá á¨áá áĽáť áá -1ᣠá¨á፠á¨á°áá°á á ááľ áá á á áŤáľ-á°á ááá°ááᢠá¨áá áĽáť á áááłá ááĽá ááᣠá¨áá áá á ááľ ááá áŤá áĽá ᨠtuple áááĽááľ ááᥠáá° áĽáą áááá áŁáᢠááľáááŤá áŤááᣠáá áłáľ áĽá፠ááááᢠᨠtuple á¨ááááŞáŤá áááĽááľ á¨á°ááłá ááἠáá á á˛áľ áá á ááľ ááá ááᢠá¨á°ááŠáľ áááááśá˝ áá°á¨áá áĽá áá á°á¨ áľááľáłá áá° ááá ááááłá.
ááá áá á˛á°áá mblk_t á áá°ááá áľ áá á¨ááἠáĽááłá á¨ááŁááť áá ፠áááľ ááľáĽ áááŁá áá () áᎠáá áááŁáᣠá¨á፠á¨ááἠááľ á¨ááłáá áá áá°á¨áá mblk_t, áá á á¨ááŤáááá°á.
á¨á á˛áľ áááĽááľ ááľáŽá˝á ááľááááĄ-
void mblk_init(mblk_t *mp);
áá° áááĽááą áá ááŤá áá¨á
mblk_t * appendb(mblk_t *mp, const char *data, size_t size, bool_t pad);
á á˛áą áá¨á á¨áááĽááľ áłáł ááľ áá áŚáł áá á¨áááŁáŁá á¨ááᣠá¨ááááá áá á áŤáá ááľ áŤáá ááĽáťá á¨á°áá ᨠáááĽááľ á¨áááĽááą áá á°áŤááá (á¨á°á¨áá¨á áááĽááľ á áá á ááááŞáŤá áááĽááľ á°ááá§á) áĽá áááĽááľ áá° áąááááľ ááá¨áŤáá˘
á ááľ á¨ááἠááŤá áá° tuple áá¨á
void msgappend(mblk_t *mp, const char *data, size_t size, bool_t pad);
á°ááŁáŠ appendb() á loop ááľáĽ áá áŤáá˘
áááľ áąáŁáá˝á á á ááľ áá á ááŁáá;
mblk_t *concatb(mblk_t *mp, mblk_t *newm);
á¨áĽááľá áááááľ newm áá á°áŤááá mp.
á¨á ááľ áá á áááĽááľ á á ááľáŤáľáĄ-
mblk_t *copyb(const mblk_t *mp);
ᨠtuple áá á á á¨ááá á¨ááἠáĽááŽá˝ áááĄ-
mblk_t *copymsg(const mblk_t *mp);
ᨠtuple ááĽá¨ áááŽá˝ á á°ááŁáŠ áááá áŁá á á ().
ááá á¨áááĽááľ á á ááá አmblk_t. á áá á ááŁá á¨ááἠáĽááłá á áá°ááá á á, ááá áá á¨ááŁááť ááŁáŞá á°á¨ááŻá db_ááŁááť:
mblk_t *dupb(mblk_t *mp);
ááá ááĽá°áľ áŤáá ᨠtuple á á ááľáŤáľá˘ á¨ááἠáĽááŽá˝ á áá°ááá áĄáᣠá¨ááŁááť ááŁáŞááťá¸á áĽáť áá¨ááŤá db_ááŁááť:
mblk_t *dupmsg(mblk_t* m);
áááá á¨áąáá áááĽááśá˝ áá° á ááľ áááĽááľ ááŤáŤááĄ-
void msgpullup(mblk_t *mp,size_t len);
áááá á¨áá áĽáť áá -1ᣠá¨á፠á¨á°áá°á á ááľ áá á á áŤáľ-á°á ááá°ááá˘
áááĽááľ á áá°á¨á ááᣠtuple:
void freemsg(mblk_t *mp);
á¨ááἠáĽááłá á¨ááŁááť áĽááľ á á ááľ áááˇáᢠáᎠá¨á°á¨á°, á¨ááἠáĽááłá áĽáá˛á áá°á¨áá.
á áááĽááľ ááá á tuple ááľáĽ áŤáá á á ááá á¨ááἠáá á áľááľá˘
size_t msgdsize(const mblk_t *mp);
á¨á°áá á áŤáľ áááĽááľ á áááŁáľ áááĄ-
mblk_t *ms_queue_peek_last (q);
á¨á ááľ áááĽááľ á¨á°áŤá ááľáŽá˝á áá° áá áááĽááľ áá áłáľ (á áĽááἠáĽááá ááľáŽá˝ á áááá áĽááá áĽá¨áą á¨áá áááŁá¸áá áŁáá˛áŤáá˝ áááá)
mblk_meta_copy(const mblk_t *source, mblk *dest);
ááłá á áá¨á_áľ
á áááá áĽááá áĽá¨áľ ááľáĽ áŤáá á¨áááĽááľ áá¨á áĽáá° áἠáľáἠá¨á°ááá áááá á°á°ááĽáŻáᢠáĽáŤááłááą á¨áááá á áŤá á¨á˛ááá ááááá˝ áá áá° á¨ááἠááá á áá ááááᢠáá° áłáł áĽááłá á áááá˝ áĽáť á á°áŤ ááááłááłá ᣠááᥠáŤáą áĽáá
áľáá´ á áᣠáá áááŤáᢠáĽáááŤá˘ áá° áĽáááą á¨áááąáľ á áááá˝ áĽáť áá¸áá˘
áá¨ááá á¨áááá˝ ááá
á áá¨á_áľá¨áá
á áłá˝ á¨ááłá¨ááĄ-
typedef struct _queue
{
mblk_t _q_stopper; /* "мОНОŃŃОК" ŃĐťĐľĐźĐľĐ˝Ń ĐžŃĐľŃоди, но ŃкаСŃĐ˛Đ°ĐľŃ Đ˝Đ° даннŃĐľ, иŃпОНŃСŃĐľŃŃŃ ŃОНŃкО Đ´ĐťŃ ŃĐżŃĐ°Đ˛ĐťĐľĐ˝Đ¸Ń ĐžŃĐľŃодŃŃ. ĐŃи иниŃиаНиСаŃии ĐžŃĐľŃоди (qinit()) огО ŃкаСаŃоНи наŃŃŃаиваŃŃŃŃ ŃĐ°Đş, ŃŃĐžĐąŃ ĐžĐ˝Đ¸ ŃкаСŃваНи на ногО ŃаПОгО. */
int q_mcount; // ĐОНиŃĐľŃŃвО ŃНоПонŃОв в ĐžŃĐľŃоди.
} queue_t;
á áááአááľá ááá - á áá _q_ááá፠*mblk_t áĽáá áá°ááĄáŁ áá° áá¨áá á¨ááááŞáŤ á áŤá (áááĽááľ) áá áááᢠááá°áá á¨ááá
á ááľá á áá¨áá ááľáĽ á¨áááĽááśá˝ ááŁáŞ ááá˘
á¨áłá˝ áŤáá ááľá q1 á¨ááŁá áá¨á áŤáłáŤá 4 áááĽááśá˝ m1, m2, m3, m4.
á¨áá¨á°áá ááľá q1 á¨ááŁá áá¨á áŤáłáŤá 4 áááĽááśá˝ m1,m2,m3,m4. áááĽááľ m2 áááľ á°á¨á᪠áááááśá˝ m2_1 áĽá m2_2 á¨áŤá ᨠtuple áŤáľ ááá˘
á¨áá¨ááá˝ queue_t áá á¨ááľáŤáľ á°ááŁáŤáľ
á¨áá¨á ááľáááŞáŤáĄ
void qinit(queue_t *q);
ááľá _q_ááá፠(á¨áá á áá "ááááŤ" áĽáá áĽáá áŤááá) á á°ááŁáŠ á°áááŻá mblk_init(), á¨áá°áá á¤ááááľ áĽá á¨áááĽáá á¤ááááľ á áá áá° áĽáŤáą ááá áá á°áľá°áŤáááá. á¨áá¨á á¤ááááľ ááŁáŞ áá° áᎠá°áááĽáŻáá˘
á á˛áľ á áŤá (áááĽááśá˝) áá¨ááĄ
void putq(queue_t *q, mblk_t *m);
á á˛áľ á áŤá m á áááአáá¨á¨áť áá á°á¨ááŻá ᣠá¨á¤ááááą á áááá˝ á°áľá°áŤááá ááááŤá ááĽáą ááŁá á áŤá áĽáá˛áá áĽá áááááŤá ááłáá á áŤá ááááᢠá¨áá¨á á¤ááááľ ááŁáŞ á°á¨ááŻáá˘
á ááľ á¤ááááľ á¨á°áá á°ááľáŽ áááŁáľáĄ
mblk_t * getq(queue_t *q);
á¨ááááŤá á áá á¨áááŁá áááĽááľ á°á°ááľáŽ áááŁáᣠáĽá á¨á¤ááááľ ááŁáŞá áááˇáᢠá¨ááááŤá á áľá°áá á áá¨áá ááľáĽ ááá ááĽá¨ áááŽá˝ á¨áá 0 ááááłáá˘
áááĽááľ áá° áá¨á á ááľááŁáľ áááĄ-
void insq(queue_t *q, mblk_t *emp, mblk_t *mp);
ááĽá mp á¨á¤ááááą á ááľ ááĽáˇá emp. á¨áá emp=0, á¨ááŤá áááĽááą áá° áá¨áá á፠áá¨ááŤá.
á¨á°áá ááá áááĽááľ á áááŁáľ áááĄ-
void remq(queue_t *q, mblk_t *mp);
á¨á¤ááááą ááŁáŞ áááˇáá˘
á áá¨áá ááľáĽ ááá á¨ááááŞáŤá á áŤá á ááá á ááá áĽáĄ-
mblk_t * peekq(queue_t *q);
á¤ááááśá˝á áĽáŤáłá¸á áĽá¨á°á¨á áááá ááĽá¨ áááŽá˝ á¨áá¨áá áá ááľáááľáĄ-
void flushq(queue_t *q, int how);
áááá áĽáá´áľ áĽá á áá á áááá. á¨áá¨á á¤ááááľ ááŁáŞ áá° áᎠá°áááĽáŻáá˘
áá° áá¨áá á¨áá¨á¨áť ááá á áá áááá ἠáááŽáĄ-
mblk_t * qlast(queue_t *q);
á¨áááĽááľ áá¨ááá˝ áá á˛á°áŠáŁ á˛á°áá áá ááá ms_queue_put(qᣠm) ááááĽááą áŁáś á áá ᣠá¨á°ááŁá áá°áśá˝á˘ ááŽááŤáá áááá ááᢠá°ááłáłá áŁá ᪠á áá ms_queue_ááŁá(qᣠm).
ááŁáŞáŤáá˝á á áááááľ áá
á¨áá á¨á°ááá¸á áá¨á á¨á ááľ ááŁáŞáŤ áá° áá ááá á¨á ááľ áá° áĽá ááŁáŞáŤáá˝ áááááśá˝á áááľá°ááá áŤááááá. ááŁáŞáŤáá˝ áĽá áááááśáťá¸á á¨áá፠ááŤá ááá°ááłáᢠá¨ááŁáŞáŤá áá¤áľ ááá áá ááľ á á ááá áá "áá" á°áĽá áá áŤá. ááŁáŞáŤáá˝ áĽááľ á áĽááłá¸á á¨á°áááá áľá á á°á á°á¨á°á ááááá˝ á¨áááá áĽááá áĽá¨áľ ᨠ"ááááľ ááĽáĽ" á˝áá°-ááłáĽ áá ááá. á¨á˛ááá ááĽáĽ ááá á áá _MSCP á áĽá¨ááŁáŞáŤáá á áá áĽá á¨á ááąá áá ááĽá á¨áŤáᤠá áá áá°á¨áľ á¨ááŁáŞáŤáá ááĽá áľ ááá áá ááľ á¨á ááąá áááááľ ááááťáá˘
á¨ááἠáá°áľ ááŤá ááááľ ááĽáĽ
typedef struct _MSCPoint{
struct _MSFilter *filter; // УкаСаŃĐľĐťŃ Đ˝Đ° ŃиНŃŃŃ ĐźĐľĐ´Đ¸Đ°ŃŃŃиПоŃĐ°.
int pin; // ĐĐžĐźĐľŃ ĐžĐ´Đ˝ĐžĐłĐž иС вŃ
ОдОв иНи вŃŃ
ОдОв ŃиНŃŃŃĐ°, Ń.Đľ. пин.
} MSCPoint;
á¨ááŁáŞáŤ ááá˝ á¨áᎠááᎠá¨á°áá አáá¸áá˘
á¨áááľ áá áááááľ á áááĽááľ áá¨á á ááá አááááťáᢠ_MSQueueá¨áááĽááľ áá¨á áĽá á áááá˝á áá°ááŤáááá¸á áááľ á¨ááááľ ááĽáŚá˝ á¨áŤááĄ-
typedef struct _MSQueue
{
queue_t q;
MSCPoint prev;
MSCPoint next;
}MSQueue;
áá áá ááá á á¨á˛ááá áááá áĽáááááᢠáĽáŤááłááą á¨áá˛áŤ áĽá¨áľ ááŁáŞáŤ á¨áá¤áľ á áááá˝ á áá á¨áĽ áĽá á¨áá¤áľ á áááá˝ á°áá á¨áĽ áááá (MSQueue). ááŁáŞáŤ á áááĽáŠá áľ áá á¨á á¨á´ááá˝ áá á ááááá ᣠáá áá áá° áá á¨á°áᨠááááľ á°áááá á áá áá á áľááľáá á áľááááᢠMSFilterDescá¨áŤáłá˝áá ááŁáŞáŤ áľáá áŤ. á¨áá á áłá˝ á¨áá˛áŤ áĽá¨áľ áá°áŤáŤ ááľáĽ áŤááá áááááá ááŁáŞáŤ á¨áááá˝ ááá á ááᢠMSFilter:
struct _MSFilter{
MSFilterDesc *desc; /* УкаСаŃĐľĐťŃ Đ˝Đ° Đ´ĐľŃĐşŃипŃĐžŃ ŃиНŃŃŃĐ°. */
/* ĐĐ°ŃиŃоннŃĐľ Đ°ŃŃийŃŃŃ, иŃ
ноНŃĐˇŃ ŃдвигаŃŃ Đ¸ĐťĐ¸ ŃйиŃĐ°ŃŃ Đ¸Đ˝Đ°ŃĐľ ĐąŃĐ´ĐľŃ Đ˝Đ°ŃŃŃона ŃайОŃĐ° Ń ĐżĐťĐ°ĐłĐ¸Đ˝Đ°ĐźĐ¸. */
ms_mutex_t lock; /* ХоПаŃĐžŃ. */
MSQueue **inputs; /* ТайНиŃĐ° вŃ
ОднŃŃ
НинкОв. */
MSQueue **outputs; /* ТайНиŃĐ° вŃŃ
ОднŃŃ
НинкОв. */
struct _MSFactory *factory; /* УкаСаŃĐľĐťŃ Đ˝Đ° ŃĐ°ĐąŃикŃ, кОŃĐžŃĐ°Ń ŃОСдаНа даннŃĐš ŃкСоПпНŃŃ ŃиНŃŃŃĐ°. */
void *padding; /* ĐĐľ иŃпОНŃСŃĐľŃŃŃ, ĐąŃĐ´ĐľŃ ĐˇĐ°Đ´ĐľĐšŃŃвОван ĐľŃНи дОйавŃŃŃŃ ĐˇĐ°ŃиŃоннŃĐľ пОНŃ. */
void *data; /* УкаСаŃĐľĐťŃ Đ˝Đ° ĐżŃОиСвОНŃĐ˝ŃŃ ŃŃŃŃĐşŃŃŃŃ Đ´ĐťŃ Ń
ŃĐ°Đ˝ĐľĐ˝Đ¸Ń Đ´Đ°Đ˝Đ˝ŃŃ
внŃŃŃонногО ŃĐžŃŃĐžŃĐ˝Đ¸Ń ŃиНŃŃŃĐ° и ĐżŃОПоМŃŃĐžŃĐ˝ŃŃ
вŃŃиŃНониК. */
struct _MSTicker *ticker; /* УкаСаŃĐľĐťŃ Đ˝Đ° ОйŃĐľĐşŃ ŃикоŃĐ°, кОŃĐžŃŃĐš но дОНМон ĐąŃŃŃ Đ˝ŃНовŃĐź кОгда вŃСŃваоŃŃŃ ŃŃнкŃĐ¸Ń process(). */
/*private attributes, they can be moved and changed at any time*/
MSList *notify_callbacks; /* ХпиŃОк ОйŃĐ°ŃĐ˝ŃŃ
вŃСОвОв, иŃпОНŃСŃоПŃŃ
Đ´ĐťŃ ĐžĐąŃайОŃки ŃОйŃŃиК ŃиНŃŃŃĐ°. */
uint32_t last_tick; /* ĐĐžĐźĐľŃ ĐżĐžŃНодногО ŃĐ°ĐşŃĐ°, кОгда вŃпОНнŃĐťŃŃ Đ˛ŃСОв process(). */
MSFilterStats *stats; /* ĐĄŃĐ°ŃиŃŃика ŃайОŃŃ ŃиНŃŃŃĐ°.*/
int postponed_task; /*ĐОНиŃĐľŃŃвО ĐžŃНОМоннŃŃ
СадаŃ. ĐокОŃĐžŃŃĐľ ŃиНŃŃŃŃ ĐźĐžĐłŃŃ ĐžŃкНадŃваŃŃ ĐžĐąŃайОŃĐşŃ Đ´Đ°Đ˝Đ˝ŃŃ
(вŃСОв process()) на ноŃкОНŃкО ŃĐ°ĐşŃОв.*/
bool_t seen; /* ФНаг, кОŃĐžŃŃĐš иŃпОНŃСŃĐľŃ ŃикоŃ, ŃŃĐžĐąŃ ĐżĐžĐźĐľŃĐ°ŃŃ ŃŃĐž ŃŃĐžŃ ŃкСоПпНŃŃ ŃиНŃŃŃĐ° Он ŃМо ОйŃĐťŃМиН на даннОП ŃĐ°ĐşŃĐľ.*/
};
typedef struct _MSFilter MSFilter;
á áĽá áłá˝á áá°á¨áľ á ᲠááŽááŤá ááľáĽ áŤááľá ááŁáŞáŤáá˝ áŤáááá á áá (ááá áá ááááľ ááľá¨ááŤáá á áááááá) ᣠá áá ááááľ á¨áá፠ááŤá áá áá ᣠá ááááš á¨ááá á ááłááá˝ áá¸á ᢠMSFilter, áĽá á ááá˝ á¨á áááá˝ ááłááá˝ áá¸á MSQueue.
á¨áľááááą á áľá°ááᣠá¨ááááľ ááááľ áĽáá áľáá´áá˝
ááĽááŞáŤá á¨ááĽááŽá˝ ááá ááŁáŞáŤ áĽáá°áá áľáááááľ, áľá áĽáą áá á áá áĽáááľ á ááá á¨á. ááááľ ááľá¨á፠á á°ááľ áá á°ááŁáŤáľá á¨ááŤá¨ááá ááá ááᢠáá°áľ () á¨á°áááá áľ á¨áá¨áł (ááŤá) ááá ááŁáŞáŤáá˝á˘ á ᲠááŽááŤá ááľáĽ ááĽááá á¨ááŤá ááŁáŞáŤ áá áľáááááᣠáĽáľááá áá áľá¨áľ á¨áááŁá á¨áá ááŤá áá ááá áĽááłáŤááᢠá¨á°ááá á áá ááááľ ááľá¨ááŤá ááĽáą áĽáááĽáŤá¤ á¨á°á°á áá ááŤá ááááá ááááŤá, á ááľáĄá á¨ááŁáŞáŤáá˝á áááá áŤá áá áŤá. á°ááłáłáŠá ááŁáŞáŤ áááľ áá âáááá áâ áĽááłááťáᣠá¨á°áááľá ááŁáŞáŤáá˝ á ááľáŁá¸á á áááŤá˝ áłáĽá á ááľááἠááááľ áŤá°áááᢠá¨áłá¨á. áááá á¨áá¨áááá áĽáŤááłááą ááŁáŞáŤ áŤáá¸áá á¨á ááá á°áá á¨áŚá˝á á áá áá áá.
á¨ááŤáá ááá˘áŤ á ááá áá áľ áá ááááľ ááľá¨ááŤá á¨ááŁáŞáŤááš ááŤá¨á áĽáá° á¨ááἠáĽááŽá˝ ááá áá á¨ááŤáááá á˘áŤááľ á ááľ áááŠá áŤá¨áááŁáᢠááá á¨áá ᣠá¨á፠ááŤá áľááá áĽááłááá ááá áŤá áĽá ááááą áááľááá˘
ááŤá "áľááá" áá á¨á°áá, ááĽáŤááłááą á¨á°áá ááŁáŞáŤ, á°ááŁáŠ ááááá ááŁáá á áľá áá°áľ(). áááŁáŠ á¨ááááŁá áŞáŤ áá°áľ á á˝á áľ áĽáá°á°á¨á° (á ááŁáŞ á á¨10 ááá°á¨ááľ) ááááľ ááľá¨ááŤá á°ááŁáŠá áá áŤááᢠáá°áľ () áá°á á˛á áá°áááľ ááá áááŽá˝ ááŁáŞáŤáá˝ áĽá á¨á፠á áááአááľáĽ áá°ááŠáľ ááŁáŞáŤáá˝á˘ ááŁáŞáŤá á¨áá¤áľ á áááá˝ áŤááľ, á¨ááŤá á°ááŁáŠá áŤááą áá°áľ () á¨áá¤áľ áááá áá¨ááá˝ áŁáś áĽáľáŞáá áľá¨áľ áá°áááᢠá¨áá á áá á áááአááľáĽ áá°áááĽáá ááŁáŞáŤ áá¸áááŤá áĽá á¨áá¤áľ á áááá˝ á¨áááĽááśá˝ ááť áĽáľáŞáá áľá¨áľ "áŤá¸áĽáá". áááአáĽáľáŞáŤáá áľá¨áľ ááááľ ááľá¨ááŤá á¨ááŁáŞáŤ áá° ááŁáŞáŤ ááááłááłáᢠáá á¨áá°áąá áá°áľ áŤá áá áá.
á áá áá° tuples áĽááááłáá áĽá ááá áĽáá°áá áŤá á áŤá áá° áá˛áŤ áĽá¨áľ áĽáá°áłá¨á áĽáááááŤáá ᢠá á á ááá á ááŁáŞáŤá ááľáĽ á¨áá áŤá á áááŞáá á¨ááááá á¨ááἠáá á á áááłá°áá áĽá á ááá˘áŤá áá á¨á°áá ááľ á¨ááἠááľ áá á áĽááľ á áá°ááᢠáááłáᣠááŁá ááŞá¨á áľáŤááľáááá á¨ááŤá¨ááá ááŁáŞáŤ áĽá¨áťáá ááᣠáá á á áľááá áá áá¸á á¨áááľ ááá á¨áá á¨ááἠáĽááŽá˝á áĽáť ááᢠ512 áá áŤáá˝ ááá. áá¨áá á¨áááá¨á á á´ááá áťáá á¨áá á ááá˘áŤá áá áŤáá á¨áĽáŤááłááą áááĽááľ áłáł ááľ 160 á¨á˛ááá ááááá˝á áŤááŁáááᢠá¨ááááá á¨ááἠáá á áĽáľáŤáá°áá áľá¨áľ á¨ááĽá áľ áá áá¨á áááá°áĽá°áĽ ááłá ááᢠááá áá á áá á ááŁá á¨ááá˘áŤ áááá áŁáś áĽáľáŞáá áľá¨áľ ááŁáŞáŤáá ááá¸áĽáá á¨áááá á¨á˛á¨á áá áááľ áá¨á°áłáᢠá¨áá áá°á áá áá á°áἠáĽáá° ááŁáŞáŤá áŚáľá°áá ááá á áľááá á°ááááłáᢠá áá ááá áá°á¨áľ á¨ááŁáŞáŤá áá°áľ() á°ááŁá áááá áá¨ááá˝ á¨áá¤áľ áá¨ááá˝ ááá°áľ á áá áľá˘
á á°á¨ááŞá, á¨ááá˘áŤá ááľáĽ 512 ááááá˝á áĽáť ááá°áľ á ááťáá, ááááŤáąá áá áĽááŽá˝á áĽáť ááá°áľ áá˝áá, áááľá. ááŁáŞáŤá 640 ááááá˝á ááľáś 512 áąá áá áá áááá áłáᢠáľááá á¨áĽá ááŁáŞáŤ á¨áá áľáŤá á á°á¨á᪠áááŤá¨áá á¨ááĽá áľ ááἠáá¨ááť á¨áłáľ áĽááááá˝á ááľá áľ á áá áľá˘ á¨áááá áĽááá áĽá¨áľ á áááá˝ áĽá ááá á á ááá á˝áá áááľá áአááá á ááá á°áá - MSBufferizer (bufferer) , áá áá á˝áá áąáááľ á áá áá áááłá.
ááľ (MSBufferizer)
áá
á ááŁáŞáŤá ááľáĽ á¨áá¤áľ áááĽá á¨ááŤá¨áá˝ áĽá á¨áá¨áá áá á á¨ááŁáŞáŤ á áááŞááá áááľáŹáľ áĽáá°á á áá˛áŤáá ááá°áą ááľááŁáľ ááááŤáᢠááľ áááĽá áĽáŤá áŤáá áĽáŤá ááŁáŞáŤá á¨ááááŁá áŞáŤáá á¨ááľáŹá ááá ââáłáá áá á áľáŤ ááľ áááł áá°áŤáᢠááá áá á¨á áŁáá á¨ááŁáĽ á°ááŁá á¨áᎠáá á¨áá áĽá´áľ áĽáá°á°ááá° á¨ááŁáŞáŤá áá°áľ() á°ááŁá áĽáľáŞáŤáá
áľá¨áľ á¨áá áŁá ááŤá ááľáĽ áá¨áá á ááááá áá á ááá°áľ áĽá ááŤááľ ááááŤáá˘
áá áŤáá°ááá ááἠáĽáᰠᨠtuple á¨ááááŞáŤ á áŤá áá á áá áŁá ááŤá ááľáĽ áááŤáᣠá¨á፠á áá á¨áá¤áľ ááἠáĽááŽá˝ á°áŤááááá˘
ááąá á¨áááá¸á ááá ááĄ-
struct _MSBufferizer{
queue_t q; /* ĐŃĐľŃĐľĐ´Ń ŃООйŃониК. */
int size; /* ĐĄŃППаŃĐ˝ŃĐš ŃĐ°ĐˇĐźĐľŃ Đ´Đ°Đ˝Đ˝ŃŃ
наŃ
ОдŃŃиŃ
ŃŃ Đ˛ ĐąŃŃĐľŃиСаŃĐžŃĐľ в даннŃĐš ПОПонŃ. */
};
typedef struct _MSBufferizer MSBufferizer;
á¨MSBufferizer áá áááľáŤáľ á°ááŁáŤáľ
á á˛áľ ááľ ââááłá ááá ááĄ-
MSBufferizer * ms_bufferizer_new(void);
áá á°á¨ áľááľáł á°ááľá§áᣠá°áááŻáᢠms_bufferizer_init() áĽá á áá á°áááˇá.
á¨ááľááá á°ááŁááĄ-
void ms_bufferizer_init(MSBufferizer *obj);
áá¨áá áĽá¨ááᨠááᢠqᣠááľá áá áá° áᎠá°áááĽáŻáá˘
áááĽááľ á áá¨ááĄ-
void ms_bufferizer_put(MSBufferizer *obj, mblk_t *m);
áááĽááľ m áá° áá¨áá áłáááᢠá¨á°á°áá á¨ááἠáĽááŽá˝ áá á áá° áá á°á¨ááŻáᢠáá.
áááá áááááśá˝ á¨á ááá ááἠáá¨á áá° ááľ á ááľá°ááá áá q:
void ms_bufferizer_put_from_queue(MSBufferizer *obj, MSQueue *q);
á¨á ááá áááááśá˝á á ááľá°ááá áá q á áá áŁá ááŤá ááľáĽ á°ááŁáŠá á áá áá áá¨áááá ms_bufferizer_put().
á¨á áŁáá á ááá áĽáĄ-
int ms_bufferizer_read(MSBufferizer *obj, uint8_t *data, int datalen);
á áá áŁá ááŤá ááľáĽ á¨á°á¨áḠá¨ááἠáá á á¨á°á á¨áá áŤáá° á¨áá (datalen), á¨á፠á°ááŁáŠ ááŽá ááááłá, ááἠáá° ááἠá áááá áĽá. áŤáá áá፠ᣠá áá áŁá ááŤá ááľáĽ á¨ááááľ áąááá˝ á°á¨áłáłá á¨ááἠáá áłáľ áá¨áááá ᢠá¨á°ááá á á áá, tuple áá°á¨áá áĽá áá á°á¨ áľááľáłá ááááá. áłáłáá áŁááľ á áááá áĽá áľ á á˝á áľ áá áłáľ áŤá ááᢠá áłáł áĽáá ááŤá¨á áŚáł áŤáá á áá áááĽááľ ááľáĽ á¨ááἠáĽááłá áá° ááŞá áŤáá°ááá á ááá ááááłáᢠá áááĽáá áá á˛á°áá áá áłáľ á¨áá ááĽáĽ áááĽááá˘
á á áá áá á áá áŁá ááŤá ááľáĽ áŤááá á¨ááἠáá á á ááá áĽáĄ-
int ms_bufferizer_get_avail(MSBufferizer *obj);
ááłáá ááááłá áá ááŤáŁ.
á áá áŁá ááŤá ááľáĽ áŤááá á¨ááἠááá á ááŁá áááĄ-
void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);
á¨á°á áá°á á¨ááἠáŁááľ ááĽá á°á°ááľáŽ á°áĽááᢠá áŁá áĽááłáá ááἠá°áĽááá˘
á áá áŁá ááŤá ááľáĽ áŤááľá áááá áááááśá˝ áá°á¨ááĄ-
void ms_bufferizer_flush(MSBufferizer *obj);
á¨ááἠááŁáŞá áá° áᎠá°áááĽáŻáá˘
á áá áŁá ááŤá ááľáĽ áŤááľá áááá áááááśá˝ áá°á¨ááĄ-
void ms_bufferizer_uninit(MSBufferizer *obj);
ááŁáŞá áłáá á áá°ááá¨áá˘
ááąá ááľáááľ áĽá áá á°á¨ áľááľáłá ááť ááľá¨á;
void ms_bufferizer_destroy(MSBufferizer *obj);
áááááŤáá á¨áá áá ááłááá˝ á á ááŤáł á¨áá˛áŤ áĽá¨áľ ááŁáŞáŤáá˝ ááá áŽáľ ááľáĽ ááááᢠáááłáᣠá MS_L16_ENC ááŁáŞáŤ ááľáĽáŁ á áááááš ááľáĽ áŤááľá áŁááśá˝ á¨á ááłá¨ áá¨áĽ á
á°á á°á¨á°á áá° á áľá°ááá
á
á°á á°á¨á°á á¨ááŤáľá°áŤáááĄ-
á áááĽáá áááľ áá á¨á˛áŹá áááľ áááľá ááłá áĽá á áááá áĽá¨áą ááľáĽ á¨áá á á áá á¨áŽáááŠá°á áááľ áĽáá´áľ áĽáá°áááł áĽáááá¨áłáá.
ááá: hab.com