Do not release TCP sockets while still in use

SDLNet_TCP_Close() not only closes, but also release the resources.

Therefore, we must not close the socket if another thread attempts to
read it.

For that purpose, move socket closing from server_stop() to
server_destroy().
This commit is contained in:
Romain Vimont 2018-02-09 12:59:36 +01:00
parent d658586d0d
commit 4662198261
3 changed files with 22 additions and 12 deletions

View file

@ -99,13 +99,16 @@ SDL_bool scrcpy(const char *serial, Uint16 local_port, Uint16 max_size, Uint32 b
return SDL_FALSE;
}
SDL_bool ret = SDL_TRUE;
// to reduce startup time, we could be tempted to init other stuff before blocking here
// but we should not block after SDL_Init since it handles the signals (Ctrl+C) in its
// event loop: blocking could lead to deadlock
TCPsocket device_socket = server_connect_to(&server, serial);
if (!device_socket) {
server_stop(&server, serial);
return SDL_FALSE;
ret = SDL_FALSE;
goto finally_destroy_server;
}
char device_name[DEVICE_NAME_FIELD_LENGTH];
@ -116,16 +119,16 @@ SDL_bool scrcpy(const char *serial, Uint16 local_port, Uint16 max_size, Uint32 b
// to init the window immediately
if (!device_read_info(device_socket, device_name, &frame_size)) {
server_stop(&server, serial);
return SDL_FALSE;
ret = SDL_FALSE;
goto finally_destroy_server;
}
if (!frames_init(&frames)) {
server_stop(&server, serial);
return SDL_FALSE;
ret = SDL_FALSE;
goto finally_destroy_server;
}
SDL_bool ret = SDL_TRUE;
decoder.frames = &frames;
decoder.video_socket = device_socket;
@ -173,6 +176,8 @@ finally_stop_decoder:
decoder_join(&decoder);
finally_destroy_frames:
frames_destroy(&frames);
finally_destroy_server:
server_destroy(&server);
return ret;
}

View file

@ -115,13 +115,6 @@ TCPsocket server_connect_to(struct server *server, const char *serial) {
void server_stop(struct server *server, const char *serial) {
SDL_assert(server->process != PROCESS_NONE);
if (server->server_socket) {
SDLNet_TCP_Close(server->server_socket);
}
if (server->device_socket) {
SDLNet_TCP_Close(server->device_socket);
}
terminate_server(server->process);
if (server->adb_reverse_enabled) {
@ -129,3 +122,12 @@ void server_stop(struct server *server, const char *serial) {
disable_tunnel(serial);
}
}
void server_destroy(struct server *server) {
if (server->server_socket) {
SDLNet_TCP_Close(server->server_socket);
}
if (server->device_socket) {
SDLNet_TCP_Close(server->device_socket);
}
}

View file

@ -31,4 +31,7 @@ TCPsocket server_connect_to(struct server *server, const char *serial);
// disconnect and kill the server process
void server_stop(struct server *server, const char *serial);
// close and release sockets
void server_destroy(struct server *server);
#endif