#ifndef __PT_H__ #define __PT_H__ #include "lc.h" struct pt { lc_t lc; }; #define PT_WAITING 0 //等待 #define PT_YIELDED 1 //锁死线程 #define PT_EXITED 2 //退出 #define PT_ENDED 3 //结束 #define PT_INIT(pt) LC_INIT((pt)->lc) #define PT_THREAD(name_args) char name_args #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ PT_INIT(pt); return PT_ENDED; } //等待条件成立,如果不成立,继续等待 #define PT_WAIT_UNTIL(pt, condition) \ do { \ LC_SET((pt)->lc); \ if(!(condition)) { \ return PT_WAITING; \ } \ } while(0) //一直等待,直到条件不成立 #define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) //等待子线程退出 #define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) //启动子线程,等待子线程退出,如果不退出,在此阻塞 #define PT_SPAWN(pt, child, thread) \ do { \ PT_INIT((child)); \ PT_WAIT_THREAD((pt), (thread)); \ } while(0) //重新启动线程,从头开始 #define PT_RESTART(pt) \ do { \ PT_INIT(pt); \ return PT_WAITING; \ } while(0) //退出线程 #define PT_EXIT(pt) \ do { \ PT_INIT(pt); \ return PT_EXITED; \ } while(0) //子线程是否退出 #define PT_SCHEDULE(f) ((f) < PT_EXITED) //锁死任务 #define PT_YIELD(pt) \ do { \ PT_YIELD_FLAG = 0; \ LC_SET((pt)->lc); \ if(PT_YIELD_FLAG == 0) { \ return PT_YIELDED; \ } \ } while(0) //锁死任务直到符合条件 #define PT_YIELD_UNTIL(pt, cond) \ do { \ PT_YIELD_FLAG = 0; \ LC_SET((pt)->lc); \ if((PT_YIELD_FLAG == 0) || !(cond)) { \ return PT_YIELDED; \ } \ } while(0) #endif /* __PT_H__ */