Previous 199869 Revisions Next

r34123 Wednesday 31st December, 2014 at 09:24:17 UTC by Oliver Stöneberg
fixed ThreadSanitizer data race warnings in winwork.c/sdlwork.c (nw)
[src/osd/sdl]sdlwork.c
[src/osd/windows]winwork.c

trunk/src/osd/sdl/sdlwork.c
r242634r242635
412412      osd_work_item *item;
413413
414414      // first allocate a new work item; try the free list first
415      INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
415416      do
416417      {
417418         item = (osd_work_item *)queue->free;
418419      } while (item != NULL && compare_exchange_ptr((PVOID volatile *)&queue->free, item, item->next) != item);
420      osd_scalable_lock_release(queue->lock, lockslot);
419421
420422      // if nothing, allocate something new
421423      if (item == NULL)
r242634r242635
546548   osd_work_item_wait(item, 100 * osd_ticks_per_second());
547549
548550   // add us to the free list on our queue
551   INT32 lockslot = osd_scalable_lock_acquire(item->queue->lock);
549552   do
550553   {
551554      next = (osd_work_item *)item->queue->free;
552555      item->next = next;
553556   } while (compare_exchange_ptr((PVOID volatile *)&item->queue->free, next, item) != next);
557   osd_scalable_lock_release(item->queue->lock, lockslot);
554558}
555559
556560
r242634r242635
602606   {
603607      // block waiting for work or exit
604608      // 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
606612      {
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         }
610623      }
624
611625      if (queue->exiting)
612626         break;
613627
trunk/src/osd/windows/winwork.c
r242634r242635
422422      osd_work_item *item;
423423
424424      // first allocate a new work item; try the free list first
425      INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
425426      do
426427      {
427428         item = (osd_work_item *)queue->free;
428429      } while (item != NULL && compare_exchange_ptr((PVOID volatile *)&queue->free, item, item->next) != item);
430      osd_scalable_lock_release(queue->lock, lockslot);
429431
430432      // if nothing, allocate something new
431433      if (item == NULL)
r242634r242635
550552   osd_work_item_wait(item, 100 * osd_ticks_per_second());
551553
552554   // add us to the free list on our queue
555   INT32 lockslot = osd_scalable_lock_acquire(item->queue->lock);
553556   do
554557   {
555558      next = (osd_work_item *)item->queue->free;
556559      item->next = next;
557560   } while (compare_exchange_ptr((PVOID volatile *)&item->queue->free, next, item) != next);
561   osd_scalable_lock_release(item->queue->lock, lockslot);
558562}
559563
560564
r242634r242635
602606   {
603607      // block waiting for work or exit
604608      // 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
606612      {
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         }
610623      }
624
611625      if (queue->exiting)
612626         break;
613627


Previous 199869 Revisions Next


© 1997-2024 The MAME Team