From: Subrata <sub...@us...> - 2009-09-27 17:38:15
|
Update of /cvsroot/ltp/ltp/testcases/kernel/syscalls/ppoll In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv23882/ltp/testcases/kernel/syscalls/ppoll Modified Files: ppoll01.c Log Message: Add a test for race-free operation of ppoll: Hello, after the previous patch, this patch adds a test to test a use of ppoll() without races (ie. the intended use of ppoll). It blocks the signal, schedules a signal to be delivered and expects ppoll to return EINTR (and never lose the signal. Signed-off-by: Jiri Palecek <jpa...@we...>. Index: ppoll01.c =================================================================== RCS file: /cvsroot/ltp/ltp/testcases/kernel/syscalls/ppoll/ppoll01.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ppoll01.c 27 Sep 2009 17:37:09 -0000 1.4 --- ppoll01.c 27 Sep 2009 17:38:06 -0000 1.5 *************** *** 156,159 **** --- 156,160 ---- FD_ALREADY_CLOSED, SEND_SIGINT, + SEND_SIGINT_RACE_TEST, INVALID_NFDS, INVALID_FDS, *************** *** 220,228 **** }, { // case05 .ttype = INVALID_NFDS, .ret = -1, .err = EINVAL, }, ! { // case06 .ttype = INVALID_FDS, .ret = -1, --- 221,234 ---- }, { // case05 + .ttype = SEND_SIGINT_RACE_TEST, + .ret = -1, + .err = EINTR, + }, + { // case06 .ttype = INVALID_NFDS, .ret = -1, .err = EINVAL, }, ! { // case07 .ttype = INVALID_FDS, .ret = -1, *************** *** 230,239 **** }, #if 0 ! { // case07 .ttype = MINUS_NSEC, .ret = -1, .err = EINVAL, // RHEL4U1 + 2.6.18 returns SUCCESS }, ! { // case08 .ttype = TOO_LARGE_NSEC, .ret = -1, --- 236,245 ---- }, #if 0 ! { // case08 .ttype = MINUS_NSEC, .ret = -1, .err = EINVAL, // RHEL4U1 + 2.6.18 returns SUCCESS }, ! { // case09 .ttype = TOO_LARGE_NSEC, .ret = -1, *************** *** 307,310 **** --- 313,339 ---- return 1; break; + case SEND_SIGINT_RACE_TEST: + /* block the INT signal */ + sigemptyset(&sigmask); + sigaddset(&sigmask, SIGINT); + sigprocmask(SIG_SETMASK, &sigmask, NULL); + + /* and let it be unblocked when the syscall runs */ + sigemptyset(&sigmask); + p_sigmask = &sigmask; + //sigsetsize = sizeof(sigmask); + sigsetsize = 8; + nfds = 0; + ts.tv_sec = 0; + ts.tv_nsec = 300000000; // 300msec => need to be enough for + // waiting the signal + p_ts = &ts; + nfds = 0; + pid = create_sig_proc(0, SIGINT, 1); + if (pid < 0) { + result=1; + goto cleanup; + } + break; case INVALID_NFDS: //nfds = RLIMIT_NOFILE + 1; ==> RHEL4U1 + 2.6.18 returns SUCCESS *************** *** 345,354 **** * Check results */ result |= (sys_errno != tc->err) || !cmp_ok; PRINT_RESULT_CMP(sys_ret >= 0, tc->ret, tc->err, sys_ret, sys_errno, cmp_ok); ! if (fd >= 0) cleanup_file(fpath); if (pid > 0) { int st; --- 374,399 ---- * Check results */ + if(tc->ttype == SEND_SIGINT_RACE_TEST) { + int sig; + sigprocmask(SIG_SETMASK, NULL, &sigmask); + for(sig=1; sig < SIGRTMAX; sig++) { + TEST(sigismember(&sigmask, sig)); + if(TEST_RETURN < 0 && TEST_ERRNO == EINVAL && sig != SIGINT) + continue; /* let's ignore errors if they are for other signal than SIGINT that we set */ + if((sig==SIGINT) != (TEST_RETURN!=0)) { + tst_resm(TFAIL, "Bad value of signal mask, signal %d is %s", sig, TEST_RETURN ? "on" : "off"); + cmp_ok |=1; + } + } + } result |= (sys_errno != tc->err) || !cmp_ok; PRINT_RESULT_CMP(sys_ret >= 0, tc->ret, tc->err, sys_ret, sys_errno, cmp_ok); ! cleanup: if (fd >= 0) cleanup_file(fpath); + + sigemptyset(&sigmask); + sigprocmask(SIG_SETMASK, &sigmask, NULL); if (pid > 0) { int st; |