Previous 199869 Revisions Next

r34141 Thursday 1st January, 2015 at 19:03:07 UTC by Oliver Stöneberg
a few more data race fixes / cleanups (nw)
[src/osd/sdl]sdlwork.c
[src/osd/windows]winwork.c

trunk/src/osd/sdl/sdlwork.c
r242652r242653
139139static int effective_num_processors(void);
140140static void * worker_thread_entry(void *param);
141141static void worker_thread_process(osd_work_queue *queue, work_thread_info *thread);
142static bool queue_has_list_items(osd_work_queue *queue);
142143
143144
144145//============================================================
r242652r242653
617618      if (queue->exiting)
618619         break;
619620
621      if (!queue_has_list_items(queue))
620622      {
621         INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
622         bool wait_for_event = (queue->list == NULL);
623         osd_scalable_lock_release(queue->lock, lockslot);
624
625         if (wait_for_event)
626         {
627            begin_timing(thread->waittime);
628            osd_event_wait(thread->wakeevent, INFINITE);
629            end_timing(thread->waittime);
630         }
623         begin_timing(thread->waittime);
624         osd_event_wait(thread->wakeevent, INFINITE);
625         end_timing(thread->waittime);
631626      }
632627
633628      if (queue->exiting)
r242652r242653
661656         }
662657
663658         // if nothing more, release the processor
664         if (queue->list == NULL)
659         if (!queue_has_list_items(queue))
665660            break;
666661         add_to_stat(&queue->spinloops, 1);
667662      }
r242652r242653
694689   {
695690      osd_work_item *item;
696691
692      bool end_loop = false;
693
697694      // use a critical section to synchronize the removal of items
698      INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
699695      {
696         INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
700697         if (queue->list == NULL)
701698         {
702            osd_scalable_lock_release(queue->lock, lockslot);
703            break;
699            end_loop = true;
704700         }
705         
706
707         // pull the item from the queue
708         item = (osd_work_item *)queue->list;
709         if (item != NULL)
701         else
710702         {
711            queue->list = item->next;
712            if (queue->list == NULL)
713               queue->tailptr = (osd_work_item **)&queue->list;
703            // pull the item from the queue
704            item = (osd_work_item *)queue->list;
705            if (item != NULL)
706            {
707               queue->list = item->next;
708               if (queue->list == NULL)
709                  queue->tailptr = (osd_work_item **)&queue->list;
710            }
714711         }
712         osd_scalable_lock_release(queue->lock, lockslot);
715713      }
716      osd_scalable_lock_release(queue->lock, lockslot);
717714
715      if (end_loop)
716         break;
717
718718      // process non-NULL items
719719      if (item != NULL)
720720      {
r242652r242653
745745         }
746746
747747         // if we removed an item and there's still work to do, bump the stats
748         // TODO: data race
749         if (queue->list != NULL)
748         if (queue_has_list_items(queue))
750749            add_to_stat(&queue->extraitems, 1);
751750      }
752751   }
r242652r242653
761760   end_timing(thread->runtime);
762761}
763762
764#endif // SDLMAME_NOASM
763bool queue_has_list_items(osd_work_queue *queue)
764{
765   INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
766   bool has_list_items = (queue->list != NULL);
767   osd_scalable_lock_release(queue->lock, lockslot);
768   return has_list_items;
769}
770#endif // SDLMAME_NOASM
No newline at end of file
trunk/src/osd/windows/winwork.c
r242652r242653
149149static int effective_num_processors(void);
150150static void * worker_thread_entry(void *param);
151151static void worker_thread_process(osd_work_queue *queue, work_thread_info *thread);
152static bool queue_has_list_items(osd_work_queue *queue);
152153
153154
154155//============================================================
r242652r242653
450451      item->callback = callback;
451452      item->param = parambase;
452453      item->result = NULL;
453      item->flags = flags;     
454      item->flags = flags;
454455
455456      // advance to the next
456457      lastitem = item;
r242652r242653
617618      if (queue->exiting)
618619         break;
619620
621      if (!queue_has_list_items(queue))
620622      {
621         INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
622         bool wait_for_event = (queue->list == NULL);
623         osd_scalable_lock_release(queue->lock, lockslot);
624
625         if (wait_for_event)
626         {
627            begin_timing(thread->waittime);
628            osd_event_wait(thread->wakeevent, INFINITE);
629            end_timing(thread->waittime);
630         }
623         begin_timing(thread->waittime);
624         osd_event_wait(thread->wakeevent, INFINITE);
625         end_timing(thread->waittime);
631626      }
632627
633628      if (queue->exiting)
r242652r242653
657652         }
658653
659654         // if nothing more, release the processor
660         if (queue->list == NULL)
655         if (!queue_has_list_items(queue))
661656            break;
662657         add_to_stat(&queue->spinloops, 1);
663658      }
r242652r242653
685680   {
686681      osd_work_item *item;
687682
683      bool end_loop = false;
684
688685      // use a critical section to synchronize the removal of items
689      INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
690686      {
687         INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
691688         if (queue->list == NULL)
692689         {
693            osd_scalable_lock_release(queue->lock, lockslot);
694            break;
690            end_loop = true;
695691         }
696         
697
698         // pull the item from the queue
699         item = (osd_work_item *)queue->list;
700         if (item != NULL)
692         else
701693         {
702            queue->list = item->next;
703            if (queue->list == NULL)
704               queue->tailptr = (osd_work_item **)&queue->list;
694            // pull the item from the queue
695            item = (osd_work_item *)queue->list;
696            if (item != NULL)
697            {
698               queue->list = item->next;
699               if (queue->list == NULL)
700                  queue->tailptr = (osd_work_item **)&queue->list;
701            }
705702         }
703         osd_scalable_lock_release(queue->lock, lockslot);
706704      }
707      osd_scalable_lock_release(queue->lock, lockslot);
708705
706      if (end_loop)
707         break;
708
709709      // process non-NULL items
710710      if (item != NULL)
711711      {
r242652r242653
736736         }
737737
738738         // if we removed an item and there's still work to do, bump the stats
739         // TODO: data race
740         if (queue->list != NULL)
739         if (queue_has_list_items(queue))
741740            add_to_stat(&queue->extraitems, 1);
742741      }
743742   }
r242652r242653
751750
752751   end_timing(thread->runtime);
753752}
753
754bool queue_has_list_items(osd_work_queue *queue)
755{
756   INT32 lockslot = osd_scalable_lock_acquire(queue->lock);
757   bool has_list_items = (queue->list != NULL);
758   osd_scalable_lock_release(queue->lock, lockslot);
759   return has_list_items;
760}


Previous 199869 Revisions Next


© 1997-2024 The MAME Team