Files
mm/src/libultra/os/startthread.c
T
2023-09-03 17:18:23 -03:00

37 lines
1015 B
C

#include "ultra64.h"
void osStartThread(OSThread* t) {
register u32 saveMask;
saveMask = __osDisableInt();
switch (t->state) {
case OS_STATE_WAITING:
t->state = OS_STATE_RUNNABLE;
__osEnqueueThread(&__osRunQueue, t);
break;
case OS_STATE_STOPPED:
if ((t->queue == NULL) || (t->queue == &__osRunQueue)) {
t->state = OS_STATE_RUNNABLE;
__osEnqueueThread(&__osRunQueue, t);
} else {
t->state = OS_STATE_WAITING;
__osEnqueueThread(t->queue, t);
__osEnqueueThread(&__osRunQueue, __osPopThread(t->queue));
}
break;
}
if (__osRunningThread == NULL) {
__osDispatchThread();
} else {
if (__osRunningThread->priority < __osRunQueue->priority) {
__osRunningThread->state = OS_STATE_RUNNABLE;
__osEnqueueAndYield(&__osRunQueue);
}
}
__osRestoreInt(saveMask);
}