//
// Test common code
//
//
// Author: P.J. Drongowski
// Date: 18 April 2013
//
// Copyright (c) 2013 Paul J. Drongowski
//
#define _GNU_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <sys/times.h>
#include <sched.h>
#include "../test_common/test_common.h"
//
// Common command line options
//
int d_flag = 0 ; // Display debugging output when TRUE
int h_flag = 0 ; // Display usage/help information then TRUE
int v_flag = 0 ; // Display more information when TRUE
//
// Write test run results to this file
//
FILE* result_file = NULL ;
//
// Display this divider in headers
//
static char* hline = "***************************************************************" ;
unsigned long long int getTimeStamp()
{
return( 0 ) ;
}
//
// Display the processor affinity mask for the process. This function is
// used mainly for debugging purposes.
//
void display_process_affinity()
{
cpu_set_t set ;
int cpu_set_size = sizeof(cpu_set_t) ;
int number_of_cpus = -1 ;
int i = 0 ;
unsigned long long int affinity_mask ;
// Get the number of CPUs in the platform
number_of_cpus = sysconf( _SC_NPROCESSORS_ONLN ) ;
// Display a warning if there are more than 64 processors since the
// mask will exceed the 64-bit affinity_mask.
if (number_of_cpus > 64) {
fprintf(stderr, "display_process_affinity: More than 64 cores\n") ;
}
// Get the current process scheduling affinity set (mask)
sched_getaffinity(0, cpu_set_size, &set) ;
// Convert the CPU set to a true affinity mask
affinity_mask = 0 ;
for (i = number_of_cpus-1 ; i >= 0 ; i--) {
affinity_mask = affinity_mask << 1 ;
if (CPU_ISSET(i, &set)) affinity_mask |= 1 ;
}
// Display the affinity mask in hex
fprintf(stderr, "Affinity mask: %16llx\n", affinity_mask) ;
}
// Currently stubbed out
// Return TRUE on success, otherwise FALSE
int set_process_affinity(int core)
{
cpu_set_t set ;
int cpu_set_size = sizeof(cpu_set_t) ;
int number_of_cpus = -1 ;
int i = 0 ;
unsigned long long int affinity_mask ;
number_of_cpus = sysconf( _SC_NPROCESSORS_ONLN ) ;
if ((core < 0) || (core >= number_of_cpus)) {
fprintf(stderr, "set_process_affinity: Invalid core number: %d\n", core) ;
}
if (d_flag) {
fprintf(stderr, "Initial process affinity mask\n") ;
display_process_affinity() ;
}
CPU_ZERO(&set) ;
CPU_SET(core, &set) ;
sched_setaffinity(0, cpu_set_size, &set) ;
if (d_flag) {
fprintf(stderr, "Final process affinity mask\n") ;
display_process_affinity() ;
}
return( 1 ) ;
}
//
// Display usage information
//
void display_usage_info(char* prog, char* usage_strings[])
{
char** msg ;
fprintf(stderr, "Usage: %s\n", prog) ;
for (msg = usage_strings ; *msg != NULL ; msg++) {
fprintf(stderr, "%s\n", *msg) ;
}
exit( EXIT_FAILURE ) ;
}
//
// Return CPU speed in MHz
//
unsigned int get_cpu_speed()
{
return( 700 ) ;
}
//
// Write system information into the results file
//
void print_system_info()
{
int numberOfCPUs = -1 ;
numberOfCPUs = sysconf( _SC_NPROCESSORS_ONLN ) ;
fprintf(result_file, "System information\n") ;
fprintf(result_file, " Number of processors: %d\n", numberOfCPUs) ;
}
//
// Get the elapsed time from the OS and return the time after converting
// to seconds.
//
double get_elapsed_time()
{
return( ((double)clock() / (double)CLOCKS_PER_SEC) ) ;
}
//
// Obtain and print the elapsed time to the result file
//
void print_elapsed_time()
{
double elapsed ;
double resolution ;
// Obtain and display elapsed execution time
elapsed = get_elapsed_time() ;
resolution = 1.0 / CLOCKS_PER_SEC ;
fprintf(result_file,
" Elapsed time: %9.3f (%8.6f sec resolution)\n",
elapsed,
resolution) ;
}
//
// Obtain and print system and user time into the result file
//
void print_process_times()
{
struct tms pt ;
int ticks_per_second = 1 ;
double user_time_sec, system_time_sec ;
if (times(&pt) == -1) {
fprintf(stderr, "Couldn't get process times\n") ;
}
ticks_per_second = sysconf(_SC_CLK_TCK) ;
user_time_sec = (double)pt.tms_utime / (double)ticks_per_second ;
system_time_sec = (double)pt.tms_stime / (double)ticks_per_second ;
fprintf(result_file," User time: %9.3f sec\n", user_time_sec) ;
fprintf(result_file," System time: %9.3f sec\n", system_time_sec) ;
}
//
// Print heading into the result file
//
void print_heading(char* heading)
{
time_t current_time ;
time(¤t_time) ;
fprintf(result_file, "%s\n", hline) ;
fprintf(result_file, "%s\n", heading) ;
fprintf(result_file, "%s\n", ctime(¤t_time)) ;
fprintf(result_file, "%s\n", hline) ;
}
//
// Create the result file and return TRUE if successful
//
int create_result_file(char* filename)
{
if ((result_file = fopen(filename, "w")) == NULL) {
fprintf(stderr, "Couldn't open result file\n") ;
return( 0 ) ;
}
return( 1 ) ;
}
//
// Close the result file
//
void close_result_file()
{
fclose( result_file ) ;
}