diff options
author | Damien Zammit <damien@zamaudio.com> | 2021-04-04 09:39:13 +1000 |
---|---|---|
committer | Damien Zammit <damien@zamaudio.com> | 2021-04-04 09:48:10 +1000 |
commit | 215892e0a77f2f83a50030622926d1bc48781d79 (patch) | |
tree | 29e39e368540ffa85a75660447be8956540e0fc8 | |
parent | 53fdd2f6649640ee981be45c727ec0e8e885fb96 (diff) |
fixup acpi_initacpica-trywaitsema
-rw-r--r-- | libacpica/acpi_init.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/libacpica/acpi_init.c b/libacpica/acpi_init.c index f5ab987b..6a965790 100644 --- a/libacpica/acpi_init.c +++ b/libacpica/acpi_init.c @@ -21,6 +21,7 @@ #include <unistd.h> #include <stdarg.h> #include <semaphore.h> +#include <mach.h> #define ACPI_MAX_TABLES 128 @@ -121,20 +122,40 @@ acpi_os_delete_semaphore(acpi_semaphore handle) } acpi_status -acpi_os_wait_semaphore(acpi_semaphore handle, u32 units, u16 timeout) +acpi_os_wait_semaphore(acpi_semaphore handle, u32 units, u16 ms) { - int i; + int ret; + struct timespec time; - if (!timeout) - timeout = 1; + if (clock_gettime (CLOCK_REALTIME, &time)) { + return AE_TIME; + } + + if (!ms) { + ms = 10; + } + + time.tv_sec += ms / 1000; + time.tv_nsec += (ms % 1000) * 1000000; + + if (time.tv_nsec >= 1000000) { + time.tv_sec += time.tv_nsec / 1000000; + time.tv_nsec = time.tv_nsec % 1000000; + } + + /* wait for semaphore, and continue waiting if interrupted */ + while (((ret = sem_timedwait (handle, &time)) == -1) && errno == EINTR) { + continue; + } - for (i = 0; i < timeout; i++) { - if (!sem_trywait(handle)) { - return AE_OK; + if (ret) { + if (errno != ETIMEDOUT) { + mach_print("ACPI: sem_timedwait ?\n"); } + return AE_TIME; } - return AE_ERROR; + return AE_OK; } acpi_status |