#include <stdio.h>
#include <sys/time.h>
#include <time.h>



int main()

{
char clocksource[4][15];
clocksource[0][0] = '\0';
clocksource[1][0] = '\0';
clocksource[2][0] = '\0';
clocksource[3][0] = '\0';
clocksource[4][0] = '\0';
char initial_clocksource[15] = {'\0'};
struct timeval mytime;
struct timezone mytimezone;
clock_t start, end;
int x = 0;
int y = 0;


//saving the initial clocksource value so we can set it back when we are finished
FILE *get_clocksource = fopen("/sys/devices/system/clocksource/clocksource0/current_clocksource", "r");
fscanf(get_clocksource, "%s", initial_clocksource); //saving initial value 
fclose(get_clocksource);
printf("Inital ClockSource setting is : %s \n",initial_clocksource);

//reading in all the available clocksource oprions, this seems to vary between 2 and 4 values 
FILE *in_file  = fopen("/sys/devices/system/clocksource/clocksource0/available_clocksource", "r");
fscanf(in_file, "%s %s %s %s %s", clocksource[0], clocksource[1], clocksource[2], clocksource[3], clocksource[4]);
printf("Available ClockSources : %s %s %s %s %s\n",clocksource[0], clocksource[1], clocksource[2], clocksource[3], clocksource[4]);

while ( (x <= 4 ) && (clocksource[x][0] >= 1) ){ //itterate through the available clocksource values and set them as the current value
      FILE *current_clocksource = fopen("/sys/devices/system/clocksource/clocksource0/current_clocksource", "w");
      printf("Testing %s ",clocksource[x]);
      fprintf(current_clocksource,"%s", clocksource[x]);
      x++;
      fclose(current_clocksource);

         y = 0 ;//execute the gettimeofday call 
         start = clock();
         while ( y < 1000000 ) {
             gettimeofday(&mytime, &mytimezone);
             y++;
             }

         end = clock();
         printf("Execution took %f \n",((double) (end - start)) / CLOCKS_PER_SEC);

     }

//setting the clocksource back to the initial value
FILE *set_clocksource = fopen("/sys/devices/system/clocksource/clocksource0/current_clocksource", "w");
fprintf(set_clocksource,"%s", initial_clocksource); //setting clocksource back to  initial value
fclose(set_clocksource);

return 0;

}