@@ -531,26 +531,38 @@ struct server_response {
531
531
532
532
// add the id_task to the list of tasks waiting for response
533
533
void add_waiting_task_id (int id_task) {
534
- SRV_DBG (" waiting for task id = %d\n " , id_task);
534
+ SRV_DBG (" add task %d to waiting list. current waiting = %d (before add) \n " , id_task, ( int ) waiting_task_ids. size () );
535
535
536
536
std::unique_lock<std::mutex> lock (mutex_results);
537
537
waiting_task_ids.insert (id_task);
538
538
}
539
539
540
540
void add_waiting_tasks (const std::vector<server_task> & tasks) {
541
- for (const auto & t : tasks) {
542
- add_waiting_task_id (t.id );
541
+ std::unique_lock<std::mutex> lock (mutex_results);
542
+
543
+ for (const auto & task : tasks) {
544
+ SRV_DBG (" add task %d to waiting list. current waiting = %d (before add)\n " , task.id , (int ) waiting_task_ids.size ());
545
+ waiting_task_ids.insert (task.id );
543
546
}
544
547
}
545
548
546
549
// when the request is finished, we can remove task associated with it
547
550
void remove_waiting_task_id (int id_task) {
548
- SRV_DBG (" task id = %d is done \n " , id_task);
551
+ SRV_DBG (" remove task %d from waiting list. current waiting = %d (before remove) \n " , id_task, ( int ) waiting_task_ids. size () );
549
552
550
553
std::unique_lock<std::mutex> lock (mutex_results);
551
554
waiting_task_ids.erase (id_task);
552
555
}
553
556
557
+ void remove_waiting_task_ids (const std::unordered_set<int > & id_tasks) {
558
+ std::unique_lock<std::mutex> lock (mutex_results);
559
+
560
+ for (const auto & id_task : id_tasks) {
561
+ SRV_DBG (" remove task %d from waiting list. current waiting = %d (before remove)\n " , id_task, (int ) waiting_task_ids.size ());
562
+ waiting_task_ids.erase (id_task);
563
+ }
564
+ }
565
+
554
566
// This function blocks the thread until there is a response for one of the id_tasks
555
567
server_task_result recv (const std::unordered_set<int > & id_tasks) {
556
568
while (true ) {
@@ -2774,6 +2786,8 @@ int main(int argc, char ** argv) {
2774
2786
}, [&](const json & error_data) {
2775
2787
res_error (res, error_data);
2776
2788
});
2789
+
2790
+ ctx_server.queue_results .remove_waiting_task_ids (task_ids);
2777
2791
} else {
2778
2792
const auto chunked_content_provider = [task_ids, &ctx_server](size_t , httplib::DataSink & sink) {
2779
2793
ctx_server.receive_cmpl_results_stream (task_ids, [&](const server_task_result & result) -> bool {
@@ -2784,7 +2798,12 @@ int main(int argc, char ** argv) {
2784
2798
sink.done ();
2785
2799
return false ;
2786
2800
};
2787
- res.set_chunked_content_provider (" text/event-stream" , chunked_content_provider);
2801
+
2802
+ auto on_complete = [task_ids, &ctx_server] (bool ) {
2803
+ ctx_server.queue_results .remove_waiting_task_ids (task_ids);
2804
+ };
2805
+
2806
+ res.set_chunked_content_provider (" text/event-stream" , chunked_content_provider, on_complete);
2788
2807
}
2789
2808
};
2790
2809
@@ -2823,6 +2842,8 @@ int main(int argc, char ** argv) {
2823
2842
}, [&](const json & error_data) {
2824
2843
res_error (res, error_data);
2825
2844
});
2845
+
2846
+ ctx_server.queue_results .remove_waiting_task_ids (task_ids);
2826
2847
} else {
2827
2848
const auto chunked_content_provider = [task_ids, &ctx_server, completion_id](size_t , httplib::DataSink & sink) {
2828
2849
ctx_server.receive_cmpl_results_stream (task_ids, [&](const server_task_result & result) -> bool {
@@ -2844,7 +2865,12 @@ int main(int argc, char ** argv) {
2844
2865
sink.done ();
2845
2866
return true ;
2846
2867
};
2847
- res.set_chunked_content_provider (" text/event-stream" , chunked_content_provider);
2868
+
2869
+ auto on_complete = [task_ids, &ctx_server] (bool ) {
2870
+ ctx_server.queue_results .remove_waiting_task_ids (task_ids);
2871
+ };
2872
+
2873
+ res.set_chunked_content_provider (" text/event-stream" , chunked_content_provider, on_complete);
2848
2874
}
2849
2875
};
2850
2876
@@ -2953,6 +2979,8 @@ int main(int argc, char ** argv) {
2953
2979
res_error (res, error_data);
2954
2980
error = true ;
2955
2981
});
2982
+
2983
+ ctx_server.queue_results .remove_waiting_task_ids (task_ids);
2956
2984
}
2957
2985
2958
2986
if (error) {
0 commit comments