/* Time inconsistency check test * by: john stultz (johnstul@us.ibm.com) * (C) Copyright IBM 2003, 2004, 2005, 2012 * (C) Copyright Linaro Limited 2015 * Licensed under the GPLv2 * * To build: * $ gcc inconsistency-check.c -o inconsistency-check -lrt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details.
*/
char *clockstring(int clockid)
{ switch (clockid) { case CLOCK_REALTIME: return"CLOCK_REALTIME"; case CLOCK_MONOTONIC: return"CLOCK_MONOTONIC"; case CLOCK_PROCESS_CPUTIME_ID: return"CLOCK_PROCESS_CPUTIME_ID"; case CLOCK_THREAD_CPUTIME_ID: return"CLOCK_THREAD_CPUTIME_ID"; case CLOCK_MONOTONIC_RAW: return"CLOCK_MONOTONIC_RAW"; case CLOCK_REALTIME_COARSE: return"CLOCK_REALTIME_COARSE"; case CLOCK_MONOTONIC_COARSE: return"CLOCK_MONOTONIC_COARSE"; case CLOCK_BOOTTIME: return"CLOCK_BOOTTIME"; case CLOCK_REALTIME_ALARM: return"CLOCK_REALTIME_ALARM"; case CLOCK_BOOTTIME_ALARM: return"CLOCK_BOOTTIME_ALARM"; case CLOCK_TAI: return"CLOCK_TAI";
} return"UNKNOWN_CLOCKID";
}
/* returns 1 if a <= b, 0 otherwise */ staticinlineint in_order(struct timespec a, struct timespec b)
{ /* use unsigned to avoid false positives on 2038 rollover */ if ((unsignedlong)a.tv_sec < (unsignedlong)b.tv_sec) return 1; if ((unsignedlong)a.tv_sec > (unsignedlong)b.tv_sec) return 0; if (a.tv_nsec > b.tv_nsec) return 0; return 1;
}
int consistency_test(int clock_type, unsignedlong seconds)
{ struct timespec list[CALLS_PER_LOOP]; int i, inconsistent; long now, then;
time_t t; char *start_str;
clock_gettime(clock_type, &list[0]);
now = then = list[0].tv_sec;
/* timestamp start of test */
t = time(0);
start_str = ctime(&t);
while (seconds == -1 || now - then < seconds) {
inconsistent = -1;
/* Fill list */ for (i = 0; i < CALLS_PER_LOOP; i++)
clock_gettime(clock_type, &list[i]);
/* Check for inconsistencies */ for (i = 0; i < CALLS_PER_LOOP - 1; i++) if (!in_order(list[i], list[i+1]))
inconsistent = i;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.