Only memory leak on windows anymore

This commit is contained in:
Dynamitos
2022-04-05 17:51:32 +02:00
parent 9003ced2df
commit bebfb94752
+18 -7
View File
@@ -123,6 +123,7 @@ struct JobPromiseBase
void resume() void resume()
{ {
std::scoped_lock lock(promiseLock);
validate(); validate();
if(!handle || handle.done() || executing()) if(!handle || handle.done() || executing())
{ {
@@ -133,6 +134,7 @@ struct JobPromiseBase
} }
void setContinuation(JobPromiseBase* cont) void setContinuation(JobPromiseBase* cont)
{ {
std::scoped_lock lock(promiseLock, cont->promiseLock);
validate(); validate();
assert(cont->ready()); assert(cont->ready());
continuation = cont; continuation = cont;
@@ -174,15 +176,20 @@ struct JobPromiseBase
} }
void removeRef() void removeRef()
{ {
validate();
numRefs--;
if(numRefs == 0)
{ {
if(!schedule()) std::scoped_lock lock(promiseLock);
validate();
numRefs--;
if(numRefs != 0)
{ {
handle.destroy(); return;
} }
} if(schedule())
{
return;
}
}
handle.destroy();
} }
void validate() void validate()
{ {
@@ -190,10 +197,11 @@ struct JobPromiseBase
assert(pad1 == 12345); assert(pad1 == 12345);
} }
uint64 pad0; uint64 pad0;
std::mutex promiseLock;
std::coroutine_handle<JobPromiseBase> handle; std::coroutine_handle<JobPromiseBase> handle;
Event* waitingFor; Event* waitingFor;
JobPromiseBase* continuation; JobPromiseBase* continuation;
uint64 numRefs; std::atomic_uint64_t numRefs;
Event finishedEvent; Event finishedEvent;
State state; State state;
uint64 pad1; uint64 pad1;
@@ -287,6 +295,7 @@ public:
{ {
// the co_await operator keeps a reference to this, it won't // the co_await operator keeps a reference to this, it won't
// be scheduled from the destructor // be scheduled from the destructor
std::scoped_lock lock(promise->promiseLock);
promise->schedule(); promise->schedule();
return promise->finishedEvent; return promise->finishedEvent;
} }
@@ -339,6 +348,7 @@ public:
std::scoped_lock lock(mainJobLock); std::scoped_lock lock(mainJobLock);
for(auto job : jobs) for(auto job : jobs)
{ {
std::scoped_lock lock(job.promise->promiseLock);
job.promise->validate(); job.promise->validate();
job.promise->state = JobPromiseBase<true>::State::SCHEDULED; job.promise->state = JobPromiseBase<true>::State::SCHEDULED;
mainJobs.add(job); mainJobs.add(job);
@@ -352,6 +362,7 @@ public:
std::scoped_lock lock(jobQueueLock); std::scoped_lock lock(jobQueueLock);
for(auto job : jobs) for(auto job : jobs)
{ {
std::scoped_lock lock(job.promise->promiseLock);
job.promise->validate(); job.promise->validate();
job.promise->state = JobPromiseBase<false>::State::SCHEDULED; job.promise->state = JobPromiseBase<false>::State::SCHEDULED;
jobQueue.add(job); jobQueue.add(job);