00001 00007 #include <limits.h> 00008 #include "lowlevellock.h" 00009 #include "futex.h" 00010 00011 TM_PURE int futex_wait(void *futex, int val) 00012 { 00013 int result; 00014 00015 result = lll_futex_wait(futex, val); 00016 00017 return(result); 00018 } 00019 00020 TM_PURE 00021 int 00022 futex_wake(void * futex, int nwake) 00023 { 00024 lll_futex_wake(futex, nwake); 00025 00026 return(0); 00027 } 00028 00029 00030 TM_PURE 00031 int 00032 txc_cond_event_init(txc_cond_event_t * ev) 00033 { 00034 ev->event = 0; 00035 ev->loops = 0; 00036 return(0); 00037 } 00038 00039 00040 TM_PURE 00041 int 00042 txc_cond_event_signal(txc_cond_event_t * ev) 00043 { 00044 ev->event++; 00045 futex_wake(&ev->event, 1); 00046 return(0); 00047 } 00048 00049 00050 TM_PURE 00051 int 00052 txc_cond_event_tm_signal_body(txc_cond_event_t * ev) 00053 { 00054 futex_wake(&ev->event, 1); 00055 return(0); 00056 } 00057 00058 00059 TM_CALLABLE 00060 int 00061 txc_cond_event_tm_signal(txc_cond_event_t * ev) 00062 { 00063 ev->event++; 00064 txc_cond_event_tm_signal_body(ev); 00065 return(0); 00066 } 00067 00068 00069 TM_PURE 00070 int 00071 txc_cond_event_broadcast(txc_cond_event_t * ev) 00072 { 00073 ev->event++; 00074 futex_wake(&ev->event, INT_MAX); 00075 return(0); 00076 } 00077 00078 00079 TM_PURE 00080 int 00081 txc_cond_event_wait(txc_cond_event_t * ev) 00082 { 00083 futex_wait(&ev->event, ev->event); 00084 return(0); 00085 } 00086 00087 00088 TM_CALLABLE 00089 int 00090 txc_cond_event_get(txc_cond_event_t * ev) 00091 { 00092 return(ev->event); 00093 } 00094 00095 00096 TM_PURE 00097 int 00098 txc_cond_event_deferred_wait(txc_cond_event_t * ev, int val) 00099 { 00100 if (val == ev->event) { 00101 futex_wait(&ev->event, val); 00102 } 00103 return(0); 00104 } 00105 00106 00107 TM_PURE 00108 void 00109 txc_cond_event_inc(txc_cond_event_t * ev) 00110 { 00111 ev->loops++; 00112 }