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.
This commit is contained in:
Romain Vimont
2024-02-24 22:33:48 +01:00
parent 99574761de
commit 57e18a22df
5 changed files with 19 additions and 12 deletions

View File

@@ -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);