3bb24b3926
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 <https://github.com/Genymobile/scrcpy/pull/3011>
35 lines
784 B
C
35 lines
784 B
C
#include "process_intr.h"
|
|
|
|
ssize_t
|
|
sc_pipe_read_intr(struct sc_intr *intr, sc_pid pid, sc_pipe pipe, char *data,
|
|
size_t len) {
|
|
if (intr && !sc_intr_set_process(intr, pid)) {
|
|
// Already interrupted
|
|
return false;
|
|
}
|
|
|
|
ssize_t ret = sc_pipe_read(pipe, data, len);
|
|
|
|
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 (intr && !sc_intr_set_process(intr, pid)) {
|
|
// Already interrupted
|
|
return false;
|
|
}
|
|
|
|
ssize_t ret = sc_pipe_read_all(pipe, data, len);
|
|
|
|
if (intr) {
|
|
sc_intr_set_process(intr, SC_PROCESS_NONE);
|
|
}
|
|
|
|
return ret;
|
|
}
|