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