Only memory leak on windows anymore
This commit is contained in:
+18
-7
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user