trunk/src/osd/windows/winwork.c
| r32094 | r32095 | |
| 59 | 59 | |
| 60 | 60 | #ifndef YieldProcessor |
| 61 | 61 | #ifdef __GNUC__ |
| 62 | | INLINE void YieldProcessor(void) |
| 62 | INLINE void osd_yield_processor(void) |
| 63 | 63 | { |
| 64 | 64 | __asm__ __volatile__ ( "rep; nop" ); |
| 65 | 65 | } |
| 66 | 66 | #else |
| 67 | | INLINE void YieldProcessor(void) |
| 67 | INLINE void osd_yield_processor(void) |
| 68 | 68 | { |
| 69 | 69 | __asm { rep nop } |
| 70 | 70 | } |
| 71 | 71 | #endif |
| 72 | #else |
| 73 | #define osd_yield_processor YieldProcessor |
| 72 | 74 | #endif |
| 73 | 75 | |
| 74 | 76 | |
| r32094 | r32095 | |
| 186 | 188 | { |
| 187 | 189 | INT32 backcount; |
| 188 | 190 | for (backcount = 0; backcount < backoff; backcount++) |
| 189 | | YieldProcessor(); |
| 191 | osd_yield_processor(); |
| 190 | 192 | backoff <<= 1; |
| 191 | 193 | } |
| 192 | 194 | lock->slot[myslot].haslock = FALSE; |
| r32094 | r32095 | |
| 352 | 354 | // spin until we're done |
| 353 | 355 | begin_timing(thread->spintime); |
| 354 | 356 | while (queue->items != 0 && osd_ticks() < stopspin) |
| 355 | | YieldProcessor(); |
| 357 | osd_yield_processor(); |
| 356 | 358 | end_timing(thread->spintime); |
| 357 | 359 | |
| 358 | 360 | begin_timing(thread->waittime); |
| r32094 | r32095 | |
| 582 | 584 | { |
| 583 | 585 | osd_ticks_t stopspin = osd_ticks() + timeout; |
| 584 | 586 | while (!item->done && osd_ticks() < stopspin) |
| 585 | | YieldProcessor(); |
| 587 | osd_yield_processor(); |
| 586 | 588 | } |
| 587 | 589 | |
| 588 | 590 | // otherwise, block on the event until done |
| r32094 | r32095 | |
| 695 | 697 | begin_timing(thread->spintime); |
| 696 | 698 | stopspin = osd_ticks() + SPIN_LOOP_TIME; |
| 697 | 699 | while (queue->list == NULL && osd_ticks() < stopspin) |
| 698 | | YieldProcessor(); |
| 700 | osd_yield_processor(); |
| 699 | 701 | end_timing(thread->spintime); |
| 700 | 702 | } |
| 701 | 703 | |