int main()

in util/netconsblaster.c [406:457]


int main(int argc, char **argv)
{
	int i, nr_threads, srcaddr_per_thread;
	uint64_t tmp, count, start, finish;
	struct blaster_state *threadstates, *cur;
	struct sigaction stopper = {
		.sa_handler = stop_signal,
	};

	parse_arguments(argc, argv, &params);

	nr_threads = 1 << params.thread_order;
	srcaddr_per_thread = params.srcaddr_order - params.thread_order;

	if (srcaddr_per_thread <= 0)
		fatal("More thread bits than srcaddr bits\n");

	threadstates = calloc(nr_threads, sizeof(*threadstates));
	if (!threadstates)
		fatal("ENOMEM allocating state for threads\n");

	sigaction(SIGINT, &stopper, NULL);

	for (i = 0; i < nr_threads; i++) {
		cur = &threadstates[i];

		memcpy(&cur->src, &params.src, sizeof(cur->src));
		memcpy(&cur->dst, &params.dst, sizeof(cur->dst));
		cur->blastcount = params.blastcount;
		cur->stopptr = &params.stop_blasting;
		cur->bits = srcaddr_per_thread;

		cur->src.s6_addr[15] = (unsigned char)i;
		cur->nr = i;

		if (pthread_create(&cur->id, NULL, blaster_thread, cur))
			fatal("Thread %d/%d failed: %m\n", i, nr_threads);
	}

	count = 0;

	start = now_epoch_ms();
	for (i = 0; i < nr_threads; i++) {
		pthread_join(threadstates[i].id, (void**)&tmp);
		count += tmp;
	}
	finish = now_epoch_ms();

	printf("Wrote %lu packets (%lu pkts/sec)\n", count,
			count / (finish - start) * 1000UL);
	return 0;
}