Wait server from a separate thread
Create a thread just to wait for the server process exit. This paves the way to simply wake up a blocking accept() in a portable way.
This commit is contained in:
parent
64d5edce92
commit
d421741a83
2 changed files with 24 additions and 3 deletions
|
@ -5,6 +5,7 @@
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <SDL2/SDL_thread.h>
|
||||||
#include <SDL2/SDL_timer.h>
|
#include <SDL2/SDL_timer.h>
|
||||||
#include <SDL2/SDL_platform.h>
|
#include <SDL2/SDL_platform.h>
|
||||||
|
|
||||||
|
@ -332,6 +333,14 @@ server_init(struct server *server) {
|
||||||
*server = (struct server) SERVER_INITIALIZER;
|
*server = (struct server) SERVER_INITIALIZER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
run_wait_server(void *data) {
|
||||||
|
struct server *server = data;
|
||||||
|
cmd_simple_wait(server->process, NULL); // ignore exit code
|
||||||
|
LOGD("Server terminated");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
server_start(struct server *server, const char *serial,
|
server_start(struct server *server, const char *serial,
|
||||||
const struct server_params *params) {
|
const struct server_params *params) {
|
||||||
|
@ -358,6 +367,16 @@ server_start(struct server *server, const char *serial,
|
||||||
goto error2;
|
goto error2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server->wait_server_thread =
|
||||||
|
SDL_CreateThread(run_wait_server, "wait-server", server);
|
||||||
|
if (!server->wait_server_thread) {
|
||||||
|
if (!cmd_terminate(server->process)) {
|
||||||
|
LOGW("Could not terminate server");
|
||||||
|
}
|
||||||
|
cmd_simple_wait(server->process, NULL); // ignore exit code
|
||||||
|
goto error2;
|
||||||
|
}
|
||||||
|
|
||||||
server->tunnel_enabled = true;
|
server->tunnel_enabled = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -430,13 +449,12 @@ server_stop(struct server *server) {
|
||||||
LOGW("Could not terminate server");
|
LOGW("Could not terminate server");
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_simple_wait(server->process, NULL); // ignore exit code
|
|
||||||
LOGD("Server terminated");
|
|
||||||
|
|
||||||
if (server->tunnel_enabled) {
|
if (server->tunnel_enabled) {
|
||||||
// ignore failure
|
// ignore failure
|
||||||
disable_tunnel(server);
|
disable_tunnel(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_WaitThread(server->wait_server_thread, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <SDL2/SDL_thread.h>
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
@ -12,6 +13,7 @@
|
||||||
struct server {
|
struct server {
|
||||||
char *serial;
|
char *serial;
|
||||||
process_t process;
|
process_t process;
|
||||||
|
SDL_Thread *wait_server_thread;
|
||||||
socket_t server_socket; // only used if !tunnel_forward
|
socket_t server_socket; // only used if !tunnel_forward
|
||||||
socket_t video_socket;
|
socket_t video_socket;
|
||||||
socket_t control_socket;
|
socket_t control_socket;
|
||||||
|
@ -24,6 +26,7 @@ struct server {
|
||||||
#define SERVER_INITIALIZER { \
|
#define SERVER_INITIALIZER { \
|
||||||
.serial = NULL, \
|
.serial = NULL, \
|
||||||
.process = PROCESS_NONE, \
|
.process = PROCESS_NONE, \
|
||||||
|
.wait_server_thread = NULL, \
|
||||||
.server_socket = INVALID_SOCKET, \
|
.server_socket = INVALID_SOCKET, \
|
||||||
.video_socket = INVALID_SOCKET, \
|
.video_socket = INVALID_SOCKET, \
|
||||||
.control_socket = INVALID_SOCKET, \
|
.control_socket = INVALID_SOCKET, \
|
||||||
|
|
Loading…
Reference in a new issue