Release detached voice and PM file payloads when queued work is cancelled

This commit is contained in:
evgeny committed 2026-10-29 13:35:41 +01:00
1 parent 57bfadb04c
commit 72ee8f2586
2 files changed
+20 -17

No files matched your search

@@ -719,9 +719,15 @@ void utun_bridge_dm_request_messages(const char* conv_id, uint64_t generation) {
bridge_post_request(dm_messages_trampoline, req, &req->inst);
}
static void dm_file_discard(void* arg) {
struct dm_file_req* req = arg;
if (req->remove_source && remove(req->path) && errno != ENOENT)
bridge_log(BLEV_WARN, "DM file cancellation cleanup failed path=%s errno=%d: %s", req->path, errno, strerror(errno));
u_free(req);
}
int utun_bridge_dm_send_file(const char* conv_id, const char* path, const char* name, uint64_t generation, uint64_t request_id) {
struct UASYNC* ua = instance_lite_get_uasync();
if (!conv_id || !path || !name || !generation || !request_id || !uasync_is_running(ua)) {
if (!conv_id || !path || !name || !generation || !request_id || !instance_lite_is_running()) {
bridge_log(BLEV_WARN, "DM file: invalid request/core stopped"); return -1;
}
struct dm_file_req* req = u_calloc(1, sizeof(*req));
@@ -738,10 +744,9 @@ int utun_bridge_dm_send_file(const char* conv_id, const char* path, const char*
req->remove_source = 1; /* PM picker передаёт собственный уникальный cache-файл. */
snprintf(req->info.name, sizeof(req->info.name), "%s", name);
if (attachment_validate(&req->info)) { bridge_log(BLEV_ERROR, "DM file: invalid name"); u_free(req); return -1; }
struct posted_task* post = u_calloc(1, sizeof(*post));
if (!post) { bridge_log(BLEV_ERROR, "DM file: completion allocation failed"); u_free(req); return -1; }
post->callback = dm_send_file_trampoline; post->arg = req;
uasync_post_reserved(ua, post);
if (instance_lite_post(dm_send_file_trampoline, req, &req->inst, dm_file_discard)) {
bridge_log(BLEV_WARN, "DM file: worker rejected request=%llu", (unsigned long long)request_id); u_free(req); return -1;
}
return 0;
}
@@ -1368,9 +1373,8 @@ static void bridge_notify_network_active_trampoline(void* arg) {
}
void utun_bridge_notify_network_active(void) {
struct UASYNC* ua = instance_lite_get_uasync();
if (!ua) return;
uasync_post(ua, bridge_notify_network_active_trampoline, NULL);
if (instance_lite_post(bridge_notify_network_active_trampoline, NULL, NULL, NULL))
bridge_log(BLEV_DEBUG, "Network activity notification rejected: core not ready");
}
void utun_bridge_collect_conn_list(void) {
@@ -207,12 +207,10 @@ int voice_recorder_stop(int* out_duration_ms) {
}
int duration = (int)(now_ms() - g_rec->start_time_ms);
if (out_duration_ms) *out_duration_ms = duration;
struct UASYNC* ua = instance_lite_get_uasync();
struct attachment_send_req* req = u_calloc(1, sizeof(*req));
struct posted_task* post = u_calloc(1, sizeof(*post));
if (!uasync_is_running(ua) || !req || !post || duration < 500) {
DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "voice stop: discarded duration=%d core=%d allocated=%d", duration, uasync_is_running(ua), !!req && !!post);
u_free(req); u_free(post); voice_cleanup_locked(g_rec);
if (!instance_lite_is_running() || !req || duration < 500) {
DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "voice stop: discarded duration=%d core=%d allocated=%d", duration, instance_lite_is_running(), !!req);
u_free(req); voice_cleanup_locked(g_rec);
pthread_mutex_unlock(&g_rec->mtx); pthread_mutex_unlock(&g_init_mtx);
return duration < 500 ? 0 : -1;
}
@@ -226,7 +224,7 @@ int voice_recorder_stop(int* out_duration_ms) {
struct audio_compressor* replacement = audio_compressor_clone_config(g_rec->compressor);
if (!replacement) {
DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "voice stop: replacement compressor allocation failed");
u_free(req); u_free(post); voice_cleanup_locked(g_rec);
u_free(req); voice_cleanup_locked(g_rec);
pthread_mutex_unlock(&g_rec->mtx); pthread_mutex_unlock(&g_init_mtx); return -1;
}
req->compressor = g_rec->compressor; g_rec->compressor = replacement;
@@ -237,8 +235,9 @@ int voice_recorder_stop(int* out_duration_ms) {
voice_cleanup_locked(g_rec);
pthread_mutex_unlock(&g_rec->mtx); pthread_mutex_unlock(&g_init_mtx);
DEBUG_INFO(DEBUG_CATEGORY_MEDIA, "voice stop: detached target=%s pm=%d duration=%d", req->target, req->is_dm, duration);
post->callback = attachment_send_trampoline; post->arg = req;
uasync_post_reserved(ua, post);
if (instance_lite_post(attachment_send_trampoline, req, &req->inst, attachment_send_discard)) {
DEBUG_WARN(DEBUG_CATEGORY_MEDIA, "voice stop: worker rejected detached recording"); attachment_send_discard(req); return -1;
}
return 0;
}