Replace rand() implementation - fixes threading lockups
authorJohn Hodge <[email protected]>
Sun, 3 Oct 2010 01:28:52 +0000 (09:28 +0800)
committerJohn Hodge <[email protected]>
Sun, 3 Oct 2010 01:28:52 +0000 (09:28 +0800)
- Large ammounts of debug enabled to trace #PF in FAT driver
- Added TID to Debug logging
- Enabled locking on debug prints

Kernel/binary.c
Kernel/debug.c
Kernel/lib.c
Kernel/syscalls.c
Kernel/vfs/main.c
Kernel/vfs/open.c
Modules/Filesystems/FAT/fat.c
Usermode/Applications/login_src/main.c

index aa5d954..dffb178 100644 (file)
@@ -2,7 +2,7 @@
  * Acess2
  * Common Binary Loader
  */
-#define DEBUG  0
+#define DEBUG  1
 #include <acess.h>
 #include <binary.h>
 #include <mm_virt.h>
index 8533a9e..ce87d9d 100644 (file)
@@ -13,7 +13,7 @@
 #define        GDB_SERIAL_PORT 0x2F8
 #define        DEBUG_MAX_LINE_LEN      256
 
-#define        LOCK_DEBUG_OUTPUT       0
+#define        LOCK_DEBUG_OUTPUT       1
 
 // === IMPORTS ===
 extern void Threads_Dump(void);
@@ -35,7 +35,7 @@ void  Debug_Fmt(const char *format, va_list args);
  int   gbDebug_IsKPanic = 0;
 volatile int   gbInPutChar = 0;
 #if LOCK_DEBUG_OUTPUT
-tSpinlock      glDebug_Lock;
+tShortSpinlock glDebug_Lock;
 #endif
 
 // === CODE ===
@@ -155,6 +155,14 @@ void Debug_Fmt(const char *format, va_list args)
        return ;
 }
 
