Report cancelled composer submissions before releasing their owned requests

This commit is contained in:
evgeny committed 2026-10-28 00:58:59 +01:00
1 parent 3c5e52a630
commit 4d18a7015d
2 files changed
+15 -2

No files matched your search

+4 -1
View File
@@ -105,7 +105,10 @@ int gui_bridge_post_setting(enum gui_setting_target target, const char* key, con
* Владение и результат — как у post_setting; строка/форма вызывающего после возврата больше не нужны. */
int gui_bridge_update_name(const char* name);
/* Composer-запрос: 0 — владение req передано, callback/отмена освободят блок; -1 — req остаётся вызывающему. */
/* Composer-запрос: 0 — владение req передано, callback/отмена освободят блок; -1 — req остаётся вызывающему.
* inst привязывается к опубликованному ядру под mutex; data должен жить вместе с req (обычно в том же u_malloc-блоке).
* Ненулевой request_id получает MSG_SUBMITTED после сохранения либо отказ при отмене до исполнения.
* При -1 результата нет: вызывающий освобождает req и сам сообщает об отказе своему composer. */
struct chat_msg_submit;
int gui_bridge_submit_message(struct chat_msg_submit* req);
+11 -1
View File
@@ -806,13 +806,23 @@ int gui_bridge_update_name(const char* name) {
return 0;
}
/* Отмена выполняется в uasync, но не вызывает обработчик ядра под bridge_mutex; результат копируется в Qt-очередь. */
static void cancel_message_submit(void* arg) {
auto* request = static_cast<chat_msg_submit*>(arg);
DEBUG_WARN(DEBUG_CATEGORY_CHAT_SYNC, "composer submission cancelled: request=%llu", (unsigned long long)request->request_id);
if (!request->request_id) return;
uint8_t result[9] = {0};
for (unsigned i = 0; i < 8; ++i) result[i] = (uint8_t)(request->request_id >> (8 * i));
gui_bridge_post(CHAT_EVT_MSG_SUBMITTED, result, sizeof(result));
}
int gui_bridge_submit_message(struct chat_msg_submit* req) {
std::lock_guard<std::mutex> guard(bridge_mutex);
if (!req || !g_inst || !g_ua || !uasync_is_running(g_ua)) {
DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "composer submission: core unavailable"); return -1;
}
req->inst = g_inst;
return post_command(chat_core_submit_trampoline, req, true);
return post_command(chat_core_submit_trampoline, req, true, cancel_message_submit);
}
int gui_bridge_is_uasync_ready(void) {