//1 MEGBT宏——分配一个mbuf.
//mbuf.h
#define MGET(m,how,type){ \
MALLOC((m),struct mbuf *,MSIZE,mbtypes[type],(how)); \
if(m){ \
(m)->m_type = (type); \
MBUFLOCK(mbstat.m_mtypes[type]++;) \
(m)->m_next = (struct mbuf *)NULL; \
(m)->m_nextpkt = (struct mbuf *)NULL; \
(m)->m_data = (m)->m_dat; \
(m)->m_flags = 0; \
}else \
(m) = m_retry((how),(type)); \
}
//uipc_mbuf.c
struct mbuf *m_retry(int i,int t)
{
struct mbuf *m;
m_reclaim(); //此函数可以会调用drain函数(内存用光时)
#define m_retry(i,t) (struct mbuf *)0 //保证只retry一次
MGET(m,i,t);
#undef m_retry
return (m);
}
2 C语言有一个通用技术,它允许程序员把一个结构中的最后一个成员看成是可变长的。
sockaddr或osockaddr结构就用到了这个技巧。