@@ -210,6 +210,51 @@ vbe_close_acct(const struct pfd *pfd, const stream_close_t reason)
210210 WRONG ("Wrong event in vbe_close_acct" );
211211}
212212
213+ static void v_matchproto_ (vdi_finish_f )
214+ vbe_dir_finish (VRT_CTX , VCL_BACKEND d )
215+ {
216+ struct backend * bp ;
217+ struct busyobj * bo ;
218+ struct pfd * pfd ;
219+
220+ CHECK_OBJ_NOTNULL (ctx , VRT_CTX_MAGIC );
221+ CHECK_OBJ_NOTNULL (d , DIRECTOR_MAGIC );
222+ bo = ctx -> bo ;
223+ CHECK_OBJ_NOTNULL (bo , BUSYOBJ_MAGIC );
224+ CAST_OBJ_NOTNULL (bp , d -> priv , BACKEND_MAGIC );
225+
226+ CHECK_OBJ_NOTNULL (bo -> htc , HTTP_CONN_MAGIC );
227+ CHECK_OBJ_NOTNULL (bo -> htc -> doclose , STREAM_CLOSE_MAGIC );
228+
229+ pfd = bo -> htc -> priv ;
230+ bo -> htc -> priv = NULL ;
231+ if (bo -> htc -> doclose != SC_NULL || bp -> proxy_header != 0 ) {
232+ vbe_close_acct (pfd , bo -> htc -> doclose );
233+ VSLb (bo -> vsl , SLT_BackendClose , "%d %s close %s" , * PFD_Fd (pfd ),
234+ VRT_BACKEND_string (d ), bo -> htc -> doclose -> name );
235+ VCP_Close (& pfd );
236+ AZ (pfd );
237+ Lck_Lock (bp -> director -> mtx );
238+ VSC_C_main -> backend_closed ++ ;
239+ } else {
240+ assert (PFD_State (pfd ) == PFD_STATE_USED );
241+ VSLb (bo -> vsl , SLT_BackendClose , "%d %s recycle" , * PFD_Fd (pfd ),
242+ VRT_BACKEND_string (d ));
243+ Lck_Lock (bp -> director -> mtx );
244+ VSC_C_main -> backend_recycle ++ ;
245+ VCP_Recycle (bo -> wrk , & pfd );
246+ }
247+ assert (bp -> n_conn > 0 );
248+ bp -> n_conn -- ;
249+ AN (bp -> vsc );
250+ bp -> vsc -> conn -- ;
251+ #define ACCT (foo ) bp->vsc->foo += bo->acct.foo;
252+ #include "tbl/acct_fields_bereq.h"
253+ vbe_connwait_signal_locked (bp );
254+ Lck_Unlock (bp -> director -> mtx );
255+ bo -> htc = NULL ;
256+ }
257+
213258/*--------------------------------------------------------------------
214259 * Get a connection to the backend
215260 *
@@ -379,51 +424,6 @@ vbe_dir_getfd(VRT_CTX, struct worker *wrk, VCL_BACKEND dir, struct backend *bp,
379424 return (pfd );
380425}
381426
382- static void v_matchproto_ (vdi_finish_f )
383- vbe_dir_finish (VRT_CTX , VCL_BACKEND d )
384- {
385- struct backend * bp ;
386- struct busyobj * bo ;
387- struct pfd * pfd ;
388-
389- CHECK_OBJ_NOTNULL (ctx , VRT_CTX_MAGIC );
390- CHECK_OBJ_NOTNULL (d , DIRECTOR_MAGIC );
391- bo = ctx -> bo ;
392- CHECK_OBJ_NOTNULL (bo , BUSYOBJ_MAGIC );
393- CAST_OBJ_NOTNULL (bp , d -> priv , BACKEND_MAGIC );
394-
395- CHECK_OBJ_NOTNULL (bo -> htc , HTTP_CONN_MAGIC );
396- CHECK_OBJ_NOTNULL (bo -> htc -> doclose , STREAM_CLOSE_MAGIC );
397-
398- pfd = bo -> htc -> priv ;
399- bo -> htc -> priv = NULL ;
400- if (bo -> htc -> doclose != SC_NULL || bp -> proxy_header != 0 ) {
401- vbe_close_acct (pfd , bo -> htc -> doclose );
402- VSLb (bo -> vsl , SLT_BackendClose , "%d %s close %s" , * PFD_Fd (pfd ),
403- VRT_BACKEND_string (d ), bo -> htc -> doclose -> name );
404- VCP_Close (& pfd );
405- AZ (pfd );
406- Lck_Lock (bp -> director -> mtx );
407- VSC_C_main -> backend_closed ++ ;
408- } else {
409- assert (PFD_State (pfd ) == PFD_STATE_USED );
410- VSLb (bo -> vsl , SLT_BackendClose , "%d %s recycle" , * PFD_Fd (pfd ),
411- VRT_BACKEND_string (d ));
412- Lck_Lock (bp -> director -> mtx );
413- VSC_C_main -> backend_recycle ++ ;
414- VCP_Recycle (bo -> wrk , & pfd );
415- }
416- assert (bp -> n_conn > 0 );
417- bp -> n_conn -- ;
418- AN (bp -> vsc );
419- bp -> vsc -> conn -- ;
420- #define ACCT (foo ) bp->vsc->foo += bo->acct.foo;
421- #include "tbl/acct_fields_bereq.h"
422- vbe_connwait_signal_locked (bp );
423- Lck_Unlock (bp -> director -> mtx );
424- bo -> htc = NULL ;
425- }
426-
427427static int v_matchproto_ (vdi_gethdrs_f )
428428vbe_dir_gethdrs (VRT_CTX , VCL_BACKEND d )
429429{
0 commit comments