Commit in reactos/ntoskrnl/ex on MAIN
resource.c+26-11.29 -> 1.30
work.c+45-861.22 -> 1.23
+71-87
2 modified files
work.c: reimpl. using kernel queues
resource.c: add asserts

reactos/ntoskrnl/ex
resource.c 1.29 -> 1.30
diff -u -r1.29 -r1.30
--- resource.c	22 Oct 2004 20:18:35 -0000	1.29
+++ resource.c	21 Nov 2004 18:38:51 -0000	1.30
@@ -1,4 +1,4 @@
-/* $Id: resource.c,v 1.29 2004/10/22 20:18:35 ekohl Exp $
+/* $Id: resource.c,v 1.30 2004/11/21 18:38:51 gdalsnes Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -110,6 +110,17 @@
    DPRINT("ExAcquireResourceExclusiveLite(Resource %x, Wait %d)\n",
 	  Resource, Wait);
    
+   ASSERT_IRQL_LESS(DISPATCH_LEVEL);
+   
+/* undefed for now, since cdfs must be fixed first */
+#if 0    
+   /* At least regular kmode APC's must be disabled 
+    * Note that this requirement is missing in old DDK's */
+   ASSERT(KeGetCurrentThread() == NULL || /* <-Early in the boot process the current thread is obseved to be NULL */
+          KeGetCurrentThread()->KernelApcDisable || 
+          KeGetCurrentIrql() == APC_LEVEL);
+#endif
+
    KeAcquireSpinLock(&Resource->SpinLock, &oldIrql);
 
    /* resource already locked */
@@ -344,7 +355,19 @@
    
    DPRINT("ExAcquireResourceSharedLite(Resource %x, Wait %d)\n",
 	  Resource, Wait);
+
+   ASSERT_IRQL_LESS(DISPATCH_LEVEL);
    
+/* undefed for now, since cdfs must be fixed first */
+#if 0    
+   /* At least regular kmode APC's must be disabled 
+    * Note that this requirement is missing in old DDK's 
+    */
+   ASSERT(KeGetCurrentThread() == NULL || /* <-Early in the boot process the current thread is obseved to be NULL */
+          KeGetCurrentThread()->KernelApcDisable || 
+          KeGetCurrentIrql() == APC_LEVEL);
+#endif
+
    KeAcquireSpinLock(&Resource->SpinLock, &oldIrql);
    
    /* first, resolve trivial cases */
@@ -809,6 +832,8 @@
    DPRINT("ExReleaseResourceForThreadLite(Resource %x, ResourceThreadId %x)\n",
 	  Resource, ResourceThreadId);
    
+   ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
+   
    KeAcquireSpinLock(&Resource->SpinLock, &oldIrql);
    
    if (Resource->Flag & ResourceOwnedExclusive)

reactos/ntoskrnl/ex
work.c 1.22 -> 1.23
diff -u -r1.22 -r1.23
--- work.c	17 Nov 2004 23:55:36 -0000	1.22
+++ work.c	21 Nov 2004 18:38:51 -0000	1.23
@@ -1,4 +1,4 @@
-/* $Id: work.c,v 1.22 2004/11/17 23:55:36 gdalsnes Exp $
+/* $Id: work.c,v 1.23 2004/11/21 18:38:51 gdalsnes Exp $
  *
  * COPYRIGHT:          See COPYING in the top level directory
  * PROJECT:            ReactOS kernel
@@ -21,39 +21,16 @@
 
 /* TYPES *********************************************************************/
 
-typedef struct _WORK_QUEUE
-{
-   /*
-    * PURPOSE: Head of the list of waiting work items
-    */
-   LIST_ENTRY Head;
-   
-   /*
-    * PURPOSE: Sychronize access to the work queue
-    */
-   KSPIN_LOCK Lock;
-   
-   /*
-    * PURPOSE: Worker threads with nothing to do wait on this event
-    */
-   KSEMAPHORE Sem;
-   
-   /*
-    * PURPOSE: Thread associated with work queue
-    */
-   HANDLE Thread[NUMBER_OF_WORKER_THREADS];
-} WORK_QUEUE, *PWORK_QUEUE;
-
 /* GLOBALS *******************************************************************/
 
 /*
  * PURPOSE: Queue of items waiting to be processed at normal priority
  */
-WORK_QUEUE EiNormalWorkQueue;
+KQUEUE EiNormalWorkQueue;
 
-WORK_QUEUE EiCriticalWorkQueue;
+KQUEUE EiCriticalWorkQueue;
 
-WORK_QUEUE EiHyperCriticalWorkQueue;
+KQUEUE EiHyperCriticalWorkQueue;
 
 /* FUNCTIONS ****************************************************************/
 
