èšäºã®çŽ æã¯ç§ã®ãã®ããåŒçšããŸãã .

ããŒã¿ç§»åã¡ã«ããºã
- ããŒã¿ããã㯠dblk_t
- ã¡ãã»ãŒãžmblk_t
- ã¡ãã»ãŒãžãæäœããããã®é¢æ° mblk_t
- ãã¥ãŒ queue_t
- ãã¥ãŒãæäœããããã®é¢æ° queue_t
- ãã£ã«ã¿ãŒã®æ¥ç¶
- ããŒã¿åŠçã°ã©ãã®ä¿¡å·ç¹
- ãã£ãã«ãŒã®èå°è£ã®æŽ»å
- ãããã¡ã©ã€ã¶ãŒ (MSBufferizer)
- MSBufferizer ãæäœããããã®é¢æ°
éå»ã« ç¬èªã®ãã£ã«ã¿ãŒãéçºããŸããããã®èšäºã§ã¯ãã¡ãã£ã¢ ã¹ããªãŒã㌠ãã£ã«ã¿ãŒéã§ããŒã¿ãç§»åããããã®å éšã¡ã«ããºã ã«çŠç¹ãåœãŠãŸããããã«ãããå°æ¥çã«ã¯ãããå°ãªãåŽåã§é«åºŠãªãã£ã«ã¿ãŒãäœæã§ããããã«ãªããŸãã
ããŒã¿ç§»åã¡ã«ããºã
ã¡ãã£ã¢ ã¹ããªãŒããŒã§ã®ããŒã¿ã®ç§»åã¯ãæ¬¡ã®æ§é ã§èšè¿°ããããã¥ãŒã䜿çšããŠå®è¡ãããŸãã ãã¥ãŒ_tãã®ãããªã¡ãã»ãŒãžã®æåå mblk_tãããèªäœã«ã¯ä¿¡å·ããŒã¿ã¯å«ãŸããŠããããåãæ¬¡ã®ã¡ãã»ãŒãžãããã³ããŒã¿ ãããã¯ãžã®ãªã³ã¯ã®ã¿ãå«ãŸããŠããŸããããã«ãåãã¿ã€ãã®ã¡ãã»ãŒãžãžã®ãªã³ã¯çšã®ãã£ãŒã«ãããããåäžãªã³ã¯ãããã¡ãã»ãŒãžã®ãªã¹ããæŽçã§ããããšãç¹ã«åŒ·èª¿ããããšæããŸãããã®ãããªãªã¹ãã§ãŸãšããããã¡ãã»ãŒãžã®ã°ã«ãŒããã¿ãã«ãšåŒã³ãŸãããããã£ãŠããã¥ãŒã®ä»»æã®èŠçŽ ãåäžã®ã¡ãã»ãŒãžã«ããããšãã§ããŸãã mblk_tãããããã¡ãã»ãŒãžã¿ãã«ã®å é mblk_tãåã¿ãã« ã¡ãã»ãŒãžã¯ç¬èªã®ã¯ãŒã ããŒã¿ ãããã¯ãæã€ããšãã§ããŸãããªãã¿ãã«ãå¿ èŠãªã®ãã«ã€ããŠã¯ãåŸã»ã©èª¬æããŸãã
åè¿°ããããã«ãã¡ãã»ãŒãžèªäœã«ã¯ããŒã¿ã®ãããã¯ã¯å«ãŸããŠãããã代ããã«ããããã¯ãä¿åãããŠããã¡ã¢ãªé åãžã®ãã€ã³ã¿ã®ã¿ãå«ãŸããŠããŸãããã®éšåã§ã¯ãã¡ãã£ã¢ ã¹ããªãŒããŒã®ä»äºã®å šäœåã¯ã挫ç»ãã¢ã³ã¹ã¿ãŒãº ã€ã³ã¯ãã®ãã¢å庫ãæãåºãããŸããã㢠(ããŒã¿ãžã®ãªã³ã¯ - éšå±) ãé äžã®ã³ã³ãã¢ã«æ²¿ã£ãŠç°åžžãªé床ã§ç§»åããäžæ¹ã§ãéšå±èªäœã¯åããªããŸãŸã§ãã
次ã«ãéå±€ã«æ²¿ã£ãŠäžããäžã«ç§»åããŠãã¡ãã£ã¢ ã¹ããªãŒããŒå ã®ããŒã¿éä¿¡ã¡ã«ããºã ã®ãªã¹ãããããšã³ãã£ãã£ãè©³çŽ°ã«æ€èšããŠã¿ãŸãããã
ããŒã¿ããã㯠dblk_t
ããŒã¿ãããã¯ã¯ããããŒãšããŒã¿ãããã¡ãŒã§æ§æãããŸããããããŒã¯ä»¥äžã®æ§é ã§èšè¿°ãããŸãã
typedef struct datab
{
unsigned char *db_base; // УказаÑÐµÐ»Ñ ÐœÐ° МаÑалП бÑÑÐµÑ ÐŽÐ°ÐœÐœÑÑ
.
unsigned char *db_lim; // УказаÑÐµÐ»Ñ ÐœÐ° ÐºÐŸÐœÐµÑ Ð±ÑÑÐµÑ ÐŽÐ°ÐœÐœÑÑ
.
void (*db_freefn)(void*); // ЀÑМкÑÐžÑ ÐŸÑÐ²ÐŸÐ±ÐŸÐ¶ÐŽÐµÐœÐžÑ Ð¿Ð°ÐŒÑÑО пÑО ÑЎалеМОО блПка.
int db_ref; // СÑеÑÑОк ÑÑÑлПк.
} dblk_t;æ§é äœã®ãã£ãŒã«ãã«ã¯ããããã¡ã®å é ããããã¡ã®æ«å°Ÿãããã³ããŒã¿ ãããã¡ãåé€ãã颿°ãžã®ãã€ã³ã¿ãå«ãŸããŠããŸããããããŒã®æåŸã®èŠçŽ db_ref â åç §ã«ãŠã³ã¿ããŒãã«éãããšããã®ãããã¯ãã¡ã¢ãªããåé€ããä¿¡å·ãšããŠæ©èœããŸããããŒã¿ãããã¯ã颿°ã«ãã£ãŠäœæãããå Žå datab_alloc() ãããŒã¿ ãããã¡ãŒã¯ããããŒã®çŽåŸã«ã¡ã¢ãªã«é 眮ãããŸãããã以å€ã®å Žåã¯ãã¹ãŠããããã¡ãŒã¯å¥ã®å Žæã«é 眮ã§ããŸããããŒã¿ ãããã¡ãŒã«ã¯ããã£ã«ã¿ãŒã§åŠçããä¿¡å·ãµã³ãã«ãŸãã¯ãã®ä»ã®ããŒã¿ãå«ãŸããŸãã
ããŒã¿ ãããã¯ã®æ°ããã€ã³ã¹ã¿ã³ã¹ã¯ã次ã®é¢æ°ã䜿çšããŠäœæãããŸãã
dblk_t *datab_alloc(int size);å ¥åãã©ã¡ãŒã¿ãšããŠããããã¯ãæ ŒçŽããããŒã¿ã®ãµã€ãºãæå®ãããŸããå²ãåœãŠãããã¡ã¢ãªã®å é ã«ããããŒæ§é äœãé 眮ããããã«ãããå€ãã®ã¡ã¢ãªãå²ãåœãŠãããŸãã ããŒã¿ããŒã¹ããã ããä»ã®é¢æ°ã䜿çšããå Žåãããã¯åžžã«èµ·ããããã§ã¯ãªããå Žåã«ãã£ãŠã¯ãããŒã¿ ãããã¡ãŒãããŒã¿ ããã㯠ããããŒãšã¯å¥ã«é 眮ãããå ŽåããããŸããæ§é äœãäœæãããšãããã£ãŒã«ãã¯ããã®ãã£ãŒã«ãã ããŒã¿ããŒã¹ããŒã¹ ããŒã¿é åã®å é ãæãããã㊠db_lim ãã®çµãããŸã§ããªã³ã¯æ° db_ref 㯠1 ã«èšå®ãããŸããããŒã¿ã¯ãªã¢é¢æ°ãã€ã³ã¿ã¯ãŒãã«èšå®ãããŸãã
ã¡ãã»ãŒãž 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_å, b_nextãäºéãªã³ã¯ãªã¹ã (ãã¥ãŒ) ãæŽçããããã«å¿ èŠã§ãã ãã¥ãŒ_t).
次ã«ãã€ã³ã¿ãŒãæ¥ãŸã b_ç¶ããã¡ãã»ãŒãžãã¿ãã«ã®äžéšã§ããå Žåã«ã®ã¿äœ¿çšãããŸããã¿ãã«å ã®æåŸã®ã¡ãã»ãŒãžã§ã¯ããã®ãã€ã³ã¿ã¯ null ã®ãŸãŸã§ãã
次ã«ãããŒã¿ ãããã¯ãžã®ãã€ã³ã¿ãŒã衚瀺ãããŸãã b_datapãã¡ãã»ãŒãžãååšããŸãããã®åŸã«ãããã㯠ããŒã¿ ãããã¡ãŒå ã®é åãžã®ãã€ã³ã¿ãŒãç¶ããŸããåé b_rptr ãããã¡ããããŒã¿ãèªã¿åãå Žæãæå®ããŸããåé b_wptr ãããã¡ãžã®æžã蟌ã¿ãå®è¡ãããå Žæã瀺ããŸãã
æ®ãã®ãã£ãŒã«ãã¯ãµãŒãã¹ã®æ§è³ªã®ãã®ã§ãããããŒã¿è»¢éã¡ã«ããºã ã®åäœã«ã¯é¢ä¿ããŸããã
以äžã¯ååãå«ãåäžã®ã¡ãã»ãŒãžã§ã m1 ãããŠããŒã¿ããã㯠d1.

