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 }