Author: cgutman
Date: Tue Mar 27 07:23:14 2012
New Revision: 56245
URL:
http://svn.reactos.org/svn/reactos?rev=56245&view=rev
Log:
[ACPI]
- Fix implementations of AcpiOsWaitSemaphore and AcpiOsAcquireMutex to obey the
caller's demands to not block if requested
Modified:
trunk/reactos/drivers/bus/acpi/osl.c
Modified: trunk/reactos/drivers/bus/acpi/osl.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/osl.c?rev…
==============================================================================
--- trunk/reactos/drivers/bus/acpi/osl.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/osl.c [iso-8859-1] Tue Mar 27 07:23:14 2012
@@ -298,8 +298,19 @@
return AE_BAD_PARAMETER;
}
- ExAcquireFastMutex((PFAST_MUTEX)Handle);
-
+ /* Check what the caller wants us to do */
+ if (Timeout == ACPI_DO_NOT_WAIT)
+ {
+ /* Try to acquire without waiting */
+ if (!ExTryToAcquireFastMutex((PFAST_MUTEX)Handle))
+ return AE_TIME;
+ }
+ else
+ {
+ /* Block until we get it */
+ ExAcquireFastMutex((PFAST_MUTEX)Handle);
+ }
+
return AE_OK;
}
@@ -377,8 +388,18 @@
DPRINT1("Bad parameter\n");
return AE_BAD_PARAMETER;
}
-
+
KeAcquireSpinLock(&Sem->Lock, &OldIrql);
+
+ /* Make sure we can wait if we have fewer units than we need */
+ if ((Timeout == ACPI_DO_NOT_WAIT) && (Sem->CurrentUnits < Units))
+ {
+ /* We can't so we must bail now */
+ KeReleaseSpinLock(&Sem->Lock, OldIrql);
+ return AE_TIME;
+ }
+
+ /* Time to block until we get enough units */
while (Sem->CurrentUnits < Units)
{
KeReleaseSpinLock(&Sem->Lock, OldIrql);