Changes in uspace/lib/libc/generic/fibril_sync.c [bbb01b98:8619f25] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/generic/fibril_sync.c
rbbb01b98 r8619f25 36 36 #include <fibril.h> 37 37 #include <async.h> 38 #include <async_priv.h>39 38 #include <adt/list.h> 40 39 #include <futex.h> 41 #include <sys/time.h>42 #include <errno.h>43 40 #include <assert.h> 44 41 … … 66 63 futex_down(&async_futex); 67 64 if (fm->counter-- <= 0) { 68 awaiter_t wdata; 69 70 wdata.fid = fibril_get_id(); 71 wdata.active = false; 72 wdata.wu_event.inlist = true; 73 link_initialize(&wdata.wu_event.link); 74 list_append(&wdata.wu_event.link, &fm->waiters); 65 fibril_t *f = (fibril_t *) fibril_get_id(); 66 list_append(&f->link, &fm->waiters); 75 67 fibril_switch(FIBRIL_TO_MANAGER); 76 68 } else { … … 98 90 if (fm->counter++ < 0) { 99 91 link_t *tmp; 100 awaiter_t *wdp;92 fibril_t *f; 101 93 102 94 assert(!list_empty(&fm->waiters)); 103 95 tmp = fm->waiters.next; 104 wdp = list_get_instance(tmp, awaiter_t, wu_event.link); 105 wdp->active = true; 106 wdp->wu_event.inlist = false; 107 list_remove(&wdp->wu_event.link); 108 fibril_add_ready(wdp->fid); 96 f = list_get_instance(tmp, fibril_t, link); 97 list_remove(&f->link); 98 fibril_add_ready((fid_t) f); 109 99 optimize_execution_power(); 110 100 } … … 130 120 if (frw->writers) { 131 121 fibril_t *f = (fibril_t *) fibril_get_id(); 132 awaiter_t wdata;133 134 wdata.fid = (fid_t) f;135 wdata.active = false;136 wdata.wu_event.inlist = true;137 link_initialize(&wdata.wu_event.link);138 122 f->flags &= ~FIBRIL_WRITER; 139 list_append(& wdata.wu_event.link, &frw->waiters);123 list_append(&f->link, &frw->waiters); 140 124 fibril_switch(FIBRIL_TO_MANAGER); 141 125 } else { … … 150 134 if (frw->writers || frw->readers) { 151 135 fibril_t *f = (fibril_t *) fibril_get_id(); 152 awaiter_t wdata;153 154 wdata.fid = (fid_t) f;155 wdata.active = false;156 wdata.wu_event.inlist = true;157 link_initialize(&wdata.wu_event.link);158 136 f->flags |= FIBRIL_WRITER; 159 list_append(& wdata.wu_event.link, &frw->waiters);137 list_append(&f->link, &frw->waiters); 160 138 fibril_switch(FIBRIL_TO_MANAGER); 161 139 } else { … … 180 158 while (!list_empty(&frw->waiters)) { 181 159 link_t *tmp = frw->waiters.next; 182 awaiter_t *wdp; 183 fibril_t *f; 184 185 wdp = list_get_instance(tmp, awaiter_t, wu_event.link); 186 f = (fibril_t *) wdp->fid; 160 fibril_t *f = list_get_instance(tmp, fibril_t, link); 187 161 188 162 if (f->flags & FIBRIL_WRITER) { 189 163 if (frw->readers) 190 164 break; 191 wdp->active = true; 192 wdp->wu_event.inlist = false; 193 list_remove(&wdp->wu_event.link); 194 fibril_add_ready(wdp->fid); 165 list_remove(&f->link); 166 fibril_add_ready((fid_t) f); 195 167 frw->writers++; 196 168 optimize_execution_power(); 197 169 break; 198 170 } else { 199 wdp->active = true; 200 wdp->wu_event.inlist = false; 201 list_remove(&wdp->wu_event.link); 202 fibril_add_ready(wdp->fid); 171 list_remove(&f->link); 172 fibril_add_ready((fid_t) f); 203 173 frw->readers++; 204 174 optimize_execution_power(); … … 224 194 } 225 195 226 int 227 fibril_condvar_wait_timeout(fibril_condvar_t *fcv, fibril_mutex_t *fm, 228 suseconds_t timeout) 229 { 230 awaiter_t wdata; 231 232 if (timeout < 0) 233 return ETIMEOUT; 234 235 wdata.fid = fibril_get_id(); 236 wdata.active = false; 237 238 wdata.to_event.inlist = timeout > 0; 239 wdata.to_event.occurred = false; 240 link_initialize(&wdata.to_event.link); 241 242 wdata.wu_event.inlist = true; 243 link_initialize(&wdata.wu_event.link); 244 245 futex_down(&async_futex); 246 if (timeout) { 247 gettimeofday(&wdata.to_event.expires, NULL); 248 tv_add(&wdata.to_event.expires, timeout); 249 async_insert_timeout(&wdata); 250 } 251 list_append(&wdata.wu_event.link, &fcv->waiters); 196 void fibril_condvar_wait(fibril_condvar_t *fcv, fibril_mutex_t *fm) 197 { 198 fibril_t *f = (fibril_t *) fibril_get_id(); 199 200 futex_down(&async_futex); 201 list_append(&f->link, &fcv->waiters); 252 202 _fibril_mutex_unlock_unsafe(fm); 253 203 fibril_switch(FIBRIL_TO_MANAGER); 254 204 fibril_mutex_lock(fm); 255 256 /* async_futex not held after fibril_switch() */257 futex_down(&async_futex);258 if (wdata.to_event.inlist)259 list_remove(&wdata.to_event.link);260 if (wdata.wu_event.inlist)261 list_remove(&wdata.wu_event.link);262 futex_up(&async_futex);263 264 return wdata.to_event.occurred ? ETIMEOUT : EOK;265 }266 267 void fibril_condvar_wait(fibril_condvar_t *fcv, fibril_mutex_t *fm)268 {269 int rc;270 271 rc = fibril_condvar_wait_timeout(fcv, fm, 0);272 assert(rc == EOK);273 205 } 274 206 … … 276 208 { 277 209 link_t *tmp; 278 awaiter_t *wdp;210 fibril_t *f; 279 211 280 212 futex_down(&async_futex); 281 213 while (!list_empty(&fcv->waiters)) { 282 214 tmp = fcv->waiters.next; 283 wdp = list_get_instance(tmp, awaiter_t, wu_event.link); 284 list_remove(&wdp->wu_event.link); 285 wdp->wu_event.inlist = false; 286 if (!wdp->active) { 287 wdp->active = true; 288 fibril_add_ready(wdp->fid); 289 optimize_execution_power(); 290 if (once) 291 break; 292 } 215 f = list_get_instance(tmp, fibril_t, link); 216 list_remove(&f->link); 217 fibril_add_ready((fid_t) f); 218 optimize_execution_power(); 219 if (once) 220 break; 293 221 } 294 222 futex_up(&async_futex);
Note:
See TracChangeset
for help on using the changeset viewer.