mirror of https://github.com/Genymobile/scrcpy
Add interruptor utilities
Expose wrapper functions for interrupting blocking calls, for process and sockets.pull/2668/head
parent
e0896142db
commit
40340509d9
@ -0,0 +1,97 @@
|
||||
#include "net_intr.h"
|
||||
|
||||
bool
|
||||
net_connect_intr(struct sc_intr *intr, sc_socket socket, uint32_t addr,
|
||||
uint16_t port) {
|
||||
if (!sc_intr_set_socket(intr, socket)) {
|
||||
// Already interrupted
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = net_connect(socket, addr, port);
|
||||
|
||||
sc_intr_set_socket(intr, SC_INVALID_SOCKET);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool
|
||||
net_listen_intr(struct sc_intr *intr, sc_socket socket, uint32_t addr,
|
||||
uint16_t port, int backlog) {
|
||||
if (!sc_intr_set_socket(intr, socket)) {
|
||||
// Already interrupted
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ret = net_listen(socket, addr, port, backlog);
|
||||
|
||||
sc_intr_set_socket(intr, SC_INVALID_SOCKET);
|
||||
return ret;
|
||||
}
|
||||
|
||||
sc_socket
|
||||
net_accept_intr(struct sc_intr *intr, sc_socket server_socket) {
|
||||
if (!sc_intr_set_socket(intr, server_socket)) {
|
||||
// Already interrupted
|
||||
return SC_INVALID_SOCKET;
|
||||
}
|
||||
|
||||
sc_socket socket = net_accept(server_socket);
|
||||
|
||||
sc_intr_set_socket(intr, SC_INVALID_SOCKET);
|
||||
return socket;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
net_recv_intr(struct sc_intr *intr, sc_socket socket, void *buf, size_t len) {
|
||||
if (!sc_intr_set_socket(intr, socket)) {
|
||||
// Already interrupted
|
||||
return -1;
|
||||
}
|
||||
|
||||
ssize_t r = net_recv(socket, buf, len);
|
||||
|
||||
sc_intr_set_socket(intr, SC_INVALID_SOCKET);
|
||||
return r;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
net_recv_all_intr(struct sc_intr *intr, sc_socket socket, void *buf,
|
||||
size_t len) {
|
||||
if (!sc_intr_set_socket(intr, socket)) {
|
||||
// Already interrupted
|
||||
return -1;
|
||||
}
|
||||
|
||||
ssize_t r = net_recv_all(socket, buf, len);
|
||||
|
||||
sc_intr_set_socket(intr, SC_INVALID_SOCKET);
|
||||
return r;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
net_send_intr(struct sc_intr *intr, sc_socket socket, const void *buf,
|
||||
size_t len) {
|
||||
if (!sc_intr_set_socket(intr, socket)) {
|
||||
// Already interrupted
|
||||
return -1;
|
||||
}
|
||||
|
||||
ssize_t w = net_send(socket, buf, len);
|
||||
|
||||
sc_intr_set_socket(intr, SC_INVALID_SOCKET);
|
||||
return w;
|
||||
}
|
||||
|
||||
ssize_t
|
||||
net_send_all_intr(struct sc_intr *intr, sc_socket socket, const void *buf,
|
||||
size_t len) {
|
||||
if (!sc_intr_set_socket(intr, socket)) {
|
||||
// Already interrupted
|
||||
return -1;
|
||||
}
|
||||
|
||||
ssize_t w = net_send_all(socket, buf, len);
|
||||
|
||||
sc_intr_set_socket(intr, SC_INVALID_SOCKET);
|
||||
return w;
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
#ifndef SC_NET_INTR_H
|
||||
#define SC_NET_INTR_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include "intr.h"
|
||||
#include "net.h"
|
||||
|
||||
bool
|
||||
net_connect_intr(struct sc_intr *intr, sc_socket socket, uint32_t addr,
|
||||
uint16_t port);
|
||||
|
||||
bool
|
||||
net_listen_intr(struct sc_intr *intr, sc_socket socket, uint32_t addr,
|
||||
uint16_t port, int backlog);
|
||||
|
||||
sc_socket
|
||||
net_accept_intr(struct sc_intr *intr, sc_socket server_socket);
|
||||
|
||||
ssize_t
|
||||
net_recv_intr(struct sc_intr *intr, sc_socket socket, void *buf, size_t len);
|
||||
|
||||
ssize_t
|
||||
net_recv_all_intr(struct sc_intr *intr, sc_socket socket, void *buf,
|
||||
size_t len);
|
||||
|
||||
ssize_t
|
||||
net_send_intr(struct sc_intr *intr, sc_socket socket, const void *buf,
|
||||
size_t len);
|
||||
|
||||
ssize_t
|
||||
net_send_all_intr(struct sc_intr *intr, sc_socket socket, const void *buf,
|
||||
size_t len);
|
||||
|
||||
#endif
|
@ -0,0 +1,16 @@
|
||||
#include "process_intr.h"
|
||||
|
||||
bool
|
||||
sc_process_check_success_intr(struct sc_intr *intr, sc_pid pid,
|
||||
const char *name) {
|
||||
if (!sc_intr_set_process(intr, pid)) {
|
||||
// Already interrupted
|
||||
return false;
|
||||
}
|
||||
|
||||
// Always pass close=false, interrupting would be racy otherwise
|
||||
bool ret = sc_process_check_success(pid, name, false);
|
||||
|
||||
sc_intr_set_process(intr, SC_PROCESS_NONE);
|
||||
return ret;
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
#ifndef SC_PROCESS_INTR_H
|
||||
#define SC_PROCESS_INTR_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#include "intr.h"
|
||||
#include "process.h"
|
||||
|
||||
bool
|
||||
sc_process_check_success_intr(struct sc_intr *intr, sc_pid pid,
|
||||
const char *name);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue