// === IMPORTS ===
extern void ArchThreads_Init(void);
extern void Proc_CallFaultHandler(tThread *Thread);
+extern void Proc_DumpThreadCPUState(tThread *Thread);
extern int GetCPUNum(void);
// === PROTOTYPES ===
// -- Core Thread --
// Only used for the core kernel
tThread gThreadZero = {
- Status: THREAD_STAT_ACTIVE, // Status
- ThreadName: (char*)"ThreadZero", // Name
- Quantum: DEFAULT_QUANTUM, // Default Quantum
- Remaining: DEFAULT_QUANTUM, // Current Quantum
- Priority: DEFAULT_PRIORITY // Number of tickets
+ .Status = THREAD_STAT_ACTIVE, // Status
+ .ThreadName = (char*)"ThreadZero", // Name
+ .Quantum = DEFAULT_QUANTUM, // Default Quantum
+ .Remaining = DEFAULT_QUANTUM, // Current Quantum
+ .Priority = DEFAULT_PRIORITY // Number of tickets
};
// -- Processes --
// --- Locks ---
// Set state
Thread->Status = THREAD_STAT_ACTIVE;
- Thread->CurCPU = -1;
// Add to active list
#if SCHEDULER_TYPE == SCHED_RR_PRI
Thread->Next = gaActiveThreads[Thread->Priority];
giNumActiveThreads ++;
#if SCHEDULER_TYPE == SCHED_LOTTERY
- giFreeTickets += caiTICKET_COUNTS[ Thread->Priority ];
- # if DEBUG_TRACE_TICKETS
- Log("Threads_AddActive: CPU%i %p %i (%s) added, new giFreeTickets = %i",
- GetCPUNum(), Thread, Thread->TID, Thread->ThreadName, giFreeTickets);
- # endif
+ {
+ int delta;
+ // Only change the ticket count if the thread is un-scheduled
+ if(Thread->CurCPU != -1)
+ delta = 0;
+ else
+ delta = caiTICKET_COUNTS[ Thread->Priority ];
+
+ giFreeTickets += delta;
+ # if DEBUG_TRACE_TICKETS
+ Log("CPU%i %p (%i %s) added, new giFreeTickets = %i [+%i]",
+ GetCPUNum(), Thread, Thread->TID, Thread->ThreadName,
+ giFreeTickets, delta
+ );
+ # endif
+ }
#endif
SHORTREL( &glThreadListLock );
ret->Next = NULL;
ret->Remaining = 0;
- ret->CurCPU = -1;
giNumActiveThreads --;
// no need to decrement tickets, scheduler did it for us
#if SCHEDULER_TYPE == SCHED_LOTTERY && DEBUG_TRACE_TICKETS
- Log("Threads_RemActive: CPU%i %p %i (%s) removed, giFreeTickets = %i",
+ Log("CPU%i %p (%i %s) removed, giFreeTickets = %i [nc]",
GetCPUNum(), ret, ret->TID, ret->ThreadName, giFreeTickets);
#endif
Log(" ERROR State (%i) != THREAD_STAT_ACTIVE (%i)", thread->Status, THREAD_STAT_ACTIVE);
Log(" Priority %i, Quantum %i", thread->Priority, thread->Quantum);
Log(" KStack 0x%x", thread->KernelStack);
+ Proc_DumpThreadCPUState(thread);
}
#if SCHEDULER_TYPE == SCHED_RR_PRI
#if SCHEDULER_TYPE == SCHED_LOTTERY
giFreeTickets += caiTICKET_COUNTS[ Last->Priority ];
# if DEBUG_TRACE_TICKETS
- LogF(" CPU %i released %p (%i %s) into the pool (%i tickets in pool)\n",
- CPU, Last, Last->TID, Last->ThreadName, giFreeTickets);
+ LogF("Log: CPU%i released %p (%i %s) into the pool (%i [+%i] tickets in pool)\n",
+ CPU, Last, Last->TID, Last->ThreadName, giFreeTickets,
+ caiTICKET_COUNTS[ Last->Priority ]);
# endif
#endif
}
#if SCHEDULER_TYPE == SCHED_LOTTERY && DEBUG_TRACE_TICKETS
else
- LogF(" CPU %i released %p (%i %s)->Status = %i (Released)\n",
+ LogF("Log: CPU%i released %p (%i %s)->Status = %i (Released)\n",
CPU, Last, Last->TID, Last->ThreadName, Last->Status);
#endif
Last->CurCPU = -1;
Panic("Bookeeping Failed - giFreeTickets(%i) > true count (%i)",
giFreeTickets, number);
}
- # if DEBUG_TRACE_TICKETS
- LogF(" CPU%i giFreeTickets = %i, running %p (%i %s CPU=%i)\n",
- CPU, giFreeTickets, thread, thread->TID, thread->ThreadName, thread->CurCPU);
- # endif
giFreeTickets -= caiTICKET_COUNTS[ thread->Priority ];
+ # if DEBUG_TRACE_TICKETS
+ LogF("Log: CPU%i allocated %p (%i %s), (%i [-%i] tickets in pool), \n",
+ CPU, thread, thread->TID, thread->ThreadName,
+ giFreeTickets, caiTICKET_COUNTS[ thread->Priority ]);
+ # endif
}
// ---