Please recompile the program to run under Solaris. I would like to compare the results with the QNX.
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/neutrino.h>
#include <sys/syspage.h> /* for cycles_per_second */
#define COUNT 100000
#define THREADS 128
#define PRIO 255
uint64_t measure[THREADS][COUNT];
int tid[THREADS];
void* src ( void* arg ) {
int i;
int num = (int) arg;
for ( i = 0; i < COUNT; i++ ){
measure[num][i] = ClockCycles();
sched_yield() ;
}
return NULL;
}
int main ( int argc, char *argv[] ) {
int i, j;
int status;
int debug = 1;
pthread_attr_t attr[THREADS];
struct sched_param par;
uint64_t cps;
uint64_t diff;
float diff_ms;
float diff_max = 0;
float average = 0;
if (argc == 2 && !strcmp (argv[1], "print")){
debug = 1;
}
else if (argc > 1) {
printf ( "Usage: %s [print]\n", argv[0] );
exit ( 0 );
}
sched_getparam ( 0, &par );
for ( i = 0; i < THREADS; i++ ){
pthread_attr_init ( &attr[i] );
pthread_attr_setinheritsched ( &attr[i], PTHREAD_EXPLICIT_SCHED );
par.sched_priority = PRIO;
pthread_attr_setschedparam ( &attr[i], &par );
pthread_create ( &tid[i], NULL, src, (void*) i );
}
for (i = 0; i < THREADS; i++ ){
pthread_join ( tid[i], (void*) &status );
if (debug) printf ( "Watek zakonczony. Status %d\n", status ) ;
}
cps = SYSPAGE_ENTRY(qtime)->cycles_per_sec;
if(debug) printf( "cps = %lld\n", cps );
if (debug) printf( "Count\tDiff\t\tDiff (msec)\n");
for ( i = 0; i < COUNT; i++ )
for (j = 0; j < THREADS - 1; j++){
diff = measure[j+1][i] - measure[j][i];
diff_ms = (float)diff / (float)cps * 1000;
if (debug) printf( "%d\t%lld\t\t%f\n", i*THREADS + j, diff, diff_ms);
if ( diff_max < diff_ms ) diff_max = diff_ms;
average += diff_ms / (COUNT * THREADS);
}
printf ( "Maximumm switching latency: %f ms\n", diff_max );
printf ( "Average switching time: %f ms\n", average );
return 0;
}