From 3bb24b3926a2db0fa38393c829b4e703471c0fcc Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Thu, 10 Feb 2022 08:05:54 +0100 Subject: [PATCH] Make intr optional for adb commands All adb commands are executed with an "interruptor", so that they can be interrupted on Ctrl+C. Make this interruptor optional, so that we could call "adb kill-server" in OTG mode. This command always returns almost immediately anyway. Ideally, we should make all blocking calls interruptible (including libusb calls, by using the asynchronous API), but it's a lot of work, and in practice it works well enough. PR #3011 --- app/src/adb/adb.c | 6 ++++-- app/src/util/process_intr.c | 14 ++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/adb/adb.c b/app/src/adb/adb.c index 8ce9cc6f..8742c4d0 100644 --- a/app/src/adb/adb.c +++ b/app/src/adb/adb.c @@ -150,7 +150,7 @@ process_check_success_internal(sc_pid pid, const char *name, bool close, static bool process_check_success_intr(struct sc_intr *intr, sc_pid pid, const char *name, unsigned flags) { - if (!sc_intr_set_process(intr, pid)) { + if (intr && !sc_intr_set_process(intr, pid)) { // Already interrupted return false; } @@ -158,7 +158,9 @@ process_check_success_intr(struct sc_intr *intr, sc_pid pid, const char *name, // Always pass close=false, interrupting would be racy otherwise bool ret = process_check_success_internal(pid, name, false, flags); - sc_intr_set_process(intr, SC_PROCESS_NONE); + if (intr) { + sc_intr_set_process(intr, SC_PROCESS_NONE); + } // Close separately sc_process_close(pid); diff --git a/app/src/util/process_intr.c b/app/src/util/process_intr.c index 940fe89f..d37bd5a5 100644 --- a/app/src/util/process_intr.c +++ b/app/src/util/process_intr.c @@ -3,27 +3,33 @@ ssize_t sc_pipe_read_intr(struct sc_intr *intr, sc_pid pid, sc_pipe pipe, char *data, size_t len) { - if (!sc_intr_set_process(intr, pid)) { + if (intr && !sc_intr_set_process(intr, pid)) { // Already interrupted return false; } ssize_t ret = sc_pipe_read(pipe, data, len); - sc_intr_set_process(intr, SC_PROCESS_NONE); + if (intr) { + sc_intr_set_process(intr, SC_PROCESS_NONE); + } + return ret; } ssize_t sc_pipe_read_all_intr(struct sc_intr *intr, sc_pid pid, sc_pipe pipe, char *data, size_t len) { - if (!sc_intr_set_process(intr, pid)) { + if (intr && !sc_intr_set_process(intr, pid)) { // Already interrupted return false; } ssize_t ret = sc_pipe_read_all(pipe, data, len); - sc_intr_set_process(intr, SC_PROCESS_NONE); + if (intr) { + sc_intr_set_process(intr, SC_PROCESS_NONE); + } + return ret; }