From ba5509bc723a188197977dc3ec8ae111b618cfb7 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 27 Mar 2012 07:23:14 +0000 Subject: [PATCH] [ACPI] - Fix implementations of AcpiOsWaitSemaphore and AcpiOsAcquireMutex to obey the caller's demands to not block if requested svn path=/trunk/; revision=56245 --- reactos/drivers/bus/acpi/osl.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/bus/acpi/osl.c b/reactos/drivers/bus/acpi/osl.c index 5b32de76200..9b1ea6fdfb5 100644 --- a/reactos/drivers/bus/acpi/osl.c +++ b/reactos/drivers/bus/acpi/osl.c @@ -298,8 +298,19 @@ AcpiOsAcquireMutex( 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 @@ AcpiOsWaitSemaphore( 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);