summaryrefslogtreecommitdiffstats
path: root/tools/power
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2017-06-05 10:42:07 +0200
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-06-27 22:25:26 +0200
commitfdf8707bd56f0e29024f79fa42598b4c4e124f33 (patch)
tree4775878039373a5e89f763cd5ee9589264c26c2b /tools/power
parentACPICA: Improvements for debug output only (diff)
downloadlinux-fdf8707bd56f0e29024f79fa42598b4c4e124f33.tar.xz
linux-fdf8707bd56f0e29024f79fa42598b4c4e124f33.zip
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')
-rw-r--r--tools/power/acpi/os_specific/service_layers/osunixxf.c10
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) {