@@ -62,16 +62,14 @@ ResponseSender::ResponseSender(
6262 response_factory_address_ (response_factory_address),
6363 is_decoupled_(is_decoupled),
6464 requested_output_names_(requested_output_names), shm_pool_(shm_pool),
65- pb_cancel_(pb_cancel), closed_(false ), number_of_response_sent_(0 )
65+ pb_cancel_(pb_cancel), closed_(false ), number_of_response_sent_(0 ),
66+ response_factory_deleted_(false )
6667{
6768}
6869
6970ResponseSender::~ResponseSender ()
7071{
71- std::unique_ptr<Stub>& stub = Stub::GetOrCreateInstance ();
72- stub->EnqueueCleanupId (
73- reinterpret_cast <void *>(response_factory_address_),
74- PYTHONSTUB_DecoupledResponseFactoryCleanup);
72+ DeleteResponseFactory ();
7573}
7674
7775void
@@ -248,6 +246,10 @@ ResponseSender::Send(
248246 " An error occurred while sending a response." );
249247 }
250248 }
249+
250+ if (flags == TRITONSERVER_RESPONSE_COMPLETE_FINAL) {
251+ DeleteResponseFactory ();
252+ }
251253}
252254
253255bool
@@ -263,4 +265,16 @@ ResponseSender::Close()
263265 closed_ = true ;
264266}
265267
268+ void
269+ ResponseSender::DeleteResponseFactory ()
270+ {
271+ bool already_deleted = response_factory_deleted_.exchange (true );
272+ if (!already_deleted) {
273+ std::unique_ptr<Stub>& stub = Stub::GetOrCreateInstance ();
274+ stub->EnqueueCleanupId (
275+ reinterpret_cast <void *>(response_factory_address_),
276+ PYTHONSTUB_DecoupledResponseFactoryCleanup);
277+ }
278+ }
279+
266280}}} // namespace triton::backend::python
0 commit comments