次ã®å³ã¯ã3 ã€ã®ã¡ãã»ãŒãžã®ã¿ãã«ã瀺ããŠããŸãã m1, m1_1, m1_2.

ã¡ãã»ãŒãžæ©èœ mblk_t
æ°ããã¡ãã»ãŒãž mblk_t 颿°ã«ãã£ãŠäœæãããŸãã:
mblk_t *allocb(int size, int pri); 圌女ã¯ã¡ã¢ãªã«æ°ããã¡ãã»ãŒãžã眮ããŸã mblk_t æå®ããããµã€ãºã®ããŒã¿ââ ãããã¯ãæã€ ãµã€ãºã第 2 åŒæ° - ã㪠ãã®ããŒãžã§ã³ã®ã©ã€ãã©ãªã§ã¯äœ¿çšãããŸããããŒãã®ãŸãŸã§ãªããã°ãªããŸããã颿°ã®æäœäžã«ãæ°ããã¡ãã»ãŒãžã®æ§é ã«ã¡ã¢ãªãå²ãåœãŠããã颿°ãåŒã³åºãããŸãã mblk_init()ããã«ãããäœæãããæ§é äœã®ã€ã³ã¹ã¿ã³ã¹ã®ãã¹ãŠã®ãã£ãŒã«ãããªã»ããããããã®åŸãäžèšã®ã¡ãœããã䜿çšããŸãã datab_alloc()ãããŒã¿ãããã¡ãäœæããŸãããã®åŸãæ§é å ã®ãã£ãŒã«ããæ§æãããŸãã
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*)); ãã®é¢æ°ã¯ãã¡ãã»ãŒãžãšããŒã¿ ãããã¯ã®æ§é ãäœæããåŸã次ã®ã¢ãã¬ã¹ã®ããŒã¿ãžã®ãã€ã³ã¿ãŒãæ§æããŸãã BUFããããã®ããã®å Žåã颿°ã䜿çšããŠããŒã¿ ãããã¯ãäœæããå Žåãšã¯ç°ãªããããŒã¿ ãããã¡ãŒã¯ããŒã¿ ãããã¯ã®ããã㌠ãã£ãŒã«ãã®åŸã«é 眮ãããŸããã datab_alloc()ã颿°ã«æž¡ãããããŒã¿ãå«ããããã¡ãŒã¯å ã®å Žæã«æ®ããŸããããã€ã³ã¿ãŒã®å©ããåããŠãããŒã¿ ãããã¯ã®æ°ããäœæãããããããŒã«æ·»ä»ãããããã«å¿ããŠã¡ãã»ãŒãžã«ãæ·»ä»ãããŸãã
äžã€ã®ã¡ãã»ãŒãžã« mblk_t è€æ°ã®ããŒã¿ ãããã¯ãé£ç¶ããŠé£çµã§ããŸããããã¯æ¬¡ã®é¢æ°ã«ãã£ãŠè¡ãããŸãã
mblk_t * appendb(mblk_t *mp, const char *data, int size, bool_t pad); mp â å¥ã®ããŒã¿ ãããã¯ã远å ãããã¡ãã»ãŒãžã
ããŒã¿ â ãããã¯ãžã®ãã€ã³ã¿ããã®ã³ããŒãã¡ãã»ãŒãžã«è¿œå ãããŸãã
ãµã€ãº â ããŒã¿ãµã€ãºã
ããã â å²ãåœãŠãããã¡ã¢ãªã®ãµã€ãºã 4 ãã€ãå¢çã«æ²¿ã£ãŠæŽåããå¿
èŠãããããšã瀺ããã©ã° (ããã£ã³ã°ã¯ãŒãã§è¡ãããŸã)ã
æ¢åã®ã¡ãã»ãŒãž ããŒã¿ ãããã¡ãŒã«ååãªã¹ããŒã¹ãããå Žåã¯ãæ°ããããŒã¿ãæ¢åã®ããŒã¿ã®åŸãã«è²Œãä»ããããŸããã¡ãã»ãŒãž ããŒã¿ ãããã¡ãŒã®ç©ºãé åãå°ãªãå Žåã¯ã ãµã€ãºããã®åŸãååãªãããã¡ ãµã€ãºã§æ°ããã¡ãã»ãŒãžãäœæãããããŒã¿ããã®ãããã¡ã«ã³ããŒãããŸããããã¯æ°ããã¡ãã»ãŒãžã§ããããã€ã³ã¿ã䜿çšããŠå ã®ã¡ãã»ãŒãžã«ãªã³ã¯ãããŠããŸã b_ç¶ãããã®å Žåãã¡ãã»ãŒãžã¯ã¿ãã«ã«å€ãããŸãã
ã¿ãã«ã«å¥ã®ããŒã¿ ãããã¯ã远å ããå¿ èŠãããå Žåã¯ã次ã®é¢æ°ã䜿çšããå¿ èŠããããŸãã
void msgappend(mblk_t *mp, const char *data, int size, bool_t pad);圌女ã¯ã¿ãã«å ã®æåŸã®ã¡ãã»ãŒãžãèŠã€ããŸã (圌㯠b_ç¶ã null ã«ãªããŸã)ããã®ã¡ãã»ãŒãžã®é¢æ°ãåŒã³åºããŸã appendb().
次ã®é¢æ°ã䜿çšããŠãã¡ãã»ãŒãžãŸãã¯ã¿ãã«å ã®ããŒã¿ã®ãµã€ãºã確èªã§ããŸãã
int msgdsize(const mblk_t *mp);ã¿ãã«å ã®ãã¹ãŠã®ã¡ãã»ãŒãžãã«ãŒããããããã®ã¡ãã»ãŒãžã®ããŒã¿ ãããã¡ãŒå ã®ããŒã¿ã®ç·éãè¿ããŸããåã¡ãã»ãŒãžã®ããŒã¿éã¯æ¬¡ã®ããã«èšç®ãããŸãã
mp->b_wptr - mp->b_rptr2 ã€ã®ã¿ãã«ãçµåããã«ã¯ã次ã®é¢æ°ã䜿çšããŸãã
mblk_t *concatb(mblk_t *mp, mblk_t *newm);圌女ã¯ã¿ãã«ã远å ããŸã ãã¥ãŒã ã¿ãã«ã®æ«å°ŸãŸã§ mp ãããŠãçµæã®ã¿ãã«ã®æåŸã®ã¡ãã»ãŒãžãžã®ãã€ã³ã¿ãè¿ããŸãã
å¿ èŠã«å¿ããŠãã¿ãã«ã 1 ã€ã®ããŒã¿ ãããã¯ãå«ã 1 ã€ã®ã¡ãã»ãŒãžã«å€æã§ããŸããããã¯æ¬¡ã®é¢æ°ã«ãã£ãŠè¡ãããŸãã
void msgpullup(mblk_t *mp,int len);åŒæ°ã®å Žå LEN ã -1 ã®å Žåãå²ãåœãŠããããããã¡ã®ãµã€ãºã¯èªåçã«æ±ºå®ãããŸãããã LEN ãæ£ã®æ°ã®å Žåããã®ãµã€ãºã®ãããã¡ãäœæãããããã«ã¿ãã« ã¡ãã»ãŒãž ããŒã¿ãã³ããŒãããŸãããããã¡ããªããªããšãã³ããŒã¯ããã§åæ¢ããŸããã¿ãã«ã®æåã®ã¡ãã»ãŒãžã¯ãã³ããŒãããããŒã¿ãå«ãæ°ãããµã€ãºã®ãããã¡ãŒãåãåããŸããæ®ãã®ã¡ãã»ãŒãžã¯åé€ãããã¡ã¢ãªãããŒãã«æ»ãããŸãã
æ§é ç©ãåé€ããå Žå 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);æ°ããããŒã¿ãã¡ãã»ãŒãž ããŒã¿ ãããã¡ã®ç©ºãé åã«åãŸããªãå Žåã¯ãå¿ èŠãªãµã€ãºã®ãããã¡ãæã€å¥éäœæãããã¡ãã»ãŒãžãã¡ãã»ãŒãžã«æ·»ä»ãããŸã (远å ãããã¡ãã»ãŒãžãžã®ãã€ã³ã¿ãæåã®ã¡ãã»ãŒãžã«èšå®ãããŸã)ãã¡ãã»ãŒãžã¯ã¿ãã«ã«å€ãããŸãã
ããŒã¿ã®äžéšãã¿ãã«ã«è¿œå ããŸãã
void msgappend(mblk_t *mp, const char *data, size_t size, bool_t pad); ãã®é¢æ°ã¯ã«ãŒãå ã§ appendb() ãåŒã³åºããŸãã
2 ã€ã®ã¿ãã«ã 1 ã€ã«çµåããŸãã
mblk_t *concatb(mblk_t *mp, mblk_t *newm);ã¡ãã»ãŒãž ãã¥ãŒã ã«ä»å±ããŸã mp.
åäžã¡ãã»ãŒãžã®ã³ããŒãäœæãã:
mblk_t *copyb(const mblk_t *mp);ãã¹ãŠã®ããŒã¿ ãããã¯ãå«ãã¿ãã«ã®ã³ããŒãå®äºããŸãã
mblk_t *copymsg(const mblk_t *mp);ã¿ãã«ã®èŠçŽ ã¯é¢æ°ã«ãã£ãŠã³ããŒãããŸã ã³ããŒb().
ã¡ãã»ãŒãžã®ç°¡åãªã³ããŒãäœæãã mblk_tããã®å ŽåãããŒã¿ ãããã¯ã¯ã³ããŒãããŸãããããã®åç §ã«ãŠã³ã¿ãŒã¯å¢å ããŸãã db_ref:
mblk_t *dupb(mblk_t *mp);ã¿ãã«ã®è»œéã³ããŒãäœæããŸããããŒã¿ ãããã¯ã¯ã³ããŒããããåç §ã«ãŠã³ã¿ãŒã®ã¿ãã€ã³ã¯ãªã¡ã³ããããŸãã db_ref:
mblk_t *dupmsg(mblk_t* m);ã¿ãã«ã®ãã¹ãŠã®ã¡ãã»ãŒãžã 1 ã€ã®ã¡ãã»ãŒãžã«çµåããŸãã
void msgpullup(mblk_t *mp,size_t len);åŒæ°ã®å Žå LEN ã -1 ã®å Žåãå²ãåœãŠããããããã¡ã®ãµã€ãºã¯èªåçã«æ±ºå®ãããŸãã
ã¡ãã»ãŒãžã®åé€ãã¿ãã«:
void freemsg(mblk_t *mp);ããŒã¿ ãããã¯ã®åç §ã«ãŠã³ã㯠1 ã€æžããŸãããŒãã«ãªããšãããŒã¿ ãããã¯ãåé€ãããŸãã
ã¡ãã»ãŒãžãŸãã¯ã¿ãã«å ã®ããŒã¿ã®åèšéã®èšç®ã
size_t msgdsize(const mblk_t *mp);ãã¥ãŒã®æåŸå°Ÿããã¡ãã»ãŒãžãååŸããŸãã
mblk_t *ms_queue_peek_last (q);ããã¡ãã»ãŒãžã®äºçŽãã£ãŒã«ãã®å 容ãå¥ã®ã¡ãã»ãŒãžã«ã³ããŒããŸã (å®éããããã®ãã£ãŒã«ãã«ã¯ã¡ãã£ã¢ ã¹ããªãŒããŒã«ãã£ãŠäœ¿çšããããã©ã°ãå«ãŸããŠããŸã)ã
mblk_meta_copy(const mblk_t *source, mblk *dest);åŸ ã¡è¡å ãã¥ãŒ_t
ã¡ãã£ã¢ ã¹ããªãŒãã®ã¡ãã»ãŒãž ãã¥ãŒã¯ã埪ç°äºéãªã³ã¯ ãªã¹ããšããŠå®è£
ãããŸããåãªã¹ãèŠçŽ ã«ã¯ãä¿¡å·ãµã³ãã«ãå«ãããŒã¿ ãããã¯ãžã®ãã€ã³ã¿ãŒãå«ãŸããŠããŸããããŒã¿ ãããã¯ãžã®ãã€ã³ã¿ã ããé çªã«ç§»åããããŒã¿èªäœã¯åããªãããšãããããŸãããããã®ãããããžã®ãªã³ã¯ã®ã¿ãç§»åãããŸãã
ãã¥ãŒã説æããæ§é ãã¥ãŒ_tã äžã«ç€ºãããïŒ
typedef struct _queue
{
mblk_t _q_stopper; /* "ХПлПÑÑПй" ÑÐ»ÐµÐŒÐµÐœÑ ÐŸÑеÑеЎО, Ме ÑказÑÐ²Ð°ÐµÑ ÐœÐ° ЎаММÑе, ОÑпПлÑзÑеÑÑÑ ÑПлÑкП ÐŽÐ»Ñ ÑпÑÐ°Ð²Ð»ÐµÐœÐžÑ ÐŸÑеÑеЎÑÑ. ÐÑО ОМОÑОалОзаÑОО ПÑеÑеЎО (qinit()) егП ÑказаÑелО МаÑÑÑаОваÑÑÑÑ Ñак, ÑÑÐŸÐ±Ñ ÐŸÐœÐž ÑказÑвалО Ма МегП ÑаЌПгП. */
int q_mcount; // ÐПлОÑеÑÑвП ÑлеЌеМÑПв в ПÑеÑеЎО.
} queue_t;æ§é äœã«ã¯ãã£ãŒã«ããã€ãŸããã€ã³ã¿ãå«ãŸããŠããŸã _q_ã¹ããã㌠*mblk_t ãšå
¥åãããšããã¥ãŒå
ã®æåã®èŠçŽ (ã¡ãã»ãŒãž) ãæããŸãããã®æ§é äœã® 2 çªç®ã®ãã£ãŒã«ãã¯ããã¥ãŒå
ã®ã¡ãã»ãŒãžã®ã«ãŠã³ã¿ãŒã§ãã
次ã®å³ã¯ã1 ã€ã®ã¡ãã»ãŒãž m4ãm1ãm2ãm3 ãå«ã q4 ãšããååã®ãã¥ãŒã瀺ããŠããŸãã