@@ -69,52 +46,43 @@
  * calls PsTerminateSystemThread
  */
 {
-   PWORK_QUEUE queue = (PWORK_QUEUE)context;
+
    PWORK_QUEUE_ITEM item;
    PLIST_ENTRY current;
    
-   for(;;)
-     {
-	current = ExInterlockedRemoveHeadList(&queue->Head,
-					      &queue->Lock);
-	if (current!=NULL)
-	  {
-	     item = CONTAINING_RECORD(current,WORK_QUEUE_ITEM,List);
-	     item->WorkerRoutine(item->Parameter);
-	  }
-	else
-	  {
-	     KeWaitForSingleObject((PVOID)&queue->Sem,
-				   Executive,
-				   KernelMode,
-				   FALSE,
-				   NULL);
-	     DPRINT("Woke from wait\n");
-	  }
-     }
+   while (TRUE) 
+   {
+      current = KeRemoveQueue( (PKQUEUE)context, KernelMode, NULL );
+      item = CONTAINING_RECORD( current, WORK_QUEUE_ITEM, List);
+      item->WorkerRoutine(item->Parameter);
+      
+      if (KeGetCurrentIrql() != PASSIVE_LEVEL)
+      {
+         KeBugCheck(IRQL_NOT_LESS_OR_EQUAL);
+      }
+   }
+   
 }
 
-static VOID ExInitializeWorkQueue(PWORK_QUEUE WorkQueue,
+static VOID ExInitializeWorkQueue(PKQUEUE WorkQueue,
 				  KPRIORITY Priority)
 {
    ULONG i;
    PETHREAD Thread;
+   HANDLE   hThread;
+   
    
-   InitializeListHead(&WorkQueue->Head);
-   KeInitializeSpinLock(&WorkQueue->Lock);
-   KeInitializeSemaphore(&WorkQueue->Sem,
-			 0,
-			 256);
    for (i=0; i<NUMBER_OF_WORKER_THREADS; i++)
      {
-	PsCreateSystemThread(&WorkQueue->Thread[i],
+        
+   PsCreateSystemThread(&hThread,
 			     THREAD_ALL_ACCESS,
 			     NULL,
 			     NULL,
 			     NULL,
 			     ExWorkerThreadEntryPoint,
-			     WorkQueue);
-	ObReferenceObjectByHandle(WorkQueue->Thread[i],
+              WorkQueue);
+   ObReferenceObjectByHandle(hThread,
 				  THREAD_ALL_ACCESS,
 				  PsThreadType,
 				  KernelMode,
@@ -123,12 +91,17 @@
 	KeSetPriorityThread(&Thread->Tcb,
 			    Priority);
 	ObDereferenceObject(Thread);
+   ZwClose(hThread);
      }
 }
 
 VOID INIT_FUNCTION
 ExInitializeWorkerThreads(VOID)
 {
+   KeInitializeQueue( &EiNormalWorkQueue, NUMBER_OF_WORKER_THREADS );
+   KeInitializeQueue( &EiCriticalWorkQueue , NUMBER_OF_WORKER_THREADS );
+   KeInitializeQueue( &EiHyperCriticalWorkQueue , NUMBER_OF_WORKER_THREADS );
+
    ExInitializeWorkQueue(&EiNormalWorkQueue,
 			 LOW_PRIORITY);
    ExInitializeWorkQueue(&EiCriticalWorkQueue,
@@ -161,40 +134,26 @@
     switch(QueueType)
     {
     case DelayedWorkQueue:
-	    ExInterlockedInsertTailList(&EiNormalWorkQueue.Head,
-				    &WorkItem->List,
-				    &EiNormalWorkQueue.Lock);
-	    KeReleaseSemaphore(&EiNormalWorkQueue.Sem,
-			   IO_NO_INCREMENT,
-			   1,
-			   FALSE);
-	break;
+      KeInsertQueue (
+          &EiNormalWorkQueue,
+          &WorkItem->List
+            );
+   	break;
 	
     case CriticalWorkQueue:
-        ExInterlockedInsertTailList(&EiCriticalWorkQueue.Head,
-				    &WorkItem->List,
-				    &EiCriticalWorkQueue.Lock);
-        KeReleaseSemaphore(&EiCriticalWorkQueue.Sem,
-	       	  	   IO_NO_INCREMENT,
-	       		   1,
-	       		   FALSE);
-	    break;
+            KeInsertQueue (
+              &EiCriticalWorkQueue,
+              &WorkItem->List
+              );
+   	    break;
 
     case HyperCriticalWorkQueue:
-	    ExInterlockedInsertTailList(&EiHyperCriticalWorkQueue.Head,
-				    &WorkItem->List,
-				    &EiHyperCriticalWorkQueue.Lock);
-	    KeReleaseSemaphore(&EiHyperCriticalWorkQueue.Sem,
-			   IO_NO_INCREMENT,
-			   1,
-			   FALSE);
-    	break;
-
-#ifdef __USE_W32API
-	case MaximumWorkQueue:
-	   // Unimplemented
-	   break;
-#endif
+            KeInsertQueue (
+             &EiHyperCriticalWorkQueue,
+             &WorkItem->List
+             );
+        	break;
+
     }
 }
 
CVSspam 0.2.8