From 6297d9fec1653599acdc8bfdc5a52cee89fb1d75 Mon Sep 17 00:00:00 2001 From: ochafik Date: Fri, 4 Oct 2024 18:45:09 +0100 Subject: [PATCH] =?UTF-8?q?`server`:=20avoid=20calling=20sink.is=5Falive()?= =?UTF-8?q?=20after=20it=20died=20=F0=9F=A7=9F=E2=80=8D=E2=99=82=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/server/server.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/examples/server/server.cpp b/examples/server/server.cpp index bee140b21..93c6c43a8 100644 --- a/examples/server/server.cpp +++ b/examples/server/server.cpp @@ -1121,7 +1121,7 @@ struct server_context { } bool process_token(completion_token_output & result, server_slot & slot) { - if (!slot.is_alive()) { + if (slot.is_alive && !slot.is_alive()) { slot.truncated = false; slot.has_next_token = false; @@ -2444,16 +2444,20 @@ static void handle_tasks( { struct State { std::unordered_set task_ids; + bool is_sink_valid = true; }; auto state = std::make_shared(); httplib::ContentProviderResourceReleaser resource_releaser = [state, &ctx_server](bool success) { + state->is_sink_valid = false; if (!success && state) { ctx_server.cancel_tasks(state->task_ids); } }; if (!stream) { res.set_content_provider(MIMETYPE_JSON, [create_tasks, payload, state, &ctx_server](size_t, httplib::DataSink & sink) { - auto is_alive = [&sink]() { return sink.is_alive(); }; + auto is_alive = [state, &sink]() { + return state->is_sink_valid && sink.is_alive(); + }; state->task_ids = create_tasks(is_alive); payload(state->task_ids, sink); ctx_server.queue_results.remove_waiting_task_ids(state->task_ids); @@ -2461,7 +2465,9 @@ static void handle_tasks( }, resource_releaser); } else { res.set_chunked_content_provider(MIMETYPE_EVENT_STREAM, [create_tasks, payload, state, &ctx_server](size_t, httplib::DataSink & sink) { - auto is_alive = [&sink]() { return sink.is_alive(); }; + auto is_alive = [state, &sink]() { + return state->is_sink_valid && sink.is_alive(); + }; state->task_ids = create_tasks(is_alive); payload(state->task_ids, sink); ctx_server.queue_results.remove_waiting_task_ids(state->task_ids);