diff options
author | Bob Moore <robert.moore@intel.com> | 2017-06-05 16:42:07 +0800 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2017-06-27 22:25:26 +0200 |
commit | fdf8707bd56f0e29024f79fa42598b4c4e124f33 (patch) | |
tree | 4775878039373a5e89f763cd5ee9589264c26c2b /tools/power/acpi/os_specific | |
parent | b9ef2ab058620b6fc98df931bc6e03b21c9b373d (diff) | |
download | linux-fdf8707bd56f0e29024f79fa42598b4c4e124f33.tar.bz2 |
ACPICA: Unix application OSL: Correctly handle control-c (EINTR)
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>
Diffstat (limited to 'tools/power/acpi/os_specific')
-rw-r--r-- | tools/power/acpi/os_specific/service_layers/osunixxf.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/tools/power/acpi/os_specific/service_layers/osunixxf.c b/tools/power/acpi/os_specific/service_layers/osunixxf.c index c04e8fea2c60..025c1b07049d 100644 --- a/tools/power/acpi/os_specific/service_layers/osunixxf.c +++ b/tools/power/acpi/os_specific/service_layers/osunixxf.c @@ -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) { |