git.ucc.asn.au
/
tpg
/
acess2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Usermode/include - A pile of hack known as the Acess fcntl.h
[tpg/acess2.git]
/
Kernel
/
threads.c
diff --git
a/Kernel/threads.c
b/Kernel/threads.c
index
aac6648
..
949f6d2
100644
(file)
--- a/
Kernel/threads.c
+++ b/
Kernel/threads.c
@@
-124,6
+124,7
@@
void Threads_Init(void)
Log_Debug("Threads", "Offsets of tThread");
Log_Debug("Threads", ".Priority = %i", offsetof(tThread, Priority));
Log_Debug("Threads", "Offsets of tThread");
Log_Debug("Threads", ".Priority = %i", offsetof(tThread, Priority));
+ Log_Debug("Threads", ".KernelStack = %i", offsetof(tThread, KernelStack));
// Create Initial Task
#if SCHEDULER_TYPE == SCHED_RR_PRI
// Create Initial Task
#if SCHEDULER_TYPE == SCHED_RR_PRI
@@
-232,12
+233,10
@@
void Threads_SetPriority(tThread *Thread, int Pri)
}
/**
}
/**
- * \fn tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
* \brief Clone the TCB of the current thread
* \brief Clone the TCB of the current thread
- * \param Err Error pointer
* \param Flags Flags for something... (What is this for?)
*/
* \param Flags Flags for something... (What is this for?)
*/
-tThread *Threads_CloneTCB(Uint
*Err, Uint
Flags)
+tThread *Threads_CloneTCB(Uint Flags)
{
tThread *cur, *new;
int i;
{
tThread *cur, *new;
int i;
@@
-245,7
+244,7
@@
tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
// Allocate and duplicate
new = malloc(sizeof(tThread));
// Allocate and duplicate
new = malloc(sizeof(tThread));
- if(new == NULL) {
*Err
= -ENOMEM; return NULL; }
+ if(new == NULL) {
errno
= -ENOMEM; return NULL; }
memcpy(new, cur, sizeof(tThread));
new->CurCPU = -1;
memcpy(new, cur, sizeof(tThread));
new->CurCPU = -1;
@@
-308,14
+307,12
@@
tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
}
/**
}
/**
- * \fn tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
- * \brief Clone the TCB of the current thread
+ * \brief Clone the TCB of the kernel thread
*/
tThread *Threads_CloneThreadZero(void)
{
*/
tThread *Threads_CloneThreadZero(void)
{
- tThread *
cur, *
new;
+ tThread *new;
int i;
int i;
- cur = Proc_GetCurThread();
// Allocate and duplicate
new = malloc(sizeof(tThread));
// Allocate and duplicate
new = malloc(sizeof(tThread));
@@
-342,28
+339,17
@@
tThread *Threads_CloneThreadZero(void)
new->LastMessage = NULL;
// Set State
new->LastMessage = NULL;
// Set State
- new->Remaining = new->Quantum =
cur->Quantum
;
- new->Priority =
cur->Priority
;
+ new->Remaining = new->Quantum =
DEFAULT_QUANTUM
;
+ new->Priority =
DEFAULT_PRIORITY
;
new->bInstrTrace = 0;
// Set Signal Handlers
new->CurFaultNum = 0;
new->bInstrTrace = 0;
// Set Signal Handlers
new->CurFaultNum = 0;
- new->FaultHandler =
cur->FaultHandler
;
+ new->FaultHandler =
0
;
for( i = 0; i < NUM_CFG_ENTRIES; i ++ )
{
for( i = 0; i < NUM_CFG_ENTRIES; i ++ )
{
- switch(cCONFIG_TYPES[i])
- {
- default:
- new->Config[i] = cur->Config[i];
- break;
- case CFGT_HEAPSTR:
- if(cur->Config[i])
- new->Config[i] = (Uint) strdup( (void*)cur->Config[i] );
- else
- new->Config[i] = 0;
- break;
- }
+ new->Config[i] = 0;
}
// Maintain a global list of threads
}
// Maintain a global list of threads
@@
-648,14
+634,16
@@
void Threads_Kill(tThread *Thread, int Status)
// Save exit status
Thread->RetStatus = Status;
// Save exit status
Thread->RetStatus = Status;
-
+
// Don't Zombie if we are being killed because our parent is
if(Status == -1)
{
Thread->Status = THREAD_STAT_DEAD;
Threads_AddToDelete( Thread );
// Don't Zombie if we are being killed because our parent is
if(Status == -1)
{
Thread->Status = THREAD_STAT_DEAD;
Threads_AddToDelete( Thread );
+ SHORTREL( &glThreadListLock );
} else {
Thread->Status = THREAD_STAT_ZOMBIE;
} else {
Thread->Status = THREAD_STAT_ZOMBIE;
+ SHORTREL( &glThreadListLock );
// Wake parent
Threads_Wake( Thread->Parent );
}
// Wake parent
Threads_Wake( Thread->Parent );
}
@@
-663,7
+651,6
@@
void Threads_Kill(tThread *Thread, int Status)
Log("Thread %i went *hurk* (%i)", Thread->TID, Status);
// Release spinlocks
Log("Thread %i went *hurk* (%i)", Thread->TID, Status);
// Release spinlocks
- SHORTREL( &glThreadListLock );
SHORTREL( &Thread->IsLocked ); // TODO: We may not actually be released...
// And, reschedule
SHORTREL( &Thread->IsLocked ); // TODO: We may not actually be released...
// And, reschedule
@@
-679,6
+666,7
@@
void Threads_Kill(tThread *Thread, int Status)
*/
void Threads_Yield(void)
{
*/
void Threads_Yield(void)
{
+// Log("Threads_Yield: by %p", __builtin_return_address(0));
Proc_Reschedule();
}
Proc_Reschedule();
}
@@
-716,8
+704,11
@@
void Threads_Sleep(void)
// Release Spinlock
SHORTREL( &glThreadListLock );
// Release Spinlock
SHORTREL( &glThreadListLock );
- while(cur->Status != THREAD_STAT_ACTIVE)
+ while(cur->Status != THREAD_STAT_ACTIVE)
{
Proc_Reschedule();
Proc_Reschedule();
+ if( cur->Status != THREAD_STAT_ACTIVE )
+ Log("%i - Huh? why am I up? zzzz...", cur->TID);
+ }
}
}
@@
-744,12
+735,12
@@
int Threads_Wake(tThread *Thread)
// Remove from sleeping queue
Threads_int_DelFromQueue(&gSleepingThreads, Thread);
// Remove from sleeping queue
Threads_int_DelFromQueue(&gSleepingThreads, Thread);
+ SHORTREL( &glThreadListLock );
Threads_AddActive( Thread );
#if DEBUG_TRACE_STATE
Log("Threads_Sleep: %p (%i %s) woken", Thread, Thread->TID, Thread->ThreadName);
#endif
Threads_AddActive( Thread );
#if DEBUG_TRACE_STATE
Log("Threads_Sleep: %p (%i %s) woken", Thread, Thread->TID, Thread->ThreadName);
#endif
- SHORTREL( &glThreadListLock );
return -EOK;
case THREAD_STAT_SEMAPHORESLEEP: {
return -EOK;
case THREAD_STAT_SEMAPHORESLEEP: {
@@
-792,9
+783,7
@@
int Threads_Wake(tThread *Thread)
sem->LastSignaling = prev;
}
sem->LastSignaling = prev;
}
- SHORTLOCK( &glThreadListLock );
Threads_AddActive( Thread );
Threads_AddActive( Thread );
- SHORTREL( &glThreadListLock );
#if DEBUG_TRACE_STATE
Log("Threads_Sleep: %p(%i %s) woken from semaphore", Thread, Thread->TID, Thread->ThreadName);
#if DEBUG_TRACE_STATE
Log("Threads_Sleep: %p(%i %s) woken from semaphore", Thread, Thread->TID, Thread->ThreadName);
@@
-999,7
+988,7
@@
void Threads_SegFault(tVAddr Addr)
tThread *cur = Proc_GetCurThread();
cur->bInstrTrace = 0;
Log_Warning("Threads", "Thread #%i committed a segfault at address %p", cur->TID, Addr);
tThread *cur = Proc_GetCurThread();
cur->bInstrTrace = 0;
Log_Warning("Threads", "Thread #%i committed a segfault at address %p", cur->TID, Addr);
- MM_DumpTables(0,
KERNEL_BASE
);
+ MM_DumpTables(0,
USER_MAX
);
Threads_Fault( 1 );
//Threads_Exit( 0, -1 );
}
Threads_Fault( 1 );
//Threads_Exit( 0, -1 );
}
@@
-1292,7
+1281,7
@@
tThread *Threads_GetNextToRun(int CPU, tThread *Last)
}
// If we fall onto the same queue again, special handling is
// needed
}
// If we fall onto the same queue again, special handling is
// needed
- if( Last && i == Last->Priority ) {
+ if( Last &&
Last->Status == THREAD_STAT_ACTIVE &&
i == Last->Priority ) {
tThread *savedThread = thread;
// Find the next unscheduled thread in the list
tThread *savedThread = thread;
// Find the next unscheduled thread in the list
@@
-1313,6
+1302,9
@@
tThread *Threads_GetNextToRun(int CPU, tThread *Last)
SHORTREL(&glThreadListLock);
return NULL;
}
SHORTREL(&glThreadListLock);
return NULL;
}
+ if( thread->Status != THREAD_STAT_ACTIVE ) {
+ LogF("Oops, Thread %i (%s) is not active\n", thread->TID, thread->ThreadName);
+ }
}
#elif SCHEDULER_TYPE == SCHED_RR_SIM
{
}
#elif SCHEDULER_TYPE == SCHED_RR_SIM
{
UCC
git Repository :: git.ucc.asn.au