Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions applications/services/rpc/rpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,12 @@ void rpc_session_set_terminated_callback(
furi_mutex_release(session->callbacks_mutex);
}

void rpc_session_wait_send_done(RpcSession* session) {
furi_check(session);
furi_mutex_acquire(session->callbacks_mutex, FuriWaitForever);
furi_mutex_release(session->callbacks_mutex);
}

/* Doesn't forbid using rpc_feed_bytes() after session close - it's safe.
* Because any bytes received in buffer will be flushed before next session.
* If bytes get into stream buffer before it's get epmtified and this
Expand Down
4 changes: 4 additions & 0 deletions applications/services/rpc/rpc_app.c
Original file line number Diff line number Diff line change
Expand Up @@ -502,5 +502,9 @@ void rpc_system_app_free(void* context) {
furi_delay_tick(1);
}

/* Wait for any in-flight rpc_send (e.g. from rpc_system_app_confirm) to complete
* before freeing rpc_app, so the app thread never uses rpc_app after free. */
RpcSession* session = rpc_app->session;
rpc_session_wait_send_done(session);
free(rpc_app);
}
3 changes: 3 additions & 0 deletions applications/services/rpc/rpc_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ void rpc_send_and_release_empty(RpcSession* session, uint32_t command_id, PB_Com

void rpc_add_handler(RpcSession* session, pb_size_t message_tag, RpcHandler* handler);

/** Wait for any in-flight rpc_send to complete. Used before freeing RpcAppSystem. */
void rpc_session_wait_send_done(RpcSession* session);

void* rpc_system_system_alloc(RpcSession* session);
void* rpc_system_storage_alloc(RpcSession* session);
void rpc_system_storage_free(void* ctx);
Expand Down