UIP中的psock_generator_send()的宏分析
在一些开发软件中,经常会遇到宏定义。为理解程序设置障碍。比如UIP中的代码就有很多宏定义,让人难以理解。本次只是抛砖引玉,便于以后遇到了,怎么分析。
1、PT_THREAD定义
#define PT_THREAD(name_args) char name_args
下面是要分析的函数,源代码如下:
PT_THREAD(psock_generator_send(register struct psock *s,unsigned short (*generate)(void *), void *arg))
{
PT_BEGIN(&s->psockpt);
if(generate == NULL) {
PT_EXIT(&s->psockpt);
}
s->sendlen = generate(arg);
s->sendptr = uip_appdata;
s->state = STATE_NONE;
do {
if(uip_rexmit()) {
generate(arg);
}
PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s));
} while(s->sendlen > 0);
s->state = STATE_NONE;
PT_END(&s->psockpt);
}
其实这只是执行了一次替换:
char psock_generator_send(register struct psock *s,unsigned short (*generate)(void *), void *arg)
2、PT_BEGIN宏定义
#define LC_RESUME(s) switch(s) { case 0:
#define PT_BEGIN(pt) { LC_RESUME((pt)->lc)
上面两句就是:
{ switch(s) { case 0:
3、PT_END宏定义;
#define LC_END(s) }
#define LC_INIT(s) s = 0;
#define PT_INIT(pt) LC_INIT((pt)->lc)
#define PT_END(pt) LC_END((pt)->lc); PT_INIT(pt); return PT_ENDED; }
上面4句就是:
}s->psockpt.lc = 0;return PT_ENDED;}
上面的内容,看似基础,但是不简单。