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: [email protected]
Website: http://www.adam8157.info
--------------------------------------------------

_______________________________________________
Kernelnewbies mailing list
[email protected]
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Reply via email to