summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/osdsync.cpp
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2023-04-14 06:45:20 +1000
committer Vas Crabb <vas@vastheman.com>2023-04-14 06:45:20 +1000
commit7d26d641d3e94943b351ad55d7ffe25ec02ac791 (patch)
treed9fabd7ddf5c487711b1ee6b5599d0e4a7cb5902 /src/osd/osdsync.cpp
parentc0b57d30f0ce39c445190fe4e27bec6c57ebb137 (diff)
Miscellaneous improvements:
infoxml.cpp: Thread device processing. Gives about a 10% speed improvement overall, and avoids the need to mess with the locale of the ultimate output stream. debugger/win/consolewininfo.cpp: Show image mount/create error messages on the console. emu/devdelegate.h, util/delegate.h: Added deduction guides for common delegate creation patterns (only used in sega/segas16a.cpp so far). More noexcept on things that have no business throwing exceptions.
Diffstat (limited to 'src/osd/osdsync.cpp')
-rw-r--r--src/osd/osdsync.cpp71
1 files changed, 36 insertions, 35 deletions
diff --git a/src/osd/osdsync.cpp b/src/osd/osdsync.cpp
index 3fa32f9141c..b2300e93ee6 100644
--- a/src/osd/osdsync.cpp
+++ b/src/osd/osdsync.cpp
@@ -104,26 +104,27 @@ int osd_get_num_processors(bool heavy_mt)
struct work_thread_info
{
work_thread_info(uint32_t aid, osd_work_queue &aqueue)
- : queue(aqueue)
- , handle(nullptr)
- , wakeevent(true, false) // manual reset, not signalled
- , id(aid)
+ : queue(aqueue)
+ , handle(nullptr)
+ , wakeevent(true, false) // manual reset, not signalled
+ , id(aid)
#if KEEP_STATISTICS
- , itemsdone(0)
- , actruntime(0)
- , runtime(0)
- , spintime(0)
- , waittime(0)
+ , itemsdone(0)
+ , actruntime(0)
+ , runtime(0)
+ , spintime(0)
+ , waittime(0)
#endif
{
}
+
osd_work_queue & queue; // pointer back to the queue
std::thread * handle; // handle to the thread
osd_event wakeevent; // wake event for the thread
- uint32_t id;
+ uint32_t id;
#if KEEP_STATISTICS
- int32_t itemsdone;
+ int32_t itemsdone;
osd_ticks_t actruntime;
osd_ticks_t runtime;
osd_ticks_t spintime;
@@ -135,21 +136,21 @@ struct work_thread_info
struct osd_work_queue
{
osd_work_queue()
- : list(nullptr)
- , tailptr(nullptr)
- , free(nullptr)
- , items(0)
- , livethreads(0)
- , waiting(0)
- , exiting(0)
- , threads(0)
- , flags(0)
- , doneevent(true, true) // manual reset, signalled
+ : list(nullptr)
+ , tailptr(nullptr)
+ , free(nullptr)
+ , items(0)
+ , livethreads(0)
+ , waiting(0)
+ , exiting(0)
+ , threads(0)
+ , flags(0)
+ , doneevent(true, true) // manual reset, signalled
#if KEEP_STATISTICS
- , itemsqueued(0)
- , setevents(0)
- , extraitems(0)
- , spinloops(0)
+ , itemsqueued(0)
+ , setevents(0)
+ , extraitems(0)
+ , spinloops(0)
#endif
{
}
@@ -179,14 +180,14 @@ struct osd_work_queue
struct osd_work_item
{
osd_work_item(osd_work_queue &aqueue)
- : next(nullptr)
- , queue(aqueue)
- , callback(nullptr)
- , param(nullptr)
- , result(nullptr)
- , event(nullptr) // manual reset, not signalled
- , flags(0)
- , done(false)
+ : next(nullptr)
+ , queue(aqueue)
+ , callback(nullptr)
+ , param(nullptr)
+ , result(nullptr)
+ , event(nullptr) // manual reset, not signalled
+ , flags(0)
+ , done(false)
{
}
@@ -196,7 +197,7 @@ struct osd_work_item
void * param; // callback parameter
void * result; // callback result
osd_event * event; // event signalled when complete
- uint32_t flags; // creation flags
+ uint32_t flags; // creation flags
std::atomic<int32_t> done; // is the item done?
};
@@ -211,7 +212,7 @@ int osd_num_processors = 0;
//============================================================
static int effective_num_processors(bool heavy_mt);
-static void * worker_thread_entry(void *param);
+static void *worker_thread_entry(void *param);
static void worker_thread_process(osd_work_queue *queue, work_thread_info *thread);
static bool queue_has_list_items(osd_work_queue *queue);