๊ธ์ ์์ฌ๋ ์ ๊ธ์์ ๊ฐ์ ธ์์ต๋๋ค.
๋ฐ์ดํฐ ์ด๋ ๋ฉ์ปค๋์ฆ
- ๋ฐ์ดํฐ ๋ธ๋ก dblk_t
- ๋ฉ์์ง mblk_t
- ๋ฉ์์ง mblk_t ์์ ์ ์ํ ํจ์
- ๋๊ธฐ์ด queue_t
- ๋๊ธฐ์ด ์์ ์ ์ํ ํจ์ queue_t
- ํํฐ ์ฐ๊ฒฐ
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ทธ๋ํ์ ์ ํธ ์ง์
- ํฐ์ปค์ ํ๋ ๋นํ์ธ๋ ์คํ ๋ฆฌ
- ๋ฒํผ๋ผ์ด์ (MSBufferizer)
- MSBufferizer ์์ ์ ์ํ ํจ์
๊ณผ๊ฑฐ์
๋ฐ์ดํฐ ์ด๋ ๋ฉ์ปค๋์ฆ
๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์ ๋ฐ์ดํฐ ์ด๋์ ๊ตฌ์กฐ์ ์ค๋ช ๋ ๋๊ธฐ์ด์ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค. queue_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 โ ์ฐธ์กฐ ์นด์ดํฐ, 0์ ๋๋ฌํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ด ๋ธ๋ก์ ์ญ์ ํ๋ผ๋ ์ ํธ ์ญํ ์ ํฉ๋๋ค. ํจ์์ ์ํด ๋ฐ์ดํฐ ๋ธ๋ก์ด ์์ฑ๋ ๊ฒฝ์ฐ datab_alloc() , ๋ฐ์ดํฐ ๋ฒํผ๋ ํค๋ ๋ฐ๋ก ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น๋ฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ์๋ ๋ฒํผ๊ฐ ๋ณ๋๋ก ์ด๋๊ฐ์ ์์นํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ฒํผ์๋ ํํฐ๋ก ์ฒ๋ฆฌํ๋ ค๋ ์ ํธ ์ํ์ด๋ ๊ธฐํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
๋ฐ์ดํฐ ๋ธ๋ก์ ์ ์ธ์คํด์ค๋ ๋ค์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค.
dblk_t *datab_alloc(int size);
์ ๋ ฅ ๋งค๊ฐ๋ณ์๋ก ๋ธ๋ก์ด ์ ์ฅํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ ๊ณต๋ฉ๋๋ค. ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ถ๋ถ์ ํค๋(๊ตฌ์กฐ)๋ฅผ ๋ฐฐ์นํ๊ธฐ ์ํด ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ํญ์ ์ด๋ฐ ํ์์ด ๋ฐ์ํ๋ ๊ฒ์ ์๋๋ฉฐ, ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ ๋ฒํผ๊ฐ ๋ฐ์ดํฐ ๋ธ๋ก ํค๋์ ๋ณ๋๋ก ์์นํ ์ ์์ต๋๋ค. ๊ตฌ์กฐ๋ฅผ ์์ฑํ ๋ ํด๋น ํ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค. db_base ๋ฐ์ดํฐ ์์ญ์ ์์ ๋ถ๋ถ์ ๊ฐ๋ฆฌํจ๋ค. db_lim ๋๊น์ง. ๋งํฌ ์ db_ref 1๋ก ์ค์ ๋์ด ์์ต๋๋ค. ๋ฐ์ดํฐ ์ง์ฐ๊ธฐ ๊ธฐ๋ฅ ํฌ์ธํฐ๊ฐ 0์ผ๋ก ์ค์ ๋ฉ๋๋ค.
๋ฉ์์ง 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_prev, b_next, ์ด์ค ์ฐ๊ฒฐ ๋ชฉ๋ก(ํ์ธ ํ)์ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํฉ๋๋ค. queue_t).
๊ทธ๋ฐ ๋ค์ ํฌ์ธํฐ๊ฐ ๋ํ๋ฉ๋๋ค. b_cont, ๋ฉ์์ง๊ฐ ํํ์ ์ผ๋ถ์ธ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ํํ์ ๋ง์ง๋ง ๋ฉ์์ง์ ๊ฒฝ์ฐ ์ด ํฌ์ธํฐ๋ null๋ก ์ ์ง๋ฉ๋๋ค.
๋ค์์ผ๋ก ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ด ๋๋ค. b_datap, ๋ฉ์์ง๊ฐ ์กด์ฌํฉ๋๋ค. ๊ทธ ๋ค์๋ ๋ธ๋ก ๋ฐ์ดํฐ ๋ฒํผ ๋ด๋ถ ์์ญ์ ๋ํ ํฌ์ธํฐ๊ฐ ์ต๋๋ค. ํ๋ b_rptr ๋ฒํผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. ํ๋ b_wptr ๋ฒํผ์ ๋ํ ์ฐ๊ธฐ๊ฐ ์ํ๋ ์์น๋ฅผ ๋ํ๋ ๋๋ค.
๋๋จธ์ง ํ๋๋ ์๋น์ค ์ฑ๊ฒฉ์ ๊ฐ์ง๋ฉฐ ๋ฐ์ดํฐ ์ ์ก ๋ฉ์ปค๋์ฆ์ ์๋๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
์๋์๋ ์ด๋ฆ์ด ํฌํจ๋ ๋จ์ผ ๋ฉ์์ง๊ฐ ์์ต๋๋ค. m1 ๋ฐ ๋ฐ์ดํฐ ๋ธ๋ก d1.
๋ค์ ๊ทธ๋ฆผ์ ์ธ ๊ฐ์ ๋ฉ์์ง๋ก ๊ตฌ์ฑ๋ ํํ์ ๋ณด์ฌ์ค๋๋ค. m1, m1_1, m1_2.
๋ฉ์์ง ๊ธฐ๋ฅ mblk_t
์๋ก์ด ๋ฉ์์ง mblk_t ํจ์์ ์ํด ์์ฑ๋จ:
mblk_t *allocb(int size, int pri);
๊ทธ๋ ๋ ๊ธฐ์ต ์์ ์๋ก์ด ๋ฉ์์ง๋ฅผ ๋จ๊ฒผ๋ค mblk_t ์ง์ ๋ ํฌ๊ธฐ์ ๋ฐ์ดํฐ ๋ธ๋ก ํฌํจ ํฌ๊ธฐ, ๋ ๋ฒ์งธ ์ธ์ - pri ์ด ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค. 0์ผ๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค. ํจ์๊ฐ ์๋ํ๋ ๋์ ์ ๋ฉ์์ง์ ๊ตฌ์กฐ๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. 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๋ฐ์ดํธ ๊ฒฝ๊ณ๋ฅผ ๋ฐ๋ผ ์ ๋ ฌ๋์ด์ผ ํจ์ ๋ํ๋ด๋ ํ๋๊ทธ(ํจ๋ฉ์ XNUMX์ผ๋ก ์ํ๋จ)
๊ธฐ์กด ๋ฉ์์ง ๋ฐ์ดํฐ ๋ฒํผ์ ์ถฉ๋ถํ ๊ณต๊ฐ์ด ์์ผ๋ฉด ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์๋ ๋ฐ์ดํฐ ๋ค์ ๋ถ์ฌ๋ฃ์ด์ง๋๋ค. ๋ฉ์์ง ๋ฐ์ดํฐ ๋ฒํผ์ ์ฌ์ ๊ณต๊ฐ์ด ์ ์ ๊ฒฝ์ฐ ํฌ๊ธฐ, ์ถฉ๋ถํ ๋ฒํผ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์ ๋ฉ์์ง๊ฐ ์์ฑ๋๊ณ ๋ฐ์ดํฐ๊ฐ ํด๋น ๋ฒํผ์ ๋ณต์ฌ๋ฉ๋๋ค. ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณธ ๋ฉ์์ง์ ์ฐ๊ฒฐ๋ ์ ๋ฉ์์ง์ ๋๋ค. b_cont. ์ด ๊ฒฝ์ฐ ๋ฉ์์ง๋ ํํ๋ก ๋ณํฉ๋๋ค.
ํํ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
void msgappend(mblk_t *mp, const char *data, int size, bool_t pad);
๊ทธ๋ ๋ ํํ์์ ๋ง์ง๋ง ๋ฉ์์ง๋ฅผ ์ฐพ์ ๊ฒ์ ๋๋ค(๊ทธ๋ b_cont null์ด ๋จ) ์ด ๋ฉ์์ง์ ๋ํ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ๋ถ๋ก().
๋ค์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง๋ ํํ์ ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
int msgdsize(const mblk_t *mp);
ํํ์ ๋ชจ๋ ๋ฉ์์ง๋ฅผ ๋ฐ๋ณตํ๊ณ ํด๋น ๋ฉ์์ง์ ๋ฐ์ดํฐ ๋ฒํผ์ ์๋ ์ด ๋ฐ์ดํฐ ์์ ๋ฐํํฉ๋๋ค. ๊ฐ ๋ฉ์์ง์ ๋ํด ๋ฐ์ดํฐ ์์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋ฉ๋๋ค.
mp->b_wptr - mp->b_rptr
๋ ๊ฐ์ ํํ์ ๊ฒฐํฉํ๋ ค๋ฉด ๋ค์ ํจ์๋ฅผ ์ฌ์ฉํ์ธ์.
mblk_t *concatb(mblk_t *mp, mblk_t *newm);
๊ทธ๋ ๋ ํํ์ ์ถ๊ฐํฉ๋๋ค ๋ด์ ํํ์ ๊ผฌ๋ฆฌ๊น์ง mp ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ ํํ์ ๋ง์ง๋ง ๋ฉ์์ง์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
ํ์ํ ๊ฒฝ์ฐ ํํ์ ๋จ์ผ ๋ฐ์ดํฐ ๋ธ๋ก์ด ํฌํจ๋ ํ๋์ ๋ฉ์์ง๋ก ๋ฐ๋ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ ํจ์์ ์ํด ์ํ๋ฉ๋๋ค.
void msgpullup(mblk_t *mp,int len);
์ธ์์ธ ๊ฒฝ์ฐ ๋ -1์ด๋ฉด ํ ๋น๋ ๋ฒํผ์ ํฌ๊ธฐ๊ฐ ์๋์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค. ๋ง์ฝ์ ๋ ์์์ด๋ฉด ์ด ํฌ๊ธฐ์ ๋ฒํผ๊ฐ ์์ฑ๋๊ณ ํํ ๋ฉ์์ง ๋ฐ์ดํฐ๊ฐ ์ฌ๊ธฐ์ ๋ณต์ฌ๋ฉ๋๋ค. ๋ฒํผ๊ฐ ๋ถ์กฑํ๋ฉด ๋ณต์ฌ๊ฐ ์ค์ง๋ฉ๋๋ค. ํํ์ ์ฒซ ๋ฒ์งธ ๋ฉ์์ง๋ ๋ณต์ฌ๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์ ํฌ๊ธฐ ๋ฒํผ๋ฅผ ์์ ํฉ๋๋ค. ๋๋จธ์ง ๋ฉ์์ง๋ ์ญ์ ๋๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ํ์ผ๋ก ๋ฐํ๋ฉ๋๋ค.
๊ตฌ์กฐ๋ฌผ์ ์ญ์ ํ ๋ mblk_t ํธ์ถํ ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ๊ณ ๋ ค๋ฉ๋๋ค. ํ๋ฆฌ๋น() 0์ผ๋ก ํ๋ช ๋๋ฉด ๋ฐ์ดํฐ ๋ฒํผ๊ฐ ์ธ์คํด์ค์ ํจ๊ป ์ญ์ ๋ฉ๋๋ค. 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()๋ฅผ ํธ์ถํฉ๋๋ค.
๋ ๊ฐ์ ํํ์ ํ๋๋ก ๊ฒฐํฉ:
mblk_t *concatb(mblk_t *mp, mblk_t *newm);
๋ฉ์์ง ๋ด์ ์ ์ฒจ๋ถ๋ฉ๋๋ค mp.
๋จ์ผ ๋ฉ์์ง์ ๋ณต์ฌ๋ณธ ๋ง๋ค๊ธฐ:
mblk_t *copyb(const mblk_t *mp);
๋ชจ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ด ํฌํจ๋ ํํ ๋ณต์ฌ ์๋ฃ:
mblk_t *copymsg(const mblk_t *mp);
ํํ์ ์์๋ ํจ์์ ์ํด ๋ณต์ฌ๋ฉ๋๋ค. ๋ณต์ฌ().
๋ฉ์์ง์ ๊ฐํธํ ๋ณต์ฌ๋ณธ ๋ง๋ค๊ธฐ mblk_t. ์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ณต์ฌ๋์ง ์์ง๋ง ์ฐธ์กฐ ์นด์ดํฐ๋ ์ฆ๊ฐํฉ๋๋ค. db_ref:
mblk_t *dupb(mblk_t *mp);
ํํ์ ๊ฒฝ๋ ๋ณต์ฌ๋ณธ ๋ง๋ค๊ธฐ. ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ณต์ฌ๋์ง ์์ผ๋ฉฐ ํด๋น ์ฐธ์กฐ ์นด์ดํฐ๋ง ์ฆ๊ฐ๋ฉ๋๋ค. db_ref:
mblk_t *dupmsg(mblk_t* m);
ํํ์ ๋ชจ๋ ๋ฉ์์ง๋ฅผ ํ๋์ ๋ฉ์์ง๋ก ๋ฌถ๊ธฐ:
void msgpullup(mblk_t *mp,size_t len);
๋ง์ฝ ์ธ์ ๋ -1์ด๋ฉด ํ ๋น๋ ๋ฒํผ์ ํฌ๊ธฐ๊ฐ ์๋์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค.
๋ฉ์์ง ์ญ์ , ํํ:
void freemsg(mblk_t *mp);
๋ฐ์ดํฐ ๋ธ๋ก์ ์ฐธ์กฐ ์นด์ดํธ๋ 1์ฉ ๊ฐ์ํฉ๋๋ค. 0์ ๋๋ฌํ๋ฉด ๋ฐ์ดํฐ ๋ธ๋ก๋ ์ญ์ ๋ฉ๋๋ค.
๋ฉ์์ง ๋๋ ํํ์ ์ด ๋ฐ์ดํฐ ์์ ๊ณ์ฐํฉ๋๋ค.
size_t msgdsize(const mblk_t *mp);
๋๊ธฐ์ด ๋์์ ๋ฉ์์ง ๊ฒ์:
mblk_t *ms_queue_peek_last (q);
ํ ๋ฉ์์ง์ ์์ฝ๋ ํ๋ ๋ด์ฉ์ ๋ค๋ฅธ ๋ฉ์์ง๋ก ๋ณต์ฌํฉ๋๋ค(์ค์ ๋ก ์ด๋ฌํ ํ๋์๋ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์์ ์ฌ์ฉํ๋ ํ๋๊ทธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค).
mblk_meta_copy(const mblk_t *source, mblk *dest);
์ด queue_t
๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์ ๋ฉ์์ง ํ๋ ์ํ ์ด์ค ์ฐ๊ฒฐ ๋ชฉ๋ก์ผ๋ก ๊ตฌํ๋ฉ๋๋ค. ๊ฐ ๋ชฉ๋ก ์์์๋ ์ ํธ ์ํ์ด ์๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ํ ํฌ์ธํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ํ ํฌ์ธํฐ๋ง ์ฐจ๋ก๋ก ์ด๋ํ๊ณ ๋ฐ์ดํฐ ์์ฒด๋ ์์ง์ด์ง ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ ๊ฒ๋ค. ํด๋น ๋งํฌ๋ง ์ด๋๋ฉ๋๋ค.
๋๊ธฐ์ด์ ์ค๋ช
ํ๋ ๊ตฌ์กฐ queue_t, ์๋์ ํ์๋จ:
typedef struct _queue
{
mblk_t _q_stopper; /* "ะฅะพะปะพััะพะน" ัะปะตะผะตะฝั ะพัะตัะตะดะธ, ะฝะต ัะบะฐะทัะฒะฐะตั ะฝะฐ ะดะฐะฝะฝัะต, ะธัะฟะพะปัะทัะตััั ัะพะปัะบะพ ะดะปั ัะฟัะฐะฒะปะตะฝะธั ะพัะตัะตะดัั. ะัะธ ะธะฝะธัะธะฐะปะธะทะฐัะธะธ ะพัะตัะตะดะธ (qinit()) ะตะณะพ ัะบะฐะทะฐัะตะปะธ ะฝะฐัััะฐะธะฒะฐัััั ัะฐะบ, ััะพะฑั ะพะฝะธ ัะบะฐะทัะฒะฐะปะธ ะฝะฐ ะฝะตะณะพ ัะฐะผะพะณะพ. */
int q_mcount; // ะะพะปะธัะตััะฒะพ ัะปะตะผะตะฝัะพะฒ ะฒ ะพัะตัะตะดะธ.
} queue_t;
๊ตฌ์กฐ์๋ ํ๋(ํฌ์ธํฐ)๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. _q_์คํ ํผ *mblk_t๋ฅผ ์
๋ ฅํ๋ฉด ๋๊ธฐ์ด์ ์ฒซ ๋ฒ์งธ ์์(๋ฉ์์ง)๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๊ตฌ์กฐ์ ๋ ๋ฒ์งธ ํ๋๋ ๋๊ธฐ์ด์ ์๋ ๋ฉ์์ง์ ์นด์ดํฐ์
๋๋ค.
์๋ ๊ทธ๋ฆผ์ 1๊ฐ์ ๋ฉ์์ง m4, m1, m2, m3๋ฅผ ํฌํจํ๋ q4์ด๋ผ๋ ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋ค์ ๊ทธ๋ฆผ์ 1๊ฐ์ ๋ฉ์์ง m4,m1,m2,m3๋ฅผ ํฌํจํ๋ q4์ด๋ผ๋ ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ฉ์์ง m2๋ ๋ ๊ฐ์ ์ถ๊ฐ ๋ฉ์์ง m2_1 ๋ฐ m2_2๋ฅผ ํฌํจํ๋ ํํ์ ํค๋์
๋๋ค.
๋๊ธฐ์ด ์์ ์ ์ํ ํจ์ queue_t
๋๊ธฐ์ด ์ด๊ธฐํ:
void qinit(queue_t *q);
๋ถ์ผ _q_์คํ ํผ (์ดํ โ์คํ ํผโ๋ผ ์นญํจ)์ ๋ค์ ํจ์์ ์ํด ์ด๊ธฐํ๋ฉ๋๋ค. mblk_init(), ์ด์ ์์์ ๋ค์ ์์ ํฌ์ธํฐ๊ฐ ์์ ์ ๊ฐ๋ฆฌํค๋๋ก ์กฐ์ ๋ฉ๋๋ค. ๋๊ธฐ์ด ์์ ์นด์ดํฐ๊ฐ 0์ผ๋ก ์ฌ์ค์ ๋ฉ๋๋ค.
์ ์์(๋ฉ์์ง) ์ถ๊ฐ:
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);
๋ ผ์ ๋ฐฉ๋ฒ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๋๊ธฐ์ด ์์ ์นด์ดํฐ๋ 0์ผ๋ก ์ค์ ๋ฉ๋๋ค.
ํ์ ๋ง์ง๋ง ์์์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ฝ๋ ๋งคํฌ๋ก:
mblk_t * qlast(queue_t *q);
๋ฉ์์ง ๋๊ธฐ์ด๋ก ์์ ํ ๋ ๋ค์ ์ฌํญ์ ์ ์ํ์ธ์. ms_queue_put(q, m) ๋ฉ์์ง์ ๋ํ ๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์๊ฐ ๋ฐ๋ณต๋ฉ๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ ์ง๋ฉ๋๋ค. ๋น์ทํ๊ฒ ํ๋ํ๋ค ms_queue_next(q,m).
ํํฐ ์ฐ๊ฒฐ
์์ ์ค๋ช ๋ ๋๊ธฐ์ด์ ํ ํํฐ์์ ๋ค๋ฅธ ํํฐ๋ก ๋๋ ํ๋์์ ์ฌ๋ฌ ํํฐ๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํํฐ์ ํด๋น ์ฐ๊ฒฐ์ ๋ฐฉํฅ์ฑ ๊ทธ๋ํ๋ฅผ ํ์ฑํฉ๋๋ค. ํํฐ์ ์ ๋ ฅ ๋๋ ์ถ๋ ฅ์ ์ผ๋ฐ ๋จ์ด "ํ"์ด๋ผ๊ณ ํฉ๋๋ค. ํํฐ๊ฐ ์๋ก ์ฐ๊ฒฐ๋๋ ์์๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ๋ "์ ํธ ์ง์ "์ด๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค. ์ ํธ ์ง์ ์ ๊ตฌ์กฐ์ ๋๋ค. _MSCํฌ์ธํธ์๋ ํํฐ์ ๋ํ ํฌ์ธํฐ์ ํด๋น ํ ์ค ํ๋์ ๋ฒํธ๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ํํฐ์ ์ ๋ ฅ ๋๋ ์ถ๋ ฅ ์ค ํ๋์ ์ฐ๊ฒฐ์ ์ค๋ช ํฉ๋๋ค.
๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ทธ๋ํ์ ์ ํธ ์ง์
typedef struct _MSCPoint{
struct _MSFilter *filter; // ะฃะบะฐะทะฐัะตะปั ะฝะฐ ัะธะปััั ะผะตะดะธะฐัััะธะผะตัะฐ.
int pin; // ะะพะผะตั ะพะดะฝะพะณะพ ะธะท ะฒั
ะพะดะพะฒ ะธะปะธ ะฒัั
ะพะดะพะฒ ัะธะปัััะฐ, ั.ะต. ะฟะธะฝ.
} MSCPoint;
ํํฐ ํ์ ๋ฒํธ๋ 0๋ถํฐ ์์๋ฉ๋๋ค.
๋ฉ์์ง ํ์ ์ํ ๋ ํ์ ์ฐ๊ฒฐ์ ๋ค์ ๊ตฌ์กฐ๋ก ์ค๋ช ๋ฉ๋๋ค. _MSํ์๋ ๋ฉ์์ง ํ์ ์ฐ๊ฒฐ๋๋ ๋ ์ ํธ ์ง์ ์ ๋ํ ํฌ์ธํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
typedef struct _MSQueue
{
queue_t q;
MSCPoint prev;
MSCPoint next;
}MSQueue;
์ฐ๋ฆฌ๋ ์ด ๊ตฌ์กฐ๋ฅผ ์ ํธ ๋งํฌ๋ผ๊ณ ๋ถ๋ฅผ ๊ฒ์ ๋๋ค. ๊ฐ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ ํํฐ์๋ ์ ๋ ฅ ๋งํฌ ํ ์ด๋ธ๊ณผ ์ถ๋ ฅ ๋งํฌ ํ ์ด๋ธ(MSQueue). ํ ์ด๋ธ ํฌ๊ธฐ๋ ํํฐ๋ฅผ ์์ฑํ ๋ ์ค์ ๋ฉ๋๋ค. ์ด๋ฏธ ๋ด๋ณด๋ธ ์ ํ์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์ ์ ์ํํ์ต๋๋ค. MSFilterDesc, ์์ฒด ํํฐ๋ฅผ ๊ฐ๋ฐํ์ ๋. ๋ค์์ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์ ํํฐ๋ฅผ ์ค๋ช ํ๋ ๊ตฌ์กฐ์ ๋๋ค. 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ํํฐ, ๊ฐ์ฅ์๋ฆฌ๋ ๋งํฌ์ ์ธ์คํด์ค์ ๋๋ค. MSQueue.
ํฐ์ปค์ ํ๋ ๋นํ์ธ๋ ์คํ ๋ฆฌ
๋ด๊ฐ ํฐ์ปค๊ฐ ์ง๋๊ธฐ ์์ค์ ๋ํ ํํฐ๋ผ๊ณ ๋งํ์ ๋, ๊ทธ๊ฒ์ ๊ทธ๊ฒ์ ๋ํ ์์ ํ ์ง์ค์ด ์๋์์ต๋๋ค. ํฐ์ปค๋ ์๊ณ์์ ๊ธฐ๋ฅ์ ์คํํ๋ ๊ฐ์ฒด์ ๋๋ค. ํ๋ก์ธ์ค() ์ฐ๊ฒฐ๋ ํ๋ก(๊ทธ๋ํ)์ ๋ชจ๋ ํํฐ. C ํ๋ก๊ทธ๋จ์ ๊ทธ๋ํ ํํฐ์ ํฐ์ปค๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์ง๊ธ๋ถํฐ ๋ ๋๊น์ง ํฐ์ปค๊ฐ ์ ์ดํ ๊ทธ๋ํ๋ฅผ ํฐ์ปค์ ํ์ํฉ๋๋ค. ์ฐ๊ฒฐ ํ ํฐ์ปค๋ ๊ด๋ฆฌ์ ๋งก๊ฒจ์ง ๊ทธ๋ํ๋ฅผ ๊ฒ์ฌํ๊ธฐ ์์ํ์ฌ ์ด๋ฅผ ํฌํจํ๋ ํํฐ ๋ชฉ๋ก์ ์์ฑํฉ๋๋ค. ๋์ผํ ํํฐ๋ฅผ ๋ ๋ฒ "๊ณ์ฐ"ํ์ง ์๊ธฐ ์ํด ๊ฒ์๋ ํํฐ์ ํ์ธ๋์ ๋ฐฐ์นํ์ฌ ํ์ํฉ๋๋ค. ๋ณธ. ๊ฐ ํํฐ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋งํฌ ํ ์ด๋ธ์ ์ด์ฉํ์ฌ ๊ฒ์์ ์ํํฉ๋๋ค.
๊ทธ๋ํ๋ฅผ ์๊ฐํ๋ ๋์ ํฐ์ปค๋ ํํฐ ์ค์ ๋ฐ์ดํฐ ๋ธ๋ก์ ์์ค ์ญํ ์ ํ๋ ํํฐ๊ฐ ํ๋ ์ด์ ์๋์ง ํ์ธํฉ๋๋ค. ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ๊ทธ๋ํ๊ฐ ์๋ชป๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด ํฐ์ปค๊ฐ ์ถฉ๋ํฉ๋๋ค.
๊ทธ๋ํ๊ฐ "์ฌ๋ฐ๋ฅธ" ๊ฒ์ผ๋ก ํ๋ช ๋๋ฉด ๋ฐ๊ฒฌ๋ ๊ฐ ํํฐ์ ๋ํด ์ด๊ธฐํ๋ฅผ ์ํด ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ ์ฒ๋ฆฌ(). ๋ค์ ์ฒ๋ฆฌ ์ฃผ๊ธฐ(๊ธฐ๋ณธ์ ์ผ๋ก 10๋ฐ๋ฆฌ์ด๋ง๋ค)๊ฐ ์์๋์๋ง์ ํฐ์ปค๋ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. ํ๋ก์ธ์ค() ์ด์ ์ ๋ฐ๊ฒฌ๋ ๋ชจ๋ ์์ค ํํฐ์ ๋ํด, ๊ทธ๋ฐ ๋ค์ ๋ชฉ๋ก์ ์๋ ๋๋จธ์ง ํํฐ์ ๋ํด. ํํฐ์ ์ ๋ ฅ ๋งํฌ๊ฐ ์์ผ๋ฉด ํจ์๋ฅผ ์คํํฉ๋๋ค. ํ๋ก์ธ์ค() ์ ๋ ฅ ๋งํฌ ๋๊ธฐ์ด์ด ๋น ๋๊น์ง ๋ฐ๋ณต๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ชฉ๋ก์ ๋ค์ ํํฐ๋ก ์ด๋ํ์ฌ ์ ๋ ฅ ๋งํฌ์ ๋ฉ์์ง๊ฐ ์์ด์ง ๋๊น์ง "์คํฌ๋กค"ํฉ๋๋ค. ๋ชฉ๋ก์ด ๋๋ ๋๊น์ง ํฐ์ปค๋ ํํฐ์์ ํํฐ๋ก ์ด๋ํฉ๋๋ค. ์ด๊ฒ์ผ๋ก ์ฌ์ดํด ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ฉ๋๋ค.
์ด์ ํํ๋ก ๋์๊ฐ์ ๊ทธ๋ฌํ ์ํฐํฐ๊ฐ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์ ์ถ๊ฐ๋ ์ด์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํํฐ ๋ด๋ถ์์ ์๋ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ ๋ฐ์ดํฐ ์์ ์ผ์นํ์ง ์์ผ๋ฉฐ ์ ๋ ฅ์์ ์์ ๋๋ ๋ฐ์ดํฐ ๋ฒํผ ํฌ๊ธฐ์ ๋ฐฐ์๋ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ 512์ ๊ฑฐ๋ญ์ ๊ณฑ์ธ ๋ฐ์ดํฐ ๋ธ๋ก๋ง ์ฒ๋ฆฌํ ์ ์๋ ๊ณ ์ ํธ๋ฆฌ์ ๋ณํ์ ์ํํ๋ ํํฐ๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค. 160์นด์ดํธ๋ก ํ์. ๋ฐ์ดํฐ๊ฐ ์ ํ ์ฑ๋์ ์ํด ์์ฑ๋ ๊ฒฝ์ฐ ์ ๋ ฅ์ ์๋ ๊ฐ ๋ฉ์์ง์ ๋ฐ์ดํฐ ๋ฒํผ๋ XNUMX๊ฐ์ ์ ํธ ์ํ์ ๊ฐ์ ธ์ต๋๋ค. ํ์ํ ์์ ๋ฐ์ดํฐ๊ฐ ์์ ๋๊น์ง ์ ๋ ฅ์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ฒฝ์ฐ ํฐ์ปค์ ์ถฉ๋์ด ๋ฐ์ํ์ฌ ์ ๋ ฅ ๋งํฌ๊ฐ ๋น์ด ์์ ๋๊น์ง ํํฐ ์คํฌ๋กค์ด ์คํจํ๊ฒ ๋ฉ๋๋ค. ์ด์ ์๋ ์ด ๊ท์น์ ํํฐ์ ์ธ ๋ฒ์งธ ์์น์ผ๋ก ์ง์ ํ์ต๋๋ค. ์ด ์์น์ ๋ฐ๋ฅด๋ฉด ํํฐ์ process() ํจ์๋ ์ ๋ ฅ ๋๊ธฐ์ด์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
๋ํ ์ ์ฒด ๋ธ๋ก๋ง ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฏ๋ก ์ ๋ ฅ์์ 512๊ฐ์ ์ํ๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ํํฐ๋ 640๊ฐ์ ์ํ์ ๊ฐ์ ธ์์ ๊ทธ ์ค 512๊ฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ ๋๋จธ์ง๋ ๋ฐ์ดํฐ์ ์๋ก์ด ๋ถ๋ถ์ ์ถ์ ํ๊ธฐ ์ ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ํํฐ๋ ์ฃผ์ ์์ ์ธ์๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ค๊ฐ ์ ์ฅ์ ์ํ ๋ณด์กฐ ์์ ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ ๊ฐ๋ฐ์์ ์ด ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ํํ์ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํน์ ๊ฐ์ฒด์ธ MSBufferizer(๋ฒํผ๋ฌ)๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค.
๋ฒํผ๋ผ์ด์ (MSBufferizer)
์ด๋ ํํฐ ๋ด๋ถ์ ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํ๊ณ ์ ๋ณด์ ์์ด ํํฐ ์๊ณ ๋ฆฌ์ฆ์ ์คํํ๊ธฐ์ ์ถฉ๋ถํ ๋ ์ฆ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ ์ถํ๊ธฐ ์์ํ๋ ๊ฐ์ฒด์
๋๋ค. ๋ฒํผ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํ๋ ๋์ ํํฐ๋ ํ๋ก์ธ์์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์ฌ์ฉํ์ง ์๊ณ ์ ํด ๋ชจ๋์์ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฒํผ๋ฌ์ ์ฝ๊ธฐ ํจ์๊ฐ 0์ด ์๋ ๊ฐ์ ๋ฐํํ์๋ง์ ํํฐ์ 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, ํ๋ ํฌ๊ธฐ 0์ผ๋ก ์ค์ ๋ฉ๋๋ค.
๋ฉ์์ง ์ถ๊ฐ:
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);
๋ฒํผ์ ์ถ์ ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์์ฒญํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ(๋ฐ์ดํฐ๋ ), ํจ์๋ 0์ ๋ฐํํ๊ณ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ์ ๋ณต์ฌ๋์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฒํผ์ ์๋ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ณต์ฌํฉ๋๋ค. ๋ณต์ฌ ํ์๋ ํํ์ด ์ญ์ ๋๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋ฉ๋๋ค. datalen ๋ฐ์ดํธ๊ฐ ๋ณต์ฌ๋๋ ์๊ฐ ๋ณต์ฌ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๋ฐ์ดํฐ ๋ธ๋ก ์ค๊ฐ์ ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์ด ๋ฉ์์ง์์ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ณต์ฌ๋์ง ์์ ๋๋จธ์ง ๋ถ๋ถ์ผ๋ก ์ถ์๋ฉ๋๋ค. ๋ค์์ ์ ํํ๋ฉด ์ด ์์ ๋ถํฐ ๋ณต์ฌ๊ฐ ๊ณ์๋ฉ๋๋ค.
ํ์ฌ ๋ฒํผ์์ ์ฌ์ฉํ ์ ์๋ ๋ฐ์ดํฐ์ ์์ ์ฝ์ต๋๋ค.
int ms_bufferizer_get_avail(MSBufferizer *obj);
ํ๋๋ฅผ ๋ฐํํฉ๋๋ค. ํฌ๊ธฐ ๋ฒํผ๋ฌ.
๋ฒํผ์ ๋ฐ์ดํฐ ์ผ๋ถ ์ญ์ :
void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);
์ง์ ๋ ๋ฐ์ดํธ ์์ ๋ฐ์ดํฐ๊ฐ ๊ฒ์๋๊ณ ์ญ์ ๋ฉ๋๋ค. ๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ๋ ํ๊ธฐ๋ฉ๋๋ค.
๋ฒํผ์ ๋ชจ๋ ๋ฉ์์ง ์ญ์ :
void ms_bufferizer_flush(MSBufferizer *obj);
๋ฐ์ดํฐ ์นด์ดํฐ๊ฐ 0์ผ๋ก ์ฌ์ค์ ๋ฉ๋๋ค.
๋ฒํผ์ ๋ชจ๋ ๋ฉ์์ง ์ญ์ :
void ms_bufferizer_uninit(MSBufferizer *obj);
์นด์ดํฐ๋ ์ฌ์ค์ ๋์ง ์์ต๋๋ค.
๋ฒํผ ์ ๊ฑฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ํด์ :
void ms_bufferizer_destroy(MSBufferizer *obj);
๋ฒํผ๋ฌ ์ฌ์ฉ ์๋ ์ฌ๋ฌ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ ํํฐ์ ์์ค ์ฝ๋์์ ์ฐพ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด MS_L16_ENC ํํฐ์์๋ ์ํ์ ๋ฐ์ดํธ๋ฅผ ๋คํธ์ํฌ ์์์์ ํธ์คํธ ์์๋ก ์ฌ๋ฐฐ์ดํฉ๋๋ค.
๋ค์ ๊ธ์์๋ ํฐ์ปค ๋ถํ ์ถ์ ๋ฌธ์ ์ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋จธ์์ ๊ณผ๋ํ ์ปดํจํ ๋ถํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ถ์ฒ : habr.com