ACPICA: Unix application OSL: Correctly handle control-c (EINTR)
authorBob Moore <robert.moore@intel.com>
Mon, 5 Jun 2017 08:42:07 +0000 (16:42 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 27 Jun 2017 20:25:26 +0000 (22:25 +0200)
ACPICA commit dfbb87c3a96cfd007375f34a96e6f4a8ee477f97

Handle EINTR from a sem_wait operation. Ignore a control-c.

Link: https://github.com/acpica/acpica/commit/dfbb87c3
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
tools/power/acpi/os_specific/service_layers/osunixxf.c

index c04e8fea2c6021a1bf5d12713024911f9529d7fb..025c1b07049d51029bcf87d4bd611be4b53e8694 100644 (file)
@@ -750,9 +750,9 @@ acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 msec_timeout)
 {
        acpi_status status = AE_OK;
        sem_t *sem = (sem_t *) handle;
+       int ret_val;
 #ifndef ACPI_USE_ALTERNATE_TIMEOUT
        struct timespec time;
-       int ret_val;
 #endif
 
        if (!sem) {
@@ -778,7 +778,10 @@ acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 msec_timeout)
 
        case ACPI_WAIT_FOREVER:
 
-               if (sem_wait(sem)) {
+               while (((ret_val = sem_wait(sem)) == -1) && (errno == EINTR)) {
+                       continue;       /* Restart if interrupted */
+               }
+               if (ret_val != 0) {
                        status = (AE_TIME);
                }
                break;
@@ -831,7 +834,8 @@ acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 msec_timeout)
 
                while (((ret_val = sem_timedwait(sem, &time)) == -1)
                       && (errno == EINTR)) {
-                       continue;
+                       continue;       /* Restart if interrupted */
+
                }
 
                if (ret_val != 0) {