Skip to content

Commit

Permalink
Merge pull request #448 from 64/fix-defer
Browse files Browse the repository at this point in the history
kernel: use forkExecutor inside helYield
  • Loading branch information
avdgrinten committed May 16, 2022
2 parents ff1e831 + 5d91f4e commit 1173d90
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions kernel/thor/generic/thread.cpp
Expand Up @@ -98,26 +98,28 @@ void Thread::blockCurrent() {
}, &thisThread->_executor);
}

// FIXME: This function does not save the state! It needs to be given a ImageAccessor parameter!
void Thread::deferCurrent() {
auto this_thread = getCurrentThread();
auto thisThread = getCurrentThread();
StatelessIrqLock irq_lock;
auto lock = frg::guard(&this_thread->_mutex);
auto lock = frg::guard(&thisThread->_mutex);

if(logRunStates)
infoLogger() << "thor: " << (void *)this_thread.get()
infoLogger() << "thor: " << (void *)thisThread.get()
<< " is deferred" << frg::endlog;

assert(this_thread->_runState == kRunActive);
this_thread->_runState = kRunDeferred;
assert(thisThread->_runState == kRunActive);
thisThread->_runState = kRunDeferred;
getCpuData()->scheduler.update();
getCpuData()->scheduler.forceReschedule();
this_thread->_uninvoke();
thisThread->_uninvoke();

runOnStack([] (Continuation, frg::unique_lock<Mutex> lock) {
lock.unlock();
localScheduler()->commitReschedule();
}, getCpuData()->detachedStack.base(), std::move(lock));
forkExecutor([&] {
runOnStack([] (Continuation cont, Executor *executor, frg::unique_lock<Mutex> lock) {
scrubStack(executor, cont);
lock.unlock();
localScheduler()->commitReschedule();
}, getCpuData()->detachedStack.base(), &thisThread->_executor, std::move(lock));
}, &thisThread->_executor);
}

void Thread::deferCurrent(IrqImageAccessor image) {
Expand Down

0 comments on commit 1173d90

Please sign in to comment.