Per-CPU task switch disable, minor spiderscript changes
authorJohn Hodge <[email protected]>
Thu, 9 Sep 2010 01:27:15 +0000 (09:27 +0800)
committerJohn Hodge <[email protected]>
Thu, 9 Sep 2010 01:27:15 +0000 (09:27 +0800)
Kernel/arch/x86/include/arch.h
Kernel/include/threads.h
Kernel/threads.c
Usermode/Libraries/libspiderscript.so_src/parse.c

index 3ce9130..16a0402 100644 (file)
@@ -166,16 +166,17 @@ typedef signed short      Sint16;
 typedef signed long            Sint32;
 typedef signed long long       Sint64;
 typedef Uint   size_t;
+typedef char   BOOL;
 
 typedef Uint64 tPAddr;
 typedef Uint32 tVAddr;
 
 typedef struct {
-    Uint       gs, fs, es, ds;
-    Uint       edi, esi, ebp, kesp;
+       Uint    gs, fs, es, ds;
+       Uint    edi, esi, ebp, kesp;
        Uint    ebx, edx, ecx, eax;
-    Uint       int_num, err_code;
-    Uint       eip, cs;
+       Uint    int_num, err_code;
+       Uint    eip, cs;
        Uint    eflags, esp, ss;
 } tRegs;
 
index f1e4bb4..20d21f4 100644 (file)
@@ -7,14 +7,21 @@
 #include <signal.h>
 #include <proc.h>
 
+/**
+ * \brief IPC Message
+ */
 typedef struct sMessage
 {
-       struct sMessage *Next;
-       Uint    Source;
-       Uint    Length;
-       Uint8   Data[];
-} tMsg;        // sizeof = 12+
+       struct sMessage *Next;  //!< Next message in thread's inbox
+       tTID    Source; //!< Source thread ID
+       Uint    Length; //!< Length of message data in bytes
+       Uint8   Data[]; //!< Message data
+} tMsg;
 
+/**
+ * \brief Core threading structure
+ * 
+ */
 typedef struct sThread
 {
        // --- threads.c's
@@ -84,6 +91,9 @@ enum eFaultNumbers
 
 #define GETMSG_IGNORE  ((void*)-1)
 
+// === GLOBALS ===
+extern BOOL    gaThreads_NoTaskSwitch[MAX_CPUS];
+
 // === FUNCTIONS ===
 extern tThread *Proc_GetCurThread(void);
 extern tThread *Threads_GetThread(Uint TID);
index 5695955..51cfbdf 100644 (file)
@@ -78,6 +78,7 @@ tThread       *gActiveThreads = NULL;         // Currently Running Threads
 tThread        *gSleepingThreads = NULL;       // Sleeping Threads
 tThread        *gDeleteThreads = NULL;         // Threads to delete
  int   giNumCPUs = 1;  // Number of CPUs
+BOOL     gaThreads_NoTaskSwitch[MAX_CPUS];     // Disables task switches for each core (Pseudo-IF)
 
 // === CODE ===
 /**
@@ -832,12 +833,17 @@ tThread *Threads_GetNextToRun(int CPU, tThread *Last)
 {
        tThread *thread;
         int    ticket;
-        int    number; 
+        int    number;
        
        // If this CPU has the lock, we must let it complete
        if( CPU_HAS_LOCK( &glThreadListLock ) )
                return Last;
        
+       // Same if the current CPU has any lock
+       if( gaThreads_NoTaskSwitch[CPU] )
+               return Last;
+
+
        // Lock thread list
        SHORTLOCK( &glThreadListLock );
        
index 3ad4081..f32f876 100644 (file)
@@ -222,6 +222,7 @@ tAST_Node *Parse_DoBlockLine(tParser *Parser)
                ret = AST_NewIf(Parser, cond, true, false);
                }
                return ret;
+       
        case TOK_RWD_FOR:
                {
                tAST_Node       *init=NULL, *cond=NULL, *inc=NULL, *code;
@@ -245,6 +246,7 @@ tAST_Node *Parse_DoBlockLine(tParser *Parser)
                ret = AST_NewLoop(Parser, init, 0, cond, inc, code);
                }
                return ret;
+       
        case TOK_RWD_DO:
        case TOK_RWD_WHILE:
                TODO(Parser, "Implement do and while\n");

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