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; }