From 4d2c2514fc466fc1dd8cfb972c2697a843e28d70 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sat, 24 Feb 2024 22:33:48 +0100 Subject: [PATCH] Initialize controller in two steps There is a dependency cycle in the initialization order: - keyboard depends on controller - controller depends on acksync - acksync depends on keyboard initialization To break this cycle, bind the async instance to the controller in a second step. PR #4473 --- app/src/controller.c | 11 ++++++++--- app/src/controller.h | 7 +++++-- app/src/receiver.c | 5 ++--- app/src/receiver.h | 3 +-- app/src/scrcpy.c | 5 +++-- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/app/src/controller.c b/app/src/controller.c index 250321fe..5a5bfde9 100644 --- a/app/src/controller.c +++ b/app/src/controller.c @@ -7,8 +7,7 @@ #define SC_CONTROL_MSG_QUEUE_MAX 64 bool -sc_controller_init(struct sc_controller *controller, sc_socket control_socket, - struct sc_acksync *acksync) { +sc_controller_init(struct sc_controller *controller, sc_socket control_socket) { sc_vecdeque_init(&controller->queue); bool ok = sc_vecdeque_reserve(&controller->queue, SC_CONTROL_MSG_QUEUE_MAX); @@ -16,7 +15,7 @@ sc_controller_init(struct sc_controller *controller, sc_socket control_socket, return false; } - ok = sc_receiver_init(&controller->receiver, control_socket, acksync); + ok = sc_receiver_init(&controller->receiver, control_socket); if (!ok) { sc_vecdeque_destroy(&controller->queue); return false; @@ -43,6 +42,12 @@ sc_controller_init(struct sc_controller *controller, sc_socket control_socket, return true; } +void +sc_controller_set_acksync(struct sc_controller *controller, + struct sc_acksync *acksync) { + controller->receiver.acksync = acksync; +} + void sc_controller_destroy(struct sc_controller *controller) { sc_cond_destroy(&controller->msg_cond); diff --git a/app/src/controller.h b/app/src/controller.h index a044b2bf..767e1731 100644 --- a/app/src/controller.h +++ b/app/src/controller.h @@ -25,8 +25,11 @@ struct sc_controller { }; bool -sc_controller_init(struct sc_controller *controller, sc_socket control_socket, - struct sc_acksync *acksync); +sc_controller_init(struct sc_controller *controller, sc_socket control_socket); + +void +sc_controller_set_acksync(struct sc_controller *controller, + struct sc_acksync *acksync); void sc_controller_destroy(struct sc_controller *controller); diff --git a/app/src/receiver.c b/app/src/receiver.c index 6be705e3..97299b3f 100644 --- a/app/src/receiver.c +++ b/app/src/receiver.c @@ -8,15 +8,14 @@ #include "util/log.h" bool -sc_receiver_init(struct sc_receiver *receiver, sc_socket control_socket, - struct sc_acksync *acksync) { +sc_receiver_init(struct sc_receiver *receiver, sc_socket control_socket) { bool ok = sc_mutex_init(&receiver->mutex); if (!ok) { return false; } receiver->control_socket = control_socket; - receiver->acksync = acksync; + receiver->acksync = NULL; return true; } diff --git a/app/src/receiver.h b/app/src/receiver.h index eb959fb8..43f89615 100644 --- a/app/src/receiver.h +++ b/app/src/receiver.h @@ -20,8 +20,7 @@ struct sc_receiver { }; bool -sc_receiver_init(struct sc_receiver *receiver, sc_socket control_socket, - struct sc_acksync *acksync); +sc_receiver_init(struct sc_receiver *receiver, sc_socket control_socket); void sc_receiver_destroy(struct sc_receiver *receiver); diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index 876b400a..7ecda6d0 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -663,12 +663,13 @@ aoa_hid_end: mp = &s->mouse_sdk.mouse_processor; } - if (!sc_controller_init(&s->controller, s->server.control_socket, - acksync)) { + if (!sc_controller_init(&s->controller, s->server.control_socket)) { goto end; } controller_initialized = true; + sc_controller_set_acksync(&s->controller, acksync); + if (!sc_controller_start(&s->controller)) { goto end; }