trunk/src/osd/sdl/sdlwork.c
| r242634 | r242635 | |
| 412 | 412 | osd_work_item *item; |
| 413 | 413 | |
| 414 | 414 | // first allocate a new work item; try the free list first |
| 415 | INT32 lockslot = osd_scalable_lock_acquire(queue->lock); |
| 415 | 416 | do |
| 416 | 417 | { |
| 417 | 418 | item = (osd_work_item *)queue->free; |
| 418 | 419 | } while (item != NULL && compare_exchange_ptr((PVOID volatile *)&queue->free, item, item->next) != item); |
| 420 | osd_scalable_lock_release(queue->lock, lockslot); |
| 419 | 421 | |
| 420 | 422 | // if nothing, allocate something new |
| 421 | 423 | if (item == NULL) |
| r242634 | r242635 | |
| 546 | 548 | osd_work_item_wait(item, 100 * osd_ticks_per_second()); |
| 547 | 549 | |
| 548 | 550 | // add us to the free list on our queue |
| 551 | INT32 lockslot = osd_scalable_lock_acquire(item->queue->lock); |
| 549 | 552 | do |
| 550 | 553 | { |
| 551 | 554 | next = (osd_work_item *)item->queue->free; |
| 552 | 555 | item->next = next; |
| 553 | 556 | } while (compare_exchange_ptr((PVOID volatile *)&item->queue->free, next, item) != next); |
| 557 | osd_scalable_lock_release(item->queue->lock, lockslot); |
| 554 | 558 | } |
| 555 | 559 | |
| 556 | 560 | |
| r242634 | r242635 | |
| 602 | 606 | { |
| 603 | 607 | // block waiting for work or exit |
| 604 | 608 | // bail on exit, and only wait if there are no pending items in queue |
| 605 | | if (!queue->exiting && queue->list == NULL) |
| 609 | if (queue->exiting) |
| 610 | break; |
| 611 | |
| 606 | 612 | { |
| 607 | | begin_timing(thread->waittime); |
| 608 | | osd_event_wait(thread->wakeevent, INFINITE); |
| 609 | | end_timing(thread->waittime); |
| 613 | INT32 lockslot = osd_scalable_lock_acquire(queue->lock); |
| 614 | bool wait_for_event = (queue->list == NULL); |
| 615 | osd_scalable_lock_release(queue->lock, lockslot); |
| 616 | |
| 617 | if (wait_for_event) |
| 618 | { |
| 619 | begin_timing(thread->waittime); |
| 620 | osd_event_wait(thread->wakeevent, INFINITE); |
| 621 | end_timing(thread->waittime); |
| 622 | } |
| 610 | 623 | } |
| 624 | |
| 611 | 625 | if (queue->exiting) |
| 612 | 626 | break; |
| 613 | 627 | |
trunk/src/osd/windows/winwork.c
| r242634 | r242635 | |
| 422 | 422 | osd_work_item *item; |
| 423 | 423 | |
| 424 | 424 | // first allocate a new work item; try the free list first |
| 425 | INT32 lockslot = osd_scalable_lock_acquire(queue->lock); |
| 425 | 426 | do |
| 426 | 427 | { |
| 427 | 428 | item = (osd_work_item *)queue->free; |
| 428 | 429 | } while (item != NULL && compare_exchange_ptr((PVOID volatile *)&queue->free, item, item->next) != item); |
| 430 | osd_scalable_lock_release(queue->lock, lockslot); |
| 429 | 431 | |
| 430 | 432 | // if nothing, allocate something new |
| 431 | 433 | if (item == NULL) |
| r242634 | r242635 | |
| 550 | 552 | osd_work_item_wait(item, 100 * osd_ticks_per_second()); |
| 551 | 553 | |
| 552 | 554 | // add us to the free list on our queue |
| 555 | INT32 lockslot = osd_scalable_lock_acquire(item->queue->lock); |
| 553 | 556 | do |
| 554 | 557 | { |
| 555 | 558 | next = (osd_work_item *)item->queue->free; |
| 556 | 559 | item->next = next; |
| 557 | 560 | } while (compare_exchange_ptr((PVOID volatile *)&item->queue->free, next, item) != next); |
| 561 | osd_scalable_lock_release(item->queue->lock, lockslot); |
| 558 | 562 | } |
| 559 | 563 | |
| 560 | 564 | |
| r242634 | r242635 | |
| 602 | 606 | { |
| 603 | 607 | // block waiting for work or exit |
| 604 | 608 | // bail on exit, and only wait if there are no pending items in queue |
| 605 | | if (!queue->exiting && queue->list == NULL) |
| 609 | if (queue->exiting) |
| 610 | break; |
| 611 | |
| 606 | 612 | { |
| 607 | | begin_timing(thread->waittime); |
| 608 | | osd_event_wait(thread->wakeevent, INFINITE); |
| 609 | | end_timing(thread->waittime); |
| 613 | INT32 lockslot = osd_scalable_lock_acquire(queue->lock); |
| 614 | bool wait_for_event = (queue->list == NULL); |
| 615 | osd_scalable_lock_release(queue->lock, lockslot); |
| 616 | |
| 617 | if (wait_for_event) |
| 618 | { |
| 619 | begin_timing(thread->waittime); |
| 620 | osd_event_wait(thread->wakeevent, INFINITE); |
| 621 | end_timing(thread->waittime); |
| 622 | } |
| 610 | 623 | } |
| 624 | |
| 611 | 625 | if (queue->exiting) |
| 612 | 626 | break; |
| 613 | 627 | |