@@ -123,15 +123,19 @@ void TaskRing::UnlockQueue( const uint8_t queue ) {
123123 queueLocks -= SetBit ( 0ull , queue );
124124}
125125
126- void TaskRing::RemoveTask ( const uint8_t queue, const uint8_t taskID ) {
127- LockQueue ( queue );
126+ void TaskRing::RemoveTask ( const uint8_t queue, const uint8_t taskID, const bool queueLocked ) {
127+ if ( !queueLocked ) {
128+ LockQueue ( queue );
129+ }
128130
129131 UnSetBit ( &queues[queue].availableTasks , taskID );
130132 queues[queue].tasks [taskID] = 0 ;
131133
132134 taskCount.fetch_sub ( 1 , std::memory_order_relaxed );
133135
134- UnlockQueue ( queue );
136+ if ( !queueLocked ) {
137+ UnlockQueue ( queue );
138+ }
135139}
136140
137141bool TaskList::AddedToTaskRing ( const uint16_t id ) {
@@ -241,7 +245,7 @@ bool TaskList::ResolveDependencies( Task& task, TaskInitList<T>& dependencies )
241245 counter++;
242246 }
243247
244- task.dependencyCounter += counter;
248+ task.dependencyCounter . fetch_add ( counter, std::memory_order_relaxed ) ;
245249
246250 return counter;
247251}
@@ -260,8 +264,10 @@ void TaskList::AddTask( Task& task, TaskInitList<T>&& dependencies ) {
260264
261265 task.bufferID = taskMemory - tasks.memory ;
262266
267+ *taskMemory = task;
268+
263269 TaskRing* taskRing;
264- if ( ResolveDependencies ( task , dependencies ) ) {
270+ if ( ResolveDependencies ( *taskMemory , dependencies ) ) {
265271 task.id = forwardTaskRing.AddToTaskRing ( task, false );
266272 taskRing = &forwardTaskRing;
267273 } else {
@@ -271,13 +277,18 @@ void TaskList::AddTask( Task& task, TaskInitList<T>&& dependencies ) {
271277
272278 SetBit ( &task.id , TASK_SHIFT_ALLOCATED );
273279
274- task.dependencyCounter -- ;
280+ taskMemory-> id = task.id ;
275281
276- *taskMemory = task;
282+ const uint32_t counter = taskMemory->dependencyCounter .fetch_sub ( 1 , std::memory_order_relaxed ) - 1 ;
283+
284+ if ( !counter && taskRing == &forwardTaskRing ) {
285+ forwardTaskRing.RemoveTask ( IDToTaskQueue ( task.id ), IDToTaskID ( task.id ), true );
286+ taskRing->AddToTaskRing ( task );
287+ }
277288
278289 taskRing->UnlockQueue ( IDToTaskQueue ( task.id ) );
279290
280- TLM .addTimer .Stop ();
291+ TLM .addTimer .Stop ();
281292}
282293
283294void TaskList::AddTask ( Task& task, std::initializer_list<Task> dependencies ) {
@@ -304,6 +315,12 @@ Task* TaskList::FetchTask( Thread* thread, const bool longestTask ) {
304315 uint64_t mask = 0 ;
305316
306317 TLM .fetchOuterTimer .Start ();
318+
319+ if ( !mainTaskRing.taskCount .load ( std::memory_order_relaxed ) ) {
320+ TLM .fetchOuterTimer .Stop ();
321+ return nullptr ;
322+ }
323+
307324 while ( true ) {
308325 uint64_t expected = mainTaskRing.queueLocks .load ();
309326 uint64_t desired;
0 commit comments