Report cancelled composer submissions before releasing their owned requests
This commit is contained in:
1 parent
3c5e52a630
commit
4d18a7015d
2 files changed
+15
-2
No files matched your search
@@ -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);
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user