Ejemplo n.º 1
0
ClockApp::ClockApp(int argc, char** argv, ClockConfig* config, GdkPixbuf* pixbuf) :
	DockApp(argc, argv, "SpaceClock", pixbuf),
	rgb(new Rgb_buffer(64, 64))
{
	ras = make_bad_rasterizer(rgb);

	cfg = config;

	back = new Rgb_buffer(pixbuf);
	*rgb = *back;
	//rgb->clear();

	cd = new ClockDraw(cfg, rgb, ras);

	last_exact_second = -1;

	if (cfg->get_hand(ClockConfig::second_hand).exact)
	{
		set_sleep_time(10000);
	}
	else
	{
		set_sleep_time(100000);
	}
}
/*
 * Measurement function. Where the most interesting stuff happens.
 */
int doMeasurement()
{
	struct timespec sleep_time, remain_time;
	//struct timeval begin, end;
	struct timespec begin, end;
	int delay, max_delay;
	int i, j = 0, data_length;
	time_measure *data;
	double diff_time_precise;
	//!!int diff_time;

	data_length = ((max_usec - min_usec) / step_usec) + 1;
	data = malloc(sizeof(time_measure) * 10000);
	if (data == NULL) {
		perror("Error allocating memory.");
		return -1;
	}

	for (sleep_usec = min_usec; sleep_usec <= max_usec; sleep_usec += step_usec) {

		max_delay = 0;
		set_sleep_time(sleep_usec, &sleep_time);

		if (verbose) {
			printf("============================\n");
			printf("Starting measurement: Sleep time = %d usec, loops = %d\n", sleep_usec, loop_count);
			printf("============================\n");
			printf("tv_sec = %ld, tv_nsec = %ld\n", sleep_time.tv_sec, sleep_time.tv_nsec);
		}

		for (i = 0; i < loop_count; ++i) {
			int ret;

			//!!gettimeofday(&begin, NULL);
			clock_gettime(CLOCK_MONOTONIC, &begin);

			ret = clock_nanosleep(CLOCK_MONOTONIC, 0, &sleep_time, &remain_time);
			if (ret) {
				fprintf(stderr, "Sleep returned error: %d.\n", ret);
				return -1;
			}

			//!!gettimeofday(&end, NULL);
			clock_gettime(CLOCK_MONOTONIC, &end);

			diff_time_precise = get_time_diff_usec_precise(&begin, &end);
			//!!diff_time = get_time_diff_usec(&begin, &end);
			//!!!delay = abs(diff_time - sleep_usec);
			delay = abs((int) diff_time_precise - sleep_usec);
			if (delay > max_delay)
				max_delay = delay;

			if (verbose) {
				//!!printf("value: %d usec, delay: %d usec, raw_data: %d usec\n",
				//!!   diff_time, delay, diff_time);

				printf("value: %d usec, delay: %d usec, raw_data: %f usec\n",
				       (int) diff_time_precise, delay, diff_time_precise);
			}
		}

		if (verbose) {
			printf("============================\n");
			printf("Max delay = %d usec\n", max_delay);
			printf("============================\n");
		}

		data[j].sleep_usec = sleep_usec;
		data[j].max_delay = max_delay;
		++j;
	}

	for (i = 0; i < data_length; ++i)
		writeToFile(out_file, data[i].sleep_usec, data[i].max_delay);

	free(data);

	return 0;
}