+static int stats_lock = 0;
+
+static void
+vtc_accumulate_stats (vcl_test_client_worker_t * wrk,
+ vcl_test_session_t * ctrl)
+{
+ vcl_test_session_t *ts;
+ static char buf[64];
+ int i, show_rx = 0;
+
+ while (__sync_lock_test_and_set (&stats_lock, 1))
+ ;
+
+ if (ctrl->cfg.test == VCL_TEST_TYPE_BI
+ || ctrl->cfg.test == VCL_TEST_TYPE_ECHO)
+ show_rx = 1;
+
+ for (i = 0; i < wrk->cfg.num_test_sessions; i++)
+ {
+ ts = &wrk->sessions[i];
+ ts->stats.start = ctrl->stats.start;
+
+ if (ctrl->cfg.verbose > 1)
+ {
+ sprintf (buf, "CLIENT (fd %d) RESULTS", ts->fd);
+ vcl_test_stats_dump (buf, &ts->stats, show_rx, 1 /* show tx */ ,
+ ctrl->cfg.verbose);
+ }
+
+ vcl_test_stats_accumulate (&ctrl->stats, &ts->stats);
+ if (vcl_comp_tspec (&ctrl->stats.stop, &ts->stats.stop) < 0)
+ ctrl->stats.stop = ts->stats.stop;
+ }
+
+ __sync_lock_release (&stats_lock);
+}
+
+static void
+vtc_worker_sessions_exit (vcl_test_client_worker_t * wrk)
+{
+ vcl_test_client_main_t *vcm = &vcl_client_main;
+ vcl_test_session_t *ctrl = &vcm->ctrl_session;
+ vcl_test_session_t *ts;
+ int i, verbose = ctrl->cfg.verbose;
+
+ for (i = 0; i < wrk->cfg.num_test_sessions; i++)
+ {
+ ts = &wrk->sessions[i];
+ ts->cfg.test = VCL_TEST_TYPE_EXIT;
+
+ if (verbose)
+ {
+ vtinf ("(fd %d): Sending exit cfg to server...", ts->fd);
+ vcl_test_cfg_dump (&ts->cfg, 1 /* is_client */ );
+ }
+ (void) vcl_test_write (ts->fd, (uint8_t *) & ts->cfg,
+ sizeof (ts->cfg), &ts->stats, verbose);
+ }
+ wrk->n_sessions = 0;
+}
+