src/xcalls/condvar/condvar.h

Go to the documentation of this file.
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 /* TXC_CONDVAR_H */
00072 
00073 
00074 

Generated on Wed Dec 9 20:32:39 2009 for xCalls by  doxygen 1.4.7