+void Debug_FmtS(const char *format, ...)
+{
+       va_list args;   
+       va_start(args, format);
+       Debug_Fmt(format, args);
+       va_end(args);
+}
+
 void Debug_KernelPanic()
 {
        gbDebug_IsKPanic = 1;
@@ -169,7 +177,7 @@ void LogF(char *Fmt, ...)
        va_list args;
 
        #if LOCK_DEBUG_OUTPUT
-       VTIGHTLOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
        
        va_start(args, Fmt);
@@ -179,7 +187,7 @@ void LogF(char *Fmt, ...)
        va_end(args);
        
        #if LOCK_DEBUG_OUTPUT
-       RELEASE(&glDebug_Lock);
+       SHORTREL(&glDebug_Lock);
        #endif
 }
 /**
@@ -191,7 +199,7 @@ void Debug(char *Fmt, ...)
        va_list args;
        
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
 
        Debug_Puts(0, "Debug: ");
@@ -201,7 +209,7 @@ void Debug(char *Fmt, ...)
        Debug_PutCharDebug('\r');
        Debug_PutCharDebug('\n');
        #if LOCK_DEBUG_OUTPUT
-       RELEASE(&glDebug_Lock);
+       SHORTREL(&glDebug_Lock);
        #endif
 }
 /**
@@ -212,7 +220,7 @@ void Log(char *Fmt, ...)
        va_list args;
        
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
 
        Debug_Puts(1, "Log: ");
@@ -223,7 +231,7 @@ void Log(char *Fmt, ...)
        Debug_Putchar('\n');
        
        #if LOCK_DEBUG_OUTPUT
-       RELEASE(&glDebug_Lock);
+       SHORTREL(&glDebug_Lock);
        #endif
 }
 void Warning(char *Fmt, ...)
@@ -231,7 +239,7 @@ void Warning(char *Fmt, ...)
        va_list args;
        
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
        
        Debug_Puts(1, "Warning: ");
@@ -242,7 +250,7 @@ void Warning(char *Fmt, ...)
        Debug_Putchar('\n');
        
        #if LOCK_DEBUG_OUTPUT
-       RELEASE(&glDebug_Lock);
+       SHORTREL(&glDebug_Lock);
        #endif
 }
 void Panic(char *Fmt, ...)
@@ -250,9 +258,9 @@ void Panic(char *Fmt, ...)
        va_list args;
        
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
-       // And never release
+       // And never SHORTREL
        
        Debug_KernelPanic();
        
@@ -287,14 +295,23 @@ void Debug_SetKTerminal(char *File)
 void Debug_Enter(char *FuncName, char *ArgTypes, ...)
 {
        va_list args;
-        int    i = gDebug_Level ++;
+        int    i;
         int    pos;
+       tTID    tid = Threads_GetTID();
+        
+       #if LOCK_DEBUG_OUTPUT
+       SHORTLOCK(&glDebug_Lock);
+       #endif
+
+       i = gDebug_Level ++;
 
        va_start(args, ArgTypes);
 
        while(i--)      Debug_Putchar(' ');
 
-       Debug_Puts(1, FuncName);        Debug_Puts(1, ": (");
+       Debug_Puts(1, FuncName);
+       Debug_FmtS("[%i]", tid);
+       Debug_Puts(1, ": (");
 
        while(*ArgTypes)
        {
@@ -326,33 +343,51 @@ void Debug_Enter(char *FuncName, char *ArgTypes, ...)
 
        va_end(args);
        Debug_Putchar(')');     Debug_Putchar('\r');    Debug_Putchar('\n');
+       
+       #if LOCK_DEBUG_OUTPUT
+       SHORTREL(&glDebug_Lock);
+       #endif
 }
 
 void Debug_Log(char *FuncName, char *Fmt, ...)
 {
        va_list args;
         int    i = gDebug_Level;
+       tTID    tid = Threads_GetTID();
+
+       #if LOCK_DEBUG_OUTPUT
+       SHORTLOCK(&glDebug_Lock);
+       #endif
 
        va_start(args, Fmt);
 
        while(i--)      Debug_Putchar(' ');
 
-       Debug_Puts(1, FuncName);        Debug_Puts(1, ": ");
+       Debug_Puts(1, FuncName);
+       Debug_FmtS("[%i]", tid);
+       Debug_Puts(1, ": ");
        Debug_Fmt(Fmt, args);
 
        va_end(args);
        Debug_Putchar('\r');
        Debug_Putchar('\n');
+       
+       #if LOCK_DEBUG_OUTPUT
+       SHORTREL(&glDebug_Lock);
+       #endif
 }
 
 void Debug_Leave(char *FuncName, char RetType, ...)
 {
        va_list args;
-        int    i = --gDebug_Level;
+        int    i;
+       tTID    tid = Threads_GetTID();
 
        #if LOCK_DEBUG_OUTPUT
-       LOCK(&glDebug_Lock);
+       SHORTLOCK(&glDebug_Lock);
        #endif
+       
+       i = --gDebug_Level;
 
        va_start(args, RetType);
 
@@ -363,12 +398,17 @@ void Debug_Leave(char *FuncName, char RetType, ...)
        // Indenting
        while(i--)      Debug_Putchar(' ');
 
-       Debug_Puts(1, FuncName);        Debug_Puts(1, ": RETURN");
+       Debug_Puts(1, FuncName);
+       Debug_FmtS("(%i)", tid);
+       Debug_Puts(1, ": RETURN");
 
        // No Return
        if(RetType == '-') {
                Debug_Putchar('\r');
                Debug_Putchar('\n');
+               #if LOCK_DEBUG_OUTPUT
+               SHORTREL(&glDebug_Lock);
+               #endif
                return;
        }
 
@@ -388,6 +428,10 @@ void Debug_Leave(char *FuncName, char RetType, ...)
        Debug_Putchar('\n');
 
        va_end(args);
+       
+       #if LOCK_DEBUG_OUTPUT
+       SHORTREL(&glDebug_Lock);
+       #endif
 }
 
 void Debug_HexDump(char *Header, void *Data, Uint Length)
index cab15b3..2ce5c98 100644 (file)
@@ -8,7 +8,7 @@
 #define        RANDOM_SEED     0xACE55052
 #define        RANDOM_A        0x00731ADE
 #define        RANDOM_C        12345
-#define        RANDOM_SPRUCE   0xf12b02b
+#define        RANDOM_SPRUCE   0xf12b039
 //                          Jan Feb Mar Apr May  Jun  Jul  Aug  Sept Oct  Nov  Dec
 const short DAYS_BEFORE[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
 #define UNIX_TO_2K     ((30*365*3600*24) + (7*3600*24))        //Normal years + leap years
@@ -66,9 +66,6 @@ EXPORT(CheckMem);
 EXPORT(ModUtil_LookupString);
 EXPORT(ModUtil_SetIdent);
 
-// === GLOBALS ===
-static Uint    giRandomState = RANDOM_SEED;
-
 // === CODE ===
 /**
  * \brief Convert a string into an integer
@@ -679,12 +676,27 @@ Sint64 timestamp(int sec, int mins, int hrs, int day, int month, int year)
  */
 Uint rand(void)
 {
-       Uint    old = giRandomState;
+       #if 0
+       static Uint     state = RANDOM_SEED;
+       Uint    old = state;
        // Get the next state value
-       giRandomState = (RANDOM_A*giRandomState + RANDOM_C) & 0xFFFFFFFF;
+       giRandomState = (RANDOM_A*state + RANDOM_C);
        // Check if it has changed, and if it hasn't, change it
-       if(giRandomState == old)        giRandomState += RANDOM_SPRUCE;
-       return giRandomState;
+       if(state == old)        state += RANDOM_SPRUCE;
+       return state;
+       #else
+       // http://en.wikipedia.org/wiki/Xorshift
+       // 2010-10-03
+       static Uint32   x = 123456789;
+       static Uint32   y = 362436069;
+       static Uint32   z = 521288629;
+       static Uint32   w = 88675123; 
+       Uint32  t;
+       t = x ^ (x << 11);
+       x = y; y = z; z = w;
+       return w = w ^ (w >> 19) ^ t ^ (t >> 8); 
+       #endif
 }
 
 /* *
index 97459c2..d286d21 100644 (file)
@@ -176,7 +176,7 @@ void SyscallHandler(tSyscallRegs *Regs)
                }
                LEAVE('s', "Assuming 0");
                // Path, **Argv, **Envp
-               ret = Proc_Execve((char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3);
+               ret = Proc_Execve( (char*)Regs->Arg1, (char**)Regs->Arg2, (char**)Regs->Arg3 );
                break;
        // -- Load a binary into the current process
        case SYS_LOADBIN:
index f072a28..cd9c451 100644 (file)
@@ -72,8 +72,10 @@ char *VFS_GetTruePath(char *Path)
        
        tmp = VFS_GetAbsPath(Path);
        if(tmp == NULL) return NULL;
+       Log(" VFS_GetTruePath: tmp = '%s'", tmp);
        node = VFS_ParsePath(tmp, &ret);
        free(tmp);
+       Log(" VFS_GetTruePath: node=%p, ret='%s'", node, ret);
        
        if(!node)       return NULL;
        if(node->Close) node->Close(node);
index 3a2622f..0bca8ca 100644 (file)
@@ -2,7 +2,7 @@
  * AcessMicro VFS
  * - Open, Close and ChDir
  */