次ã®å³ã¯ã1 ã€ã®ã¡ãã»ãŒãž m4ãm1ãm2ãm3 ãå«ã q4 ãšããååã®ãã¥ãŒã瀺ããŠããŸããã¡ãã»ãŒãž m2 ã¯ãããã« 2 ã€ã®ã¡ãã»ãŒãž m1_2 ããã³ m2_XNUMX ãå«ãã¿ãã«ã®å
é ã§ãã

ãã¥ãŒãæäœããããã®é¢æ° 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) ã¡ãã»ãŒãžãžã® null ãã€ã³ã¿ãŒã䜿çšãããšã颿°ã¯ã«ãŒãããŸããããã°ã©ã ãããªãŒãºããŠããŸããŸããåæ§ã«åäœããŸã ms_queue_next(q, m).
ãã£ã«ã¿ãŒã®æ¥ç¶
äžã§èª¬æãããã¥ãŒã¯ããããã£ã«ã¿ãŒããå¥ã®ãã£ã«ã¿ãŒãžããŸã㯠1 ã€ããè€æ°ã®ãã£ã«ã¿ãŒãžã¡ãã»ãŒãžãæž¡ãããã«äœ¿çšãããŸãããã£ã«ã¿ãŒãšãã®æ¥ç¶ã¯æåã°ã©ãã圢æããŸãããã£ã«ã¿ã®å ¥åãŸãã¯åºåãç·ç§°ããŠããã³ããšåŒã³ãŸãããã£ã«ã¿ãŒãäºãã«æ¥ç¶ãããé åºã説æããããã«ãã¡ãã£ã¢ ã¹ããªãŒããŒã¯ãä¿¡å·ãã€ã³ããã®æŠå¿µã䜿çšããŸããä¿¡å·ç¹ã¯æ§é ç©ã§ã _MSCãã€ã³ããããã«ã¯ãã£ã«ã¿ãŒãžã®ãã€ã³ã¿ãŒãšãã®ãã³ã®çªå·ãå«ãŸããŠãããããã«å¿ããŠãã£ã«ã¿ãŒã®å ¥åãŸãã¯åºåã® 1 ã€ã®æ¥ç¶ãèšè¿°ããŸãã
ããŒã¿åŠçã°ã©ãã®ä¿¡å·ç¹
typedef struct _MSCPoint{
struct _MSFilter *filter; // УказаÑÐµÐ»Ñ ÐœÐ° ÑОлÑÑÑ ÐŒÐµÐŽÐžÐ°ÑÑÑОЌеÑа.
int pin; // ÐÐŸÐŒÐµÑ ÐŸÐŽÐœÐŸÐ³ÐŸ Оз вÑ
ПЎПв ОлО вÑÑ
ПЎПв ÑОлÑÑÑа, Ñ.е. пОМ.
} MSCPoint;
ãã£ã«ã¿ãŒ ãã³ã«ã¯ 0 ããå§ãŸãçªå·ãä»ããããŸãã
ã¡ãã»ãŒãžãã¥ãŒã«ãã 2 ã€ã®ãã³ã®æ¥ç¶ã¯ãæ¬¡ã®æ§é ã§èšè¿°ãããŸãã _MSãã¥ãŒããã«ã¯ãã¡ãã»ãŒãž ãã¥ãŒãšããããæ¥ç¶ãã 2 ã€ã®ä¿¡å·ãã€ã³ããžã®ãã€ã³ã¿ãå«ãŸããŠããŸãã
typedef struct _MSQueue
{
queue_t q;
MSCPoint prev;
MSCPoint next;
}MSQueue;
ãã®æ§é ãä¿¡å·ãªã³ã¯ãšåŒã³ãŸããåã¡ãã£ã¢ ã¹ããªãŒã ãã£ã«ã¿ã«ã¯ãå ¥åãªã³ã¯ã®ããŒãã«ãšåºåãªã³ã¯ã®ããŒãã«ãå«ãŸããŠããŸã (MSãã¥ãŒïŒãããŒãã«ã®ãµã€ãºã¯ãã£ã«ã¿ãŒã®äœææã«èšå®ãããŸããããã¯ã次ã®ã¿ã€ãã®ãšã¯ã¹ããŒãããã倿°ã䜿çšããŠãã§ã«è¡ã£ãŠããŸãã MSãã£ã«ã¿ãŒèšè¿°ãç¬èªã®ãã£ã«ã¿ãŒãéçºãããšãã以äžã¯ãã¡ãã£ã¢ ã¹ããªãŒããŒå ã®ãã£ã«ã¿ãŒãèšè¿°ããæ§é ã§ãã MSãã£ã«ã¿ãŒ:
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;
èšç»ã«åŸã£ãŠ C ããã°ã©ã ã§ãã£ã«ã¿ãŒãæ¥ç¶ããåŸ (ãã£ãã«ãŒã¯æ¥ç¶ããŸããã§ãã)ãããã«ãã£ãŠæåã°ã©ããäœæããŸããããã®ããŒãã¯æ§é ã®ã€ã³ã¹ã¿ã³ã¹ã§ãã MSãã£ã«ã¿ãŒããšããžã¯ãªã³ã¯ã®ã€ã³ã¹ã¿ã³ã¹ã§ã MSãã¥ãŒ.
ãã£ãã«ãŒã®èå°è£ã®æŽ»å
ãã£ãã«ãŒã¯ããã®çºçæºããã£ã«ã¿ãªã³ã°ãããã®ã§ãããšã話ããŸããããããã¯ãã¹ãŠçå®ã§ã¯ãããŸããã§ããããã£ãã«ãŒã¯ãæèšã«å¿ããŠæ©èœãå®è¡ãããªããžã§ã¯ãã§ã åŠçããïŒïŒ æ¥ç¶ãããŠããåè·¯ (ã°ã©ã) ã®ãã¹ãŠã®ãã£ã«ã¿ãŒã C ããã°ã©ã ã§ãã£ãã«ãŒãã°ã©ã ãã£ã«ã¿ãŒã«æ¥ç¶ãããšãä»åŸãªãã«ãããŸã§å¶åŸ¡ããã°ã©ãããã£ãã«ãŒã«è¡šç€ºãããŸããæ¥ç¶åŸããã£ãã«ãŒã¯ã管çãå§èšãããã°ã©ãã®æ€æ»ãéå§ããã°ã©ããå«ããã£ã«ã¿ãŒã®ãªã¹ããäœæããŸããåããã£ã«ã¿ãŒã 2 åãã«ãŠã³ããããªãããã«ãæ€åºããããã£ã«ã¿ãŒã«ãã§ãã¯ããã¯ã¹ãå ¥ããŠããŒã¯ããŸãã èŠãŠãæ€çŽ¢ã¯åãã£ã«ã¿ãæã€ãªã³ã¯ããŒãã«ãå©çšããŠè¡ãããŸãã
ã°ã©ãã®ç޹ä»ãã¢ãŒäžã«ããã£ãã«ãŒã¯ãã£ã«ã¿ãŒã®äžã«ããŒã¿ ãããã¯ã®ãœãŒã¹ãšããŠæ©èœãããã®ãå°ãªããšã 1 ã€ãããã©ããããã§ãã¯ããŸããäœããªãå Žåãã°ã©ãã¯æ£ãããªããšã¿ãªããããã£ãã«ãŒãã¯ã©ãã·ã¥ããŸãã
ã°ã©ãããæ£ããããšå€æããå ŽåãèŠã€ãã£ããã£ã«ã¿ãŒããšã«åæåã®ããã«é¢æ°ãåŒã³åºãããŸãã ååŠç()ãæ¬¡ã®åŠçãµã€ã¯ã«ã®ç¬éãæ¥ããšãã (ããã©ã«ãã§ã¯ 10 ããªç§ããš)ããã£ãã«ãŒã¯é¢æ°ãåŒã³åºããŸãã åŠçããïŒïŒ 以åã«èŠã€ãã£ããã¹ãŠã®ãœãŒã¹ ãã£ã«ã¿ãŒã«å¯ŸããŠã次ã«ãªã¹ãå ã®æ®ãã®ãã£ã«ã¿ãŒã«å¯ŸããŠããã£ã«ã¿ãŒã«å ¥åãªã³ã¯ãããå Žåã颿°ãå®è¡ããŸãã åŠçããïŒïŒ å ¥åãªã³ã¯ ãã¥ãŒã空ã«ãªããŸã§ç¹°ãè¿ããŸãããã®åŸããªã¹ãå ã®æ¬¡ã®ãã£ã«ã¿ã«ç§»åããå ¥åãªã³ã¯ã«ã¡ãã»ãŒãžããªããªããŸã§ãã£ã«ã¿ããã¹ã¯ããŒã«ãããŸãããã£ãã«ãŒã¯ããªã¹ããçµäºãããŸã§ãã£ã«ã¿ãŒãããã£ã«ã¿ãŒãžãšç§»åããŸããããã§ãµã€ã¯ã«ã®åŠçãå®äºããŸãã
ããã§ã¿ãã«ã«æ»ãããã®ãããªãšã³ãã£ãã£ãã¡ãã£ã¢ ã¹ããªãŒããŒã«è¿œå ãããçç±ã«ã€ããŠèª¬æããŸããäžè¬ã«ããã£ã«ã¿ãŒå ã§åäœããã¢ã«ãŽãªãºã ãå¿ èŠãšããããŒã¿ã®éã¯äžèŽãããå ¥åã§åä¿¡ãããããŒã¿ ãããã¡ãŒã®ãµã€ãºã®åæ°ã§ã¯ãããŸãããããšãã°ãé«éããŒãªãšå€æãå®è¡ãããã£ã«ã¿ãŒãäœæããŠããŸãããå®çŸ©äžããµã€ãºã 512 ã®ã¹ãä¹ã§ããããŒã¿ ãããã¯ã®ã¿ãåŠçã§ããŸãã 160ã«ãŠã³ããšããŸããããããŒã¿ãé»è©±ãã£ãã«ã«ãã£ãŠçæãããå Žåãå ¥ååŽã®åã¡ãã»ãŒãžã®ããŒã¿ ãããã¡ãŒãã XNUMX åã®ä¿¡å·ãµã³ãã«ãåŸãããŸããå¿ èŠãªéã®ããŒã¿ãååšãããŸã§ã¯ãå ¥åããããŒã¿ãåéããªãããã«èªæãããŸãããã ããã®å Žåããã£ãã«ãŒãšã®è¡çªãçºçããå ¥åãªã³ã¯ã空ã«ãªããŸã§ãã£ã«ã¿ãŒãã¹ã¯ããŒã«ããããšããŠã倱æããŸãã以åã¯ããã®ã«ãŒã«ããã£ã«ã¿ãŒã® XNUMX çªç®ã®ååãšããŠæå®ããŸããããã®ååã«åŸã£ãŠããã£ã«ã¿ãŒã® process() 颿°ã¯å ¥åãã¥ãŒãããã¹ãŠã®ããŒã¿ãååŸããå¿ èŠããããŸãã
ããã«ããããã¯å šäœãã€ãŸããããã¯å šäœããååŸã§ããªããããå ¥åãã 512 åã®ãµã³ãã«ã®ã¿ãååŸããããšã¯ã§ããŸããããã£ã«ã¿ãŒã¯ 640 åã®ãµã³ãã«ãååŸãããã®ãã¡ã® 512 åã䜿çšããããŒã¿ã®æ°ããéšåãèç©ããåã«æ®ãã䜿çšããå¿ èŠããããŸãããããã£ãŠããã£ã«ã¿ãŒã¯ããã®äž»ãªæ©èœã«å ããŠãå ¥åããŒã¿ã®äžéã¹ãã¬ãŒãžã®ããã®è£å©ã¢ã¯ã·ã§ã³ãæäŸããå¿ èŠããããŸããã¡ãã£ã¢ ã¹ããªãŒããšãã®äžè¬çãªåé¡ã®è§£æ±ºçã®éçºè ã¯ãã¿ãã«ã䜿çšããŠãã®åé¡ã解決ããç¹å¥ãªãªããžã§ã¯ã MSBufferizer (ãããã¡ã©ãŒ) ãéçºããŸããã
ãããã¡ã©ã€ã¶ãŒ (MSBufferizer)
ããã¯ããã£ã«ã¿ãŒå
ã«å
¥åããŒã¿ãèç©ãããã£ã«ã¿ãŒ ã¢ã«ãŽãªãºã ãå®è¡ããã®ã«ååãªæ
å ±éãåŸããããšããã«ãåŠçã®ããã«ããŒã¿ã®éä¿¡ãéå§ãããªããžã§ã¯ãã§ãããããã¡ãããŒã¿ãèç©ããŠããéããã£ã«ã¿ã¯ããã»ããµã®åŠçèœåã䜿ãæãããã«ã¢ã€ãã« ã¢ãŒãã§åäœããŸãããã ãããããã¡ã©ãŒããã®èªã¿åã颿°ããŒã以å€ã®å€ãè¿ããšããã«ããã£ã«ã¿ãŒã® process() 颿°ã¯ãããã¡ã©ãŒããå¿
èŠãªãµã€ãºã®ããŒã¿ââãååŸããããŒã¿ã䜿ãæãããããŸã§åŠçãéå§ããŸãã
ãŸã å¿
èŠã§ãªãããŒã¿ã¯ã¿ãã«ã®æåã®èŠçŽ ãšããŠãããã¡å
ã«æ®ããå
¥åããŒã¿ã®åŸç¶ã®ãããã¯ããã®èŠçŽ ã«æ·»ä»ãããŸãã
ãããã¡ãèšè¿°ããæ§é äœã¯æ¬¡ã®ãšããã§ãã
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 ãã€ããã³ããŒãããæç¹ã§ã³ããŒã¯çµäºããŸããããŒã¿ ãããã¯ã®éäžã§ã¹ããŒã¹ãè¶³ããªããªã£ãå Žåããã®ã¡ãã»ãŒãžã§ã¯ãããŒã¿ ãããã¯ã¯ã³ããŒãããŠããªãæ®ãã®éšåã«æžããããŸããæ¬¡åé»è©±ãããããšãã¯ããã®æç¹ããã³ããŒãç¶è¡ãããŸãã
çŸåšãããã¡å ã§å©çšå¯èœãªããŒã¿éãèªã¿åã:
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 ãã£ã«ã¿ãŒã§ã¯ããµã³ãã«å ã®ãã€ãããããã¯ãŒã¯é ãããã¹ãé ã«åé 眮ããŸãã
次ã®èšäºã§ã¯ããã£ãã«ãŒã®è² è·ãèŠç©ããåé¡ãšãã¡ãã£ã¢ ã¹ããªãŒããŒã®é床ã®ã³ã³ãã¥ãŒãã£ã³ã°è² è·ã«å¯ŸåŠããæ¹æ³ã«ã€ããŠèª¬æããŸãã
åºæïŒ habr.com
