- Fix regression in Firefox installer by making KiWaitSatisfyAll a function instead of a macro. - Make KiCheckAleratbility a macro to simplify its code and callers, and also clearly explain what rules it obeys. Modified: trunk/reactos/include/ndk/ketypes.h Modified: trunk/reactos/include/ndk/umtypes.h Modified: trunk/reactos/include/reactos/debug.h Modified: trunk/reactos/ntoskrnl/include/internal/ke.h Modified: trunk/reactos/ntoskrnl/ke/kthread.c Modified: trunk/reactos/ntoskrnl/ke/wait.c _____
Modified: trunk/reactos/include/ndk/ketypes.h --- trunk/reactos/include/ndk/ketypes.h 2006-01-10 20:50:21 UTC (rev 20767) +++ trunk/reactos/include/ndk/ketypes.h 2006-01-10 21:36:42 UTC (rev 20768) @@ -40,6 +40,16 @@
// #define SSDT_MAX_ENTRIES 4
+// +// Maximum number of times a thread can be suspended +// +#define MAXIMUM_SUSPEND_COUNT 0x7F + +// +// Dispatcher Priority increments +// +#define THREAD_ALERT_INCREMENT 2 + #ifdef NTOS_MODE_USER
// _____
Modified: trunk/reactos/include/ndk/umtypes.h --- trunk/reactos/include/ndk/umtypes.h 2006-01-10 20:50:21 UTC (rev 20767) +++ trunk/reactos/include/ndk/umtypes.h 2006-01-10 21:36:42 UTC (rev 20768) @@ -34,16 +34,16 @@
// #ifndef _MANAGED #if defined(_M_IX86) -#define FASTCALL _fastcall +#define FASTCALL _fastcall #else #define FASTCALL #endif #else -#define FASTCALL NTAPI +#define FASTCALL NTAPI #endif
#if !defined(_M_CEE_PURE) -#define NTAPI_INLINE NTAPI +#define NTAPI_INLINE NTAPI #else #define NTAPI_INLINE #endif @@ -66,25 +66,32 @@ // // Native API Return Value Macros // -#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) -#define NT_INFORMATION(Status) ((((ULONG)(Status)) >> 30) == 1) -#define NT_WARNING(Status) ((((ULONG)(Status)) >> 30) == 2) -#define NT_ERROR(Status) ((((ULONG)(Status)) >> 30) == 3) +#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) +#define NT_INFORMATION(Status) ((((ULONG)(Status)) >> 30) == 1) +#define NT_WARNING(Status) ((((ULONG)(Status)) >> 30) == 2) +#define NT_ERROR(Status) ((((ULONG)(Status)) >> 30) == 3)
// // Limits // -#define MINCHAR 0x80 -#define MAXCHAR 0x7f -#define MINSHORT 0x8000 -#define MAXSHORT 0x7fff -#define MINLONG 0x80000000 -#define MAXLONG 0x7fffffff -#define MAXUCHAR 0xff -#define MAXUSHORT 0xffff -#define MAXULONG 0xffffffff +#define MINCHAR 0x80 +#define MAXCHAR 0x7f +#define MINSHORT 0x8000 +#define MAXSHORT 0x7fff +#define MINLONG 0x80000000 +#define MAXLONG 0x7fffffff +#define MAXUCHAR 0xff +#define MAXUSHORT 0xffff +#define MAXULONG 0xffffffff
// +// CSR Macros +// +#define CSR_MAKE_OPCODE(s,m) ((s) << 16) | (m) +#define CSR_API_ID_FROM_OPCODE(n) ((ULONG)((USHORT)(n))) +#define CSR_SERVER_ID_FROM_OPCODE(n) (ULONG)((n) >> 16) + +// // Basic Types that aren't defined in User-Mode Headers // typedef CONST int CINT; _____
Modified: trunk/reactos/include/reactos/debug.h --- trunk/reactos/include/reactos/debug.h 2006-01-10 20:50:21 UTC (rev 20767) +++ trunk/reactos/include/reactos/debug.h 2006-01-10 21:36:42 UTC (rev 20768) @@ -22,7 +22,7 @@
#endif
/* Define DbgPrint/RtlAssert unless the NDK is used */ -#if !defined(_NTNDK_) && (!defined(_NTDDK_) || !defined(__NTDDK_H)) +#if !defined(_RTLFUNCS_H) && (!defined(_NTDDK_) || !defined(__NTDDK_H))
/* Make sure we have basic types (some people include us *before* SDK... */ #if defined(_NTDEF_) || (defined _WINDEF_) || (defined _WINDEF_H) @@ -100,17 +100,8 @@ #else
/* On non-debug builds, we never show these */ - #ifdef _MSC_VER - static __inline void DPRINT1 ( const char* fmt, ... ) - { - } - static __inline void DPRINT ( const char* fmt, ... ) - { - } - #else - #define DPRINT1(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0) - #define DPRINT(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0) - #endif + #define DPRINT1(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0) + #define DPRINT(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0)
#define CHECKPOINT1 #define CHECKPOINT _____
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h --- trunk/reactos/ntoskrnl/include/internal/ke.h 2006-01-10 20:50:21 UTC (rev 20767) +++ trunk/reactos/ntoskrnl/include/internal/ke.h 2006-01-10 21:36:42 UTC (rev 20768) @@ -169,27 +169,6 @@
} \ }
-/* The following macro satisfies multiple objects in a wait state */ -#define KiSatisifyMultipleObjectWaits(FirstBlock) \ -{ \ - PKWAIT_BLOCK WaitBlock = FirstBlock; \ - PKTHREAD WaitThread = WaitBlock->Thread; \ - \ - /* Loop through all the Wait Blocks, and wake each Object */ \ - do \ - { \ - /* Make sure it hasn't timed out */ \ - if (WaitBlock->WaitKey != STATUS_TIMEOUT) \ - { \ - /* Wake the Object */ \ - KiSatisfyObjectWait((PKMUTANT)WaitBlock->Object, WaitThread); \ - } \ - \ - /* Move to the next block */ \ - WaitBlock = WaitBlock->NextWaitBlock; \ - } while (WaitBlock != FirstBlock); \ -} - extern KSPIN_LOCK DispatcherDatabaseLock;
#define KeEnterCriticalRegion() \ @@ -215,6 +194,12 @@ DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \ KeBugCheckWithTf(a,b,c,d,e,f)
+/* Tells us if the Timer or Event is a Syncronization or Notification Object */ +#define TIMER_OR_EVENT_TYPE 0x7L + +/* One of the Reserved Wait Blocks, this one is for the Thread's Timer */ +#define TIMER_WAIT_BLOCK 0x3L + /* INTERNAL KERNEL FUNCTIONS ************************************************/
/* threadsch.c ********************************************************************/ _____
Modified: trunk/reactos/ntoskrnl/ke/kthread.c --- trunk/reactos/ntoskrnl/ke/kthread.c 2006-01-10 20:50:21 UTC (rev 20767) +++ trunk/reactos/ntoskrnl/ke/kthread.c 2006-01-10 21:36:42 UTC (rev 20768) @@ -14,14 +14,8 @@
#define NDEBUG #include <internal/debug.h>
-/* FIXME: NDK */ -#define MAXIMUM_SUSPEND_COUNT 0x7F -#define THREAD_ALERT_INCREMENT 2 - extern EX_WORK_QUEUE ExWorkerQueue[MaximumWorkQueue]; -#define TIMER_WAIT_BLOCK 0x3L
- /* * PURPOSE: List of threads associated with each priority level */ _____
Modified: trunk/reactos/ntoskrnl/ke/wait.c --- trunk/reactos/ntoskrnl/ke/wait.c 2006-01-10 20:50:21 UTC (rev 20767) +++ trunk/reactos/ntoskrnl/ke/wait.c 2006-01-10 21:36:42 UTC (rev 20768) @@ -18,71 +18,70 @@
KSPIN_LOCK DispatcherDatabaseLock;
-/* Tells us if the Timer or Event is a Syncronization or Notification Object */ -#define TIMER_OR_EVENT_TYPE 0x7L +/* PRIVATE FUNCTIONS *********************************************************/
-/* One of the Reserved Wait Blocks, this one is for the Thread's Timer */ -#define TIMER_WAIT_BLOCK 0x3L +/* + * Rules for checking alertability: + * - For Alertable waits ONLY: + * * We don't wait and return STATUS_ALERTED if the thread is alerted + * in EITHER the specified wait mode OR in Kernel Mode. + * - For BOTH Alertable AND Non-Alertable waits: + * * We don't want and return STATUS_USER_APC if the User Mode APC list + * is not empty AND the wait mode is User Mode. + */ +#define KiCheckAlertability() \ + if (Alertable) \ + { \ + if (CurrentThread->Alerted[(int)WaitMode]) \ + { \ + CurrentThread->Alerted[(int)WaitMode] = FALSE; \ + WaitStatus = STATUS_ALERTED; \ + break; \ + } \ + else if ((WaitMode != KernelMode) && \ + (!IsListEmpty(&CurrentThread->ApcState.ApcListHead[UserMode])))\ + { \ + CurrentThread->ApcState.UserApcPending = TRUE; \ + WaitStatus = STATUS_USER_APC; \ + break; \ + } \ + else if (CurrentThread->Alerted[KernelMode]) \ + { \ + CurrentThread->Alerted[KernelMode] = FALSE; \ + WaitStatus = STATUS_ALERTED; \ + break; \ + } \ + } \ + else if ((WaitMode != KernelMode) && \ + (CurrentThread->ApcState.UserApcPending)) \ + { \ + WaitStatus = STATUS_USER_APC; \ + break; \ + } \
-/* FUNCTIONS *****************************************************************/ +/* PUBLIC FUNCTIONS **********************************************************/
-BOOLEAN -__inline +VOID FASTCALL -KiCheckAlertability(BOOLEAN Alertable, - PKTHREAD Thread, - KPROCESSOR_MODE WaitMode, - PNTSTATUS Status) +KiWaitSatisfyAll(PKWAIT_BLOCK FirstBlock) { - /* - * At this point, we have to do a wait, so make sure we can make - * the thread Alertable if requested. - */ - if (Alertable) + PKWAIT_BLOCK WaitBlock = FirstBlock; + PKTHREAD WaitThread = WaitBlock->Thread; + + /* Loop through all the Wait Blocks, and wake each Object */ + do { - /* If the Thread is Alerted, set the Wait Status accordingly */ - if (Thread->Alerted[(int)WaitMode]) + /* Make sure it hasn't timed out */ + if (WaitBlock->WaitKey != STATUS_TIMEOUT) { - Thread->Alerted[(int)WaitMode] = FALSE; - DPRINT("Thread was Alerted in the specified Mode\n"); - *Status = STATUS_ALERTED; - return TRUE; + /* Wake the Object */ + KiSatisfyObjectWait((PKMUTANT)WaitBlock->Object, WaitThread); } - else if ((WaitMode != KernelMode) && - (!IsListEmpty(&Thread->ApcState.ApcListHead[UserMode]))) - { - /* If there are User APCs Pending, then we can't really be alertable */ - DPRINT("APCs are Pending\n"); - Thread->ApcState.UserApcPending = TRUE; - *Status = STATUS_USER_APC; - return TRUE; - } - else if (Thread->Alerted[KernelMode]) - { - /* - * The thread is not alerted in the mode given, but it is alerted - * in kernel-mode. - */ - Thread->Alerted[KernelMode] = FALSE; - DPRINT("Thread was Alerted in Kernel-Mode\n"); - *Status = STATUS_ALERTED; - return TRUE; - } - } - else if ((WaitMode != KernelMode) && - (Thread->ApcState.UserApcPending)) - { - /* - * If there are User APCs Pending and we are waiting in usermode, - * then we must notify the caller - */ - DPRINT("APCs are Pending\n"); - *Status = STATUS_USER_APC; - return TRUE; - }
- /* Stay in the loop */ - return FALSE; + /* Move to the next block */ + WaitBlock = WaitBlock->NextWaitBlock; + } + while (WaitBlock != FirstBlock); }
/* @@ -137,8 +136,8 @@ goto SkipWait; }
- /* Chceck if we can do an alertable wait, if requested */ - if (KiCheckAlertability(Alertable, CurrentThread, WaitMode, &WaitStatus)) break; + /* Check if we can do an alertable wait, if requested */ + KiCheckAlertability();
/* Set status */ CurrentThread->WaitStatus = STATUS_WAIT_0; @@ -311,7 +310,7 @@ WaitBlock->NextWaitBlock = WaitBlock;
/* Make sure we can satisfy the Alertable request */ - if (KiCheckAlertability(Alertable, CurrentThread, WaitMode, &WaitStatus)) break; + KiCheckAlertability();
/* Enable the Timeout Timer if there was any specified */ if (Timeout) @@ -574,13 +573,13 @@ WaitBlock = CurrentThread->WaitBlockList;
/* Satisfy their Waits and return to the caller */ - KiSatisifyMultipleObjectWaits(WaitBlock); + KiWaitSatisfyAll(WaitBlock); WaitStatus = CurrentThread->WaitStatus; goto DontWait; }
/* Make sure we can satisfy the Alertable request */ - if (KiCheckAlertability(Alertable, CurrentThread, WaitMode, &WaitStatus)) break; + KiCheckAlertability();
/* Enable the Timeout Timer if there was any specified */ if (Timeout) @@ -754,7 +753,7 @@ /* All the objects are signaled, we can satisfy */ DPRINT("Satisfiying a Wait All\n"); WaitEntry = WaitEntry->Blink; - KiSatisifyMultipleObjectWaits(CurrentWaitBlock); + KiWaitSatisfyAll(CurrentWaitBlock); }
/* All waits satisfied, unwait the thread */