From 4224ba15fbae7550f953f5d85a0894e50a7a1bc9 Mon Sep 17 00:00:00 2001 From: Peter Slattery Date: Sat, 29 Feb 2020 15:07:56 -0800 Subject: [PATCH] Solved crash when not viewing the sculpture view panel The sculpture view panel was the one which handled the job system. If the panel was closed, jobs stopped being completed and the queue filled up. --- src/foldhaus_app.cpp | 8 ++++---- src/foldhaus_platform.h | 7 +++++-- src/panels/foldhaus_panel_sculpture_view.h | 7 +------ src/win32_foldhaus.cpp | 22 +++++++++++++++++++++- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/foldhaus_app.cpp b/src/foldhaus_app.cpp index 06f5f7a..79806d6 100644 --- a/src/foldhaus_app.cpp +++ b/src/foldhaus_app.cpp @@ -405,10 +405,7 @@ UPDATE_AND_RENDER(UpdateAndRender) Job->SendTo = Context.PlatformSendTo; Job->DMXBuffers = DMXBuffers; - Context.GeneralWorkQueue->PushWorkOnQueue( - Context.GeneralWorkQueue, - SACNSendDMXBufferListJob, - Job); + Context.GeneralWorkQueue->PushWorkOnQueue(Context.GeneralWorkQueue, SACNSendDMXBufferListJob, Job, "SACN Send Data Job"); }break; InvalidDefaultCase; @@ -430,6 +427,9 @@ UPDATE_AND_RENDER(UpdateAndRender) } } + Context.GeneralWorkQueue->DoQueueWorkUntilDone(Context.GeneralWorkQueue, 0); + Context.GeneralWorkQueue->ResetWorkQueue(Context.GeneralWorkQueue); + // Checking for overflows { DEBUG_TRACK_SCOPE(OverflowChecks); diff --git a/src/foldhaus_platform.h b/src/foldhaus_platform.h index eea087e..51dcdf0 100644 --- a/src/foldhaus_platform.h +++ b/src/foldhaus_platform.h @@ -180,7 +180,7 @@ typedef THREADED_WORK_PROC(threaded_work_proc); typedef struct work_queue work_queue; -#define PUSH_WORK_ON_QUEUE(name) void name(work_queue* Queue, threaded_work_proc* WorkProc, void* Data) +#define PUSH_WORK_ON_QUEUE(name) void name(work_queue* Queue, threaded_work_proc* WorkProc, void* Data, char* JobName) typedef PUSH_WORK_ON_QUEUE(push_work_on_queue); #define DO_QUEUE_WORK_UNTIL_DONE(name) void name(work_queue* Queue, s32 ThreadID) @@ -193,6 +193,9 @@ struct worker_thread_job { void* Data; threaded_work_proc* WorkProc; +#ifdef DEBUG + char* JobName; +#endif }; struct work_queue @@ -203,7 +206,7 @@ struct work_queue u32 volatile JobsCount; u32 volatile NextJobIndex; u32 volatile JobsCompleted; - worker_thread_job Jobs[256]; + worker_thread_job* Jobs; // Work Queue push_work_on_queue* PushWorkOnQueue; diff --git a/src/panels/foldhaus_panel_sculpture_view.h b/src/panels/foldhaus_panel_sculpture_view.h index 72244bd..8b3acb1 100644 --- a/src/panels/foldhaus_panel_sculpture_view.h +++ b/src/panels/foldhaus_panel_sculpture_view.h @@ -174,15 +174,10 @@ SculptureView_Render(panel Panel, rect PanelBounds, render_command_buffer* Rende JobData->ModelViewMatrix = ModelViewMatrix; JobData->LEDHalfWidth = LEDHalfWidth; - Context.GeneralWorkQueue->PushWorkOnQueue( - Context.GeneralWorkQueue, - DrawLEDsInBufferRangeJob, - JobData); + Context.GeneralWorkQueue->PushWorkOnQueue(Context.GeneralWorkQueue, DrawLEDsInBufferRangeJob, JobData, "Sculpture Draw LEDS"); } } - Context.GeneralWorkQueue->DoQueueWorkUntilDone(Context.GeneralWorkQueue, 0); - Context.GeneralWorkQueue->ResetWorkQueue(Context.GeneralWorkQueue); } #define FOLDHAUS_PANEL_SCULPTURE_VIEW_H diff --git a/src/win32_foldhaus.cpp b/src/win32_foldhaus.cpp index 58e385e..22ad949 100644 --- a/src/win32_foldhaus.cpp +++ b/src/win32_foldhaus.cpp @@ -46,11 +46,28 @@ struct worker_thread_info PUSH_WORK_ON_QUEUE(Win32PushWorkOnQueue) { +#ifdef DEBUG + // NOTE(Peter): Just prints out the names of all the pending jobs if we end up + // overflowing the buffer + if (Queue->JobsCount >= Queue->JobsMax) + { + string DebugString = MakeString((char*)malloc(256), 256); + for (u32 i = 0; i < Queue->JobsCount; i++) + { + PrintF(&DebugString, "%d %s\n", i, Queue->Jobs[i].JobName); + NullTerminate(&DebugString); + OutputDebugStringA(DebugString.Memory); + } + } +#endif Assert(Queue->JobsCount < Queue->JobsMax); worker_thread_job* Job = Queue->Jobs + Queue->JobsCount; Job->WorkProc = WorkProc; Job->Data = Data; +#ifdef DEBUG + Job->JobName = JobName; +#endif // Complete Past Writes before Future Writes _WriteBarrier(); @@ -596,12 +613,15 @@ WinMain ( work_queue WorkQueue = {}; WorkQueue.SemaphoreHandle = CreateSemaphoreEx(0, 0, PLATFORM_THREAD_COUNT, 0, 0, SEMAPHORE_ALL_ACCESS); - WorkQueue.JobsMax = 256; + WorkQueue.JobsMax = 512; + WorkQueue.Jobs = (worker_thread_job*)Win32Alloc(sizeof(worker_thread_job) * WorkQueue.JobsMax); WorkQueue.NextJobIndex = 0; WorkQueue.PushWorkOnQueue = Win32PushWorkOnQueue; WorkQueue.DoQueueWorkUntilDone = Win32DoQueueWorkUntilDone; WorkQueue.ResetWorkQueue = ResetWorkQueue; + OutputDebugStringA("Hellooooo\n"); + for (s32 i = 0; i < PLATFORM_THREAD_COUNT; i++) { // ID = 0 is reserved for this thread