setitimer shows different between amd64 and ia32
Adam Lee
adam8157 at gmail.com
Sun Jul 24 23:10:38 EDT 2011
Hi, all
I'm working on a test which invoking setitimer(), and it hang in
ia32 and ppc, but passed in amd64, could you guys give some help?
1, I know the 'value.it_interval.tv_usec' is too short, but why amd64
passed?
2, If I switch clock source from "tsc" to "hpet" on ia32, it passed.
3, I compiled it in ia32 and run it with ia32-libs in amd64, it passed.
Here is the source:
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
#define LOOP_LIMIT 1E2
volatile int sigcount = 0;
void catcher(int sig)
{
struct itimerval value;
int which = ITIMER_REAL;
sigcount++;
if (sigcount > 1) {
getitimer(which, &value);
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 0;
/*setitimer( which, &value, NULL ); */
}
}
int main(int argc, char *argv[])
{
int result = 0;
struct itimerval value, ovalue, pvalue;
int which = ITIMER_REAL;
struct sigaction sact;
volatile double count;
time_t t;
sigemptyset(&sact.sa_mask);
sact.sa_flags = 0;
sact.sa_handler = catcher;
sigaction(SIGALRM, &sact, NULL);
getitimer(which, &pvalue);
/*Set a real time interval timer to repeat */
value.it_interval.tv_sec = 0;
value.it_interval.tv_usec = 1;
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 5;
result = setitimer(which, &value, &ovalue);
/*The interval timer value returned by setitimer() should be */
/*identical to the timer value returned by getitimer() */
if (ovalue.it_interval.tv_sec != pvalue.it_interval.tv_sec ||
ovalue.it_interval.tv_usec != pvalue.it_interval.tv_usec ||
ovalue.it_value.tv_sec != pvalue.it_value.tv_sec ||
ovalue.it_value.tv_usec != pvalue.it_value.tv_usec) {
printf("Real time interval timer mismatch, test Failed\n");
result = -1;
}
time(&t);
printf("Before loop, time is %s", ctime(&t));
for (count = 0; ((count < LOOP_LIMIT)); count++) ;
time(&t);
printf("After loop, time is %s\n", ctime(&t));
if (sigcount == 0)
printf("The signal catcher never gained control\n");
else
printf("The signal catcher gained control\n");
printf("The value of count is %.0f\n", count);
return (result);
}
--
Regards,
Adam Lee
--------------------------------------------------
E-mail: adam8157 at gmail.com
Website: http://www.adam8157.info
--------------------------------------------------
More information about the Kernelnewbies
mailing list