-#define DEBUG  0
+#define DEBUG  1
 #include <acess.h>
 #include <mm_virt.h>
 #include "vfs.h"
@@ -391,7 +391,7 @@ tVFS_Node *VFS_ParsePath(const char *Path, char **TruePath)
                (*TruePath)[retLength] = '/';
                strcpy(*TruePath+retLength+1, pathEle);
                
-               LOG("*TruePath = '%s'\n", *TruePath);
+               LOG("*TruePath = '%s'", *TruePath);
                
                // - Extend Path
                retLength += nextSlash + 1;
index e14fad0..5d1c7f5 100644 (file)
@@ -17,7 +17,7 @@
  * \todo Implement changing of the parent directory when a file is written to\r
  * \todo Implement file creation / deletion\r
  */\r
-#define DEBUG  0\r
+#define DEBUG  1\r
 #define VERBOSE        1\r
 \r
 #define CACHE_FAT      0       //!< Caches the FAT in memory\r
index 353c90a..2bafe3b 100644 (file)
@@ -46,6 +46,8 @@ int main(int argc, char *argv[])
                        return -1;
                }
                
+               printf("pid = %i\n", pid);
+               
                // Spawn shell in a child process
                if(pid == 0)
                {

UCC git Repository :: git.ucc.asn.au