summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2021-04-04 09:39:13 +1000
committerDamien Zammit <damien@zamaudio.com>2021-04-04 09:48:10 +1000
commit215892e0a77f2f83a50030622926d1bc48781d79 (patch)
tree29e39e368540ffa85a75660447be8956540e0fc8
parent53fdd2f6649640ee981be45c727ec0e8e885fb96 (diff)
fixup acpi_initacpica-trywaitsema
-rw-r--r--libacpica/acpi_init.c37
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