文章资料取自我的禅宗频道。

数据移动机制
- 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 — , , . datab_alloc() , . - . , .
:
dblk_t *datab_alloc(int size);
, . , — datab. , . , db_base , db_lim . db_ref . .
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;
unsigned char *b_wptr;
uint32_t reserved1;
uint32_t reserved2;
#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, , . .
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 size, — pri . BPRI_MED, ( ). 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);
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 — ;
data — , ;
size — ;
pad — , 4 ( ).
, . size, , . , b_cont. .
, :
void msgappend(mblk_t *mp, const char *data, int size, bool_t pad);
( b_cont ) appendb().
:
int msgdsize(const mblk_t *mp);
. :
mp->b_wptr - mp->b_rptr
:
mblk_t *concatb(mblk_t *mp, mblk_t *newm);
newm mp .
, , :
void msgpullup(mblk_t *mp,int len);
len -1, . len , . , . . , .
mblk_t , freeb() , 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);
newm mp.
:
mblk_t *copyb(const mblk_t *mp);
:
mblk_t *copymsg(const mblk_t *mp);
copyb().
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);
len -1, .
, :
void freemsg(mblk_t *mp);
. , .
.
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;
int q_mcount;
} queue_t;
— _q_stopper *mblk_t, () . , .
c q1, 4 m1,m2, m3, m4.

c q1, 4 m1,m2, m3, m4. m2 , m2_1 m2_2.

queue_t
:
void qinit(queue_t *q);
_q_stopper ( "") 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);
how . .
:
mblk_t * qlast(queue_t *q);
, ms_queue_put(q, m) , . . ms_queue_next(q, m).
. . "". , " ". _MSCPoint, , .
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;
MSList *notify_callbacks;
uint32_t last_tick;
MSFilterStats *stats;
int postponed_task;
bool_t seen;
};
typedef struct _MSFilter MSFilter;
, - ( ), , , MSFilter, MSQueue.
— , . , process() () . - , , , . , , . "" , seen. , .
, , , . , .
"", , , preprocess(). ( 10 ), process() , . , process() , . , "" . . .
. , , , , . , , , . 512 . , 160 . , . , . . , 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, size .
:
void ms_bufferizer_put(MSBufferizer *obj, mblk_t *m);
m . size.
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), , data . . . , datalen . , , . .
, :
int ms_bufferizer_get_avail(MSBufferizer *obj);
size .
, :
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, , : l16.c
, .