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.
This commit is contained in:
parent
b103ede28c
commit
4224ba15fb
|
@ -405,10 +405,7 @@ UPDATE_AND_RENDER(UpdateAndRender)
|
||||||
Job->SendTo = Context.PlatformSendTo;
|
Job->SendTo = Context.PlatformSendTo;
|
||||||
Job->DMXBuffers = DMXBuffers;
|
Job->DMXBuffers = DMXBuffers;
|
||||||
|
|
||||||
Context.GeneralWorkQueue->PushWorkOnQueue(
|
Context.GeneralWorkQueue->PushWorkOnQueue(Context.GeneralWorkQueue, SACNSendDMXBufferListJob, Job, "SACN Send Data Job");
|
||||||
Context.GeneralWorkQueue,
|
|
||||||
SACNSendDMXBufferListJob,
|
|
||||||
Job);
|
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
InvalidDefaultCase;
|
InvalidDefaultCase;
|
||||||
|
@ -430,6 +427,9 @@ UPDATE_AND_RENDER(UpdateAndRender)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context.GeneralWorkQueue->DoQueueWorkUntilDone(Context.GeneralWorkQueue, 0);
|
||||||
|
Context.GeneralWorkQueue->ResetWorkQueue(Context.GeneralWorkQueue);
|
||||||
|
|
||||||
// Checking for overflows
|
// Checking for overflows
|
||||||
{
|
{
|
||||||
DEBUG_TRACK_SCOPE(OverflowChecks);
|
DEBUG_TRACK_SCOPE(OverflowChecks);
|
||||||
|
|
|
@ -180,7 +180,7 @@ typedef THREADED_WORK_PROC(threaded_work_proc);
|
||||||
|
|
||||||
typedef struct work_queue work_queue;
|
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);
|
typedef PUSH_WORK_ON_QUEUE(push_work_on_queue);
|
||||||
|
|
||||||
#define DO_QUEUE_WORK_UNTIL_DONE(name) void name(work_queue* Queue, s32 ThreadID)
|
#define DO_QUEUE_WORK_UNTIL_DONE(name) void name(work_queue* Queue, s32 ThreadID)
|
||||||
|
@ -193,6 +193,9 @@ struct worker_thread_job
|
||||||
{
|
{
|
||||||
void* Data;
|
void* Data;
|
||||||
threaded_work_proc* WorkProc;
|
threaded_work_proc* WorkProc;
|
||||||
|
#ifdef DEBUG
|
||||||
|
char* JobName;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct work_queue
|
struct work_queue
|
||||||
|
@ -203,7 +206,7 @@ struct work_queue
|
||||||
u32 volatile JobsCount;
|
u32 volatile JobsCount;
|
||||||
u32 volatile NextJobIndex;
|
u32 volatile NextJobIndex;
|
||||||
u32 volatile JobsCompleted;
|
u32 volatile JobsCompleted;
|
||||||
worker_thread_job Jobs[256];
|
worker_thread_job* Jobs;
|
||||||
|
|
||||||
// Work Queue
|
// Work Queue
|
||||||
push_work_on_queue* PushWorkOnQueue;
|
push_work_on_queue* PushWorkOnQueue;
|
||||||
|
|
|
@ -174,15 +174,10 @@ SculptureView_Render(panel Panel, rect PanelBounds, render_command_buffer* Rende
|
||||||
JobData->ModelViewMatrix = ModelViewMatrix;
|
JobData->ModelViewMatrix = ModelViewMatrix;
|
||||||
JobData->LEDHalfWidth = LEDHalfWidth;
|
JobData->LEDHalfWidth = LEDHalfWidth;
|
||||||
|
|
||||||
Context.GeneralWorkQueue->PushWorkOnQueue(
|
Context.GeneralWorkQueue->PushWorkOnQueue(Context.GeneralWorkQueue, DrawLEDsInBufferRangeJob, JobData, "Sculpture Draw LEDS");
|
||||||
Context.GeneralWorkQueue,
|
|
||||||
DrawLEDsInBufferRangeJob,
|
|
||||||
JobData);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context.GeneralWorkQueue->DoQueueWorkUntilDone(Context.GeneralWorkQueue, 0);
|
Context.GeneralWorkQueue->DoQueueWorkUntilDone(Context.GeneralWorkQueue, 0);
|
||||||
Context.GeneralWorkQueue->ResetWorkQueue(Context.GeneralWorkQueue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FOLDHAUS_PANEL_SCULPTURE_VIEW_H
|
#define FOLDHAUS_PANEL_SCULPTURE_VIEW_H
|
||||||
|
|
|
@ -46,11 +46,28 @@ struct worker_thread_info
|
||||||
|
|
||||||
PUSH_WORK_ON_QUEUE(Win32PushWorkOnQueue)
|
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);
|
Assert(Queue->JobsCount < Queue->JobsMax);
|
||||||
|
|
||||||
worker_thread_job* Job = Queue->Jobs + Queue->JobsCount;
|
worker_thread_job* Job = Queue->Jobs + Queue->JobsCount;
|
||||||
Job->WorkProc = WorkProc;
|
Job->WorkProc = WorkProc;
|
||||||
Job->Data = Data;
|
Job->Data = Data;
|
||||||
|
#ifdef DEBUG
|
||||||
|
Job->JobName = JobName;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Complete Past Writes before Future Writes
|
// Complete Past Writes before Future Writes
|
||||||
_WriteBarrier();
|
_WriteBarrier();
|
||||||
|
@ -596,12 +613,15 @@ WinMain (
|
||||||
|
|
||||||
work_queue WorkQueue = {};
|
work_queue WorkQueue = {};
|
||||||
WorkQueue.SemaphoreHandle = CreateSemaphoreEx(0, 0, PLATFORM_THREAD_COUNT, 0, 0, SEMAPHORE_ALL_ACCESS);
|
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.NextJobIndex = 0;
|
||||||
WorkQueue.PushWorkOnQueue = Win32PushWorkOnQueue;
|
WorkQueue.PushWorkOnQueue = Win32PushWorkOnQueue;
|
||||||
WorkQueue.DoQueueWorkUntilDone = Win32DoQueueWorkUntilDone;
|
WorkQueue.DoQueueWorkUntilDone = Win32DoQueueWorkUntilDone;
|
||||||
WorkQueue.ResetWorkQueue = ResetWorkQueue;
|
WorkQueue.ResetWorkQueue = ResetWorkQueue;
|
||||||
|
|
||||||
|
OutputDebugStringA("Hellooooo\n");
|
||||||
|
|
||||||
for (s32 i = 0; i < PLATFORM_THREAD_COUNT; i++)
|
for (s32 i = 0; i < PLATFORM_THREAD_COUNT; i++)
|
||||||
{
|
{
|
||||||
// ID = 0 is reserved for this thread
|
// ID = 0 is reserved for this thread
|
||||||
|
|
Loading…
Reference in New Issue