smp: cleanup Switch()
This commit is contained in:
parent
54f8aa54c1
commit
7e9cc76ec5
@ -27,29 +27,22 @@ static void printTree(tree_Node *root, int level, __tree_ConnectType type) {
|
|||||||
SYSV_ABI uintptr_t __smp_Switch() {
|
SYSV_ABI uintptr_t __smp_Switch() {
|
||||||
// the calling function smp_IntSwitch already CLI-ed for us
|
// the calling function smp_IntSwitch already CLI-ed for us
|
||||||
|
|
||||||
//io_Printf("__smp_Switch: Tick: %d, switching\n", __smp_Now);
|
|
||||||
|
|
||||||
__smp_Thread *t = __smp_Current[0];
|
__smp_Thread *t = __smp_Current[0];
|
||||||
|
|
||||||
uint64_t priority = UINT64_MAX;
|
uint64_t priority = UINT64_MAX;
|
||||||
// insert the current thread back into the waiting queue
|
|
||||||
if (t)
|
if (t)
|
||||||
priority = t->nice + (t->lastTick > __smp_Now ? t->lastTick : __smp_Now); // new priority for the thread
|
priority = t->nice + (t->lastTick > __smp_Now ? t->lastTick : __smp_Now); // new priority for the thread
|
||||||
//printTree(__smp_Threads->root, 0, 0);
|
|
||||||
//printTree(__smp_ThreadsWaiting->root, 0, 0);
|
// find the waiting thread with the least priority
|
||||||
tree_Node *first = tree_FirstNode(__smp_ThreadsWaiting);
|
tree_Node *first = tree_FirstNode(__smp_ThreadsWaiting);
|
||||||
|
while (first && (NODE_POINTER(first)->sleepUntil > __smp_Now || NODE_POINTER(first)->waitCondition != NULL))
|
||||||
//io_Printf(" first0.id=%d\n", NODE_POINTER(first) ? NODE_POINTER(first)->id : 0);
|
|
||||||
while (first && (NODE_POINTER(first)->sleepUntil > __smp_Now || NODE_POINTER(first)->waitCondition != NULL)) {
|
|
||||||
//io_Printf(" iterating, .id=%d\n", NODE_POINTER(first) ? NODE_POINTER(first)->id : 0);
|
|
||||||
first = tree_Node_Next(first);
|
first = tree_Node_Next(first);
|
||||||
}
|
|
||||||
|
|
||||||
if (first && (NODE_POINTER(first)->sleepUntil <= __smp_Now && NODE_POINTER(first)->waitCondition == NULL) && first->key > priority) {
|
|
||||||
|
if (first && (NODE_POINTER(first)->sleepUntil <= __smp_Now && NODE_POINTER(first)->waitCondition == NULL) && first->key > priority)
|
||||||
// the current thread is still the first, return
|
// the current thread is still the first, return
|
||||||
//io_Printf(" Not context switching, still running %d\n", t ? t->id : 0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
// we need a real context switch
|
// we need a real context switch
|
||||||
// first save the current thread context
|
// first save the current thread context
|
||||||
@ -58,10 +51,8 @@ SYSV_ABI uintptr_t __smp_Switch() {
|
|||||||
memcpy(&t->state, &__smp_IntSwitch_LastState, sizeof(smp_thread_State));
|
memcpy(&t->state, &__smp_IntSwitch_LastState, sizeof(smp_thread_State));
|
||||||
tree_Node *node = 0;
|
tree_Node *node = 0;
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
do {
|
while (!ok)
|
||||||
node = tree_InsertNode(__smp_ThreadsWaiting, priority, &ok);
|
node = tree_InsertNode(__smp_ThreadsWaiting, priority++, &ok);
|
||||||
priority++;
|
|
||||||
} while (!ok);
|
|
||||||
NODE_POINTER(node) = t;
|
NODE_POINTER(node) = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,10 +61,8 @@ SYSV_ABI uintptr_t __smp_Switch() {
|
|||||||
__smp_IntSwitch_LastState.rip = (uint64_t)__smp_Switch_Idle;
|
__smp_IntSwitch_LastState.rip = (uint64_t)__smp_Switch_Idle;
|
||||||
__smp_IntSwitch_LastState.rflags |= 1 << 9; // Interrupt Enable flag
|
__smp_IntSwitch_LastState.rflags |= 1 << 9; // Interrupt Enable flag
|
||||||
__smp_Current[0] = 0;
|
__smp_Current[0] = 0;
|
||||||
//io_WriteConsoleASCII("__smp_Switch: Entering idle\n");
|
|
||||||
} else {
|
} else {
|
||||||
// load the new context
|
// load the new context
|
||||||
//io_Printf(" Context switching, from %d to %d\n", t ? t->id : 0, NODE_POINTER(first)->id);
|
|
||||||
memcpy(&__smp_IntSwitch_LastState, &NODE_POINTER(first)->state, sizeof(smp_thread_State));
|
memcpy(&__smp_IntSwitch_LastState, &NODE_POINTER(first)->state, sizeof(smp_thread_State));
|
||||||
__smp_Current[0] = NODE_POINTER(first);
|
__smp_Current[0] = NODE_POINTER(first);
|
||||||
tree_Delete(__smp_ThreadsWaiting, first);
|
tree_Delete(__smp_ThreadsWaiting, first);
|
||||||
|
Loading…
Reference in New Issue
Block a user