Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00049 #ifndef __PT_H__
00050 #define __PT_H__
00051
00052 #include "lc.h"
00053
00054 struct pt {
00055 lc_t lc;
00056 };
00057
00058 #define PT_WAITING 0
00059 #define PT_EXITED 1
00060 #define PT_ENDED 2
00061 #define PT_YIELDED 3
00062
00080 #define PT_INIT(pt) LC_INIT((pt)->lc)
00081
00100 #define PT_THREAD(name_args) char name_args
00101
00115 #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
00116
00127 #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \
00128 PT_INIT(pt); return PT_ENDED; }
00129
00148 #define PT_WAIT_UNTIL(pt, condition) \
00149 do { \
00150 LC_SET((pt)->lc); \
00151 if(!(condition)) { \
00152 return PT_WAITING; \
00153 } \
00154 } while(0)
00155
00167 #define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond))
00168
00192 #define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread))
00193
00206 #define PT_SPAWN(pt, child, thread) \
00207 do { \
00208 PT_INIT((child)); \
00209 PT_WAIT_THREAD((pt), (thread)); \
00210 } while(0)
00211
00229 #define PT_RESTART(pt) \
00230 do { \
00231 PT_INIT(pt); \
00232 return PT_WAITING; \
00233 } while(0)
00234
00246 #define PT_EXIT(pt) \
00247 do { \
00248 PT_INIT(pt); \
00249 return PT_EXITED; \
00250 } while(0)
00251
00271 #define PT_SCHEDULE(f) ((f) == PT_WAITING)
00272
00290 #define PT_YIELD(pt) \
00291 do { \
00292 PT_YIELD_FLAG = 0; \
00293 LC_SET((pt)->lc); \
00294 if(PT_YIELD_FLAG == 0) { \
00295 return PT_YIELDED; \
00296 } \
00297 } while(0)
00298
00310 #define PT_YIELD_UNTIL(pt, cond) \
00311 do { \
00312 PT_YIELD_FLAG = 0; \
00313 LC_SET((pt)->lc); \
00314 if((PT_YIELD_FLAG == 0) || !(cond)) { \
00315 return PT_YIELDED; \
00316 } \
00317 } while(0)
00318
00321 #endif
00322