diff --git a/Single_Header/dn_single_header.cpp b/Single_Header/dn_single_header.cpp index beae189..3e7692c 100644 --- a/Single_Header/dn_single_header.cpp +++ b/Single_Header/dn_single_header.cpp @@ -1,4 +1,4 @@ -// Generated by the DN single header generator 2025-06-29 00:14:47 +// Generated by the DN single header generator 2025-06-30 22:12:04 #define DN_BASE_INC_CPP @@ -13004,7 +13004,13 @@ struct DN_ASYNCCore DN_U32 join_threads; }; -typedef void(DN_ASYNCWorkFunc)(void *input); +struct DN_ASYNCWorkArgs +{ + DN_OSThread *thread; + void *input; +}; + +typedef void(DN_ASYNCWorkFunc)(DN_ASYNCWorkArgs work_args); struct DN_ASYNCWork { @@ -13044,17 +13050,19 @@ static DN_I32 DN_ASYNC_ThreadEntryPoint_(DN_OSThread *thread) DN_ASYNCJob job = {}; for (DN_OS_MutexScope(&async->ring_mutex)) { - if (DN_Ring_HasData(ring, sizeof(job))) { + if (DN_Ring_HasData(ring, sizeof(job))) DN_Ring_Read(ring, &job, sizeof(job)); - break; - } } if (job.work.func) { DN_OS_ConditionVariableBroadcast(&async->ring_write_cv); // Resume any blocked ring write(s) + DN_ASYNCWorkArgs args = {}; + args.input = job.work.input; + args.thread = thread; + DN_Atomic_AddU32(&async->busy_threads, 1); - job.work.func(job.work.input); + job.work.func(args); DN_Atomic_SubU32(&async->busy_threads, 1); if (job.completion_sem.handle != 0) diff --git a/Single_Header/dn_single_header.h b/Single_Header/dn_single_header.h index 91802be..780621e 100644 --- a/Single_Header/dn_single_header.h +++ b/Single_Header/dn_single_header.h @@ -1,4 +1,4 @@ -// Generated by the DN single header generator 2025-06-29 00:14:47 +// Generated by the DN single header generator 2025-06-30 22:12:04 #if !defined(DN_BASE_INC_H) #define DN_BASE_INC_H @@ -7033,7 +7033,13 @@ struct DN_ASYNCCore DN_U32 join_threads; }; -typedef void(DN_ASYNCWorkFunc)(void *input); +struct DN_ASYNCWorkArgs +{ + DN_OSThread *thread; + void *input; +}; + +typedef void(DN_ASYNCWorkFunc)(DN_ASYNCWorkArgs work_args); struct DN_ASYNCWork { diff --git a/Source/Extra/dn_async.cpp b/Source/Extra/dn_async.cpp index c18cd50..6e5a28c 100644 --- a/Source/Extra/dn_async.cpp +++ b/Source/Extra/dn_async.cpp @@ -16,17 +16,19 @@ static DN_I32 DN_ASYNC_ThreadEntryPoint_(DN_OSThread *thread) DN_ASYNCJob job = {}; for (DN_OS_MutexScope(&async->ring_mutex)) { - if (DN_Ring_HasData(ring, sizeof(job))) { + if (DN_Ring_HasData(ring, sizeof(job))) DN_Ring_Read(ring, &job, sizeof(job)); - break; - } } if (job.work.func) { DN_OS_ConditionVariableBroadcast(&async->ring_write_cv); // Resume any blocked ring write(s) + DN_ASYNCWorkArgs args = {}; + args.input = job.work.input; + args.thread = thread; + DN_Atomic_AddU32(&async->busy_threads, 1); - job.work.func(job.work.input); + job.work.func(args); DN_Atomic_SubU32(&async->busy_threads, 1); if (job.completion_sem.handle != 0) diff --git a/Source/Extra/dn_async.h b/Source/Extra/dn_async.h index 061d22a..b69856d 100644 --- a/Source/Extra/dn_async.h +++ b/Source/Extra/dn_async.h @@ -23,7 +23,13 @@ struct DN_ASYNCCore DN_U32 join_threads; }; -typedef void(DN_ASYNCWorkFunc)(void *input); +struct DN_ASYNCWorkArgs +{ + DN_OSThread *thread; + void *input; +}; + +typedef void(DN_ASYNCWorkFunc)(DN_ASYNCWorkArgs work_args); struct DN_ASYNCWork {