00001
00012 #ifndef _TXC_CONDVAR_H
00013 #define _TXC_CONDVAR_H
00014
00015 #include "futex.h"
00016 #pragma warning(disable:177)
00017
00018 #define _BEGIN_TX __tm_atomic
00019 #define _END_TX
00020
00021 #define txc_cond_event_inc_loops(_ev_) txc_cond_event_inc(_ev_)
00022 #define LABEL_CAT(a, b) LABEL_CAT_I(a, b)
00023 #define LABEL_CAT_I(a, b) a ## b
00024 #define NEXT_LABEL(T) LABEL_HELPER(T,LABEL_CAT(label,__LINE__))
00025 #define LABEL_HELPER(T,L) do { T = &&L; L: __dummy = 0;} while(0)
00026
00027 #define COND_XACT_BEGIN \
00028 { \
00029 int __do_wait = 0, __cond_val, __do_exit = 0; \
00030 int __dummy = 0; \
00031 txc_cond_event_t * __cond_var; \
00032 void * __wait_label; \
00033 void * __begin_label; \
00034 do { \
00035 if (__do_wait) { \
00036 txc_cond_event_deferred_wait(__cond_var,__cond_val); \
00037 } \
00038 _BEGIN_TX { \
00039 NEXT_LABEL(__begin_label); \
00040 if (!__do_exit) { \
00041 if (__do_wait) { \
00042 __do_wait = 0; \
00043 goto *__wait_label; \
00044 }
00045
00046 #define COND_XACT_END \
00047 } else {__do_exit = 0;} } \
00048 _END_TX; \
00049 } while (__do_wait); }
00050
00051
00052 #define txc_cond_wait_label( _cvar_, _label_) \
00053 { \
00054 __cond_var = (_cvar_); \
00055 __cond_val = txc_cond_event_get(_cvar_); \
00056 __do_wait = 1; \
00057 __do_exit = 1; \
00058 __wait_label = && _label_; \
00059 goto *__begin_label; \
00060 _label_: \
00061 __dummy = 0; \
00062 }
00063
00064
00065 #define txc_cond_wait( _cvar_) \
00066 do { \
00067 txc_cond_event_inc_loops( _cvar_ ); \
00068 txc_cond_wait_label( _cvar_, LABEL_CAT(__txc_cond_wait_, __LINE__)); \
00069 } while (0)
00070
00071 #endif
00072
00073
00074