/* statics - all zero-initialized by default */
static volatile int quit; /**< general quit variable for all threads */
static volatile int zero_quit; /**< var for when we just want thr0 to quit*/
+static volatile int zero_sleep; /**< thr0 has quit basic loop and is sleeping*/
static volatile unsigned worker_idx;
static volatile unsigned zero_idx;
/* for worker zero, allow it to restart to pick up last packet
* when all workers are shutting down.
*/
+ __atomic_store_n(&zero_sleep, 1, __ATOMIC_RELEASE);
while (zero_quit)
usleep(100);
+ __atomic_store_n(&zero_sleep, 0, __ATOMIC_RELEASE);
num = rte_distributor_get_pkt(d, id, buf, NULL, 0);
/* flush the distributor */
rte_distributor_flush(d);
- rte_delay_us(10000);
+ while (!__atomic_load_n(&zero_sleep, __ATOMIC_ACQUIRE))
+ rte_distributor_flush(d);
+
+ zero_quit = 0;
+ while (__atomic_load_n(&zero_sleep, __ATOMIC_ACQUIRE))
+ rte_delay_us(100);
for (i = 0; i < rte_lcore_count() - 1; i++)
printf("Worker %u handled %u packets\n", i,
/* flush the distributor */
rte_distributor_flush(d);
- rte_delay_us(10000);
+ while (!__atomic_load_n(&zero_sleep, __ATOMIC_ACQUIRE))
+ rte_distributor_flush(d);
zero_quit = 0;
+
+ while (__atomic_load_n(&zero_sleep, __ATOMIC_ACQUIRE))
+ rte_delay_us(100);
+
for (i = 0; i < rte_lcore_count() - 1; i++)
printf("Worker %u handled %u packets\n", i,
__atomic_load_n(&worker_stats[i].handled_packets,
quit = 0;
worker_idx = 0;
zero_idx = RTE_MAX_LCORE;
+ zero_quit = 0;
+ zero_sleep = 0;
}
static int