int job(struct thread_context *ctx) { int ret; struct timespec start, end; litmus_lock(lock_1); clock_gettime(CLOCK_REALTIME, &start); loop_for(ctx->id, 0.001); if(non_preemption == 0) loop_for(ctx->id, 0.72); if(non_preemption == 1) loop_for(ctx->id, 0.000504); clock_gettime(CLOCK_REALTIME, &end); ret = litmus_unlock(lock_1); if (ret != 0) printf("%s\n", "unlock error"); ctx->response_time[ctx->execute_count] = (end.tv_sec * 1000000000 + end.tv_nsec) - (start.tv_sec * 1000000000 + start.tv_nsec); ctx->execute_count += 1; return 0; }
static void fine_tune(double interval) { double start, end, delta; start = wctime(); loop_for(interval); end = wctime(); delta = (end - start - interval) / interval; if (delta != 0) loop_length = loop_length / (1 - delta); }
static void debug_delay_loop(void) { double start, end, delay; show_loop_length(); while (1) { for (delay = 0.5; delay > 0.01; delay -= 0.01) { start = wctime(); loop_for(delay); end = wctime(); printf("%6.4fs: looped for %10.8fs, delta=%11.8fs, error=%7.4f%%\n", delay, end - start, end - start - delay, 100 * (end - start - delay) / delay); } } }
static int job(double exec_time) { loop_for(exec_time); sleep_next_period(); return 0; }