aio_suspend may be interrupted by IO request's completion signal, so we should use aio_error instead signal hander to check whether this request has complete.
Signed-off-by: Bian Naimeng <[email protected]> --- .../conformance/interfaces/aio_suspend/1-1.c | 51 +++++++------------- 1 files changed, 17 insertions(+), 34 deletions(-) diff --git a/testcases/open_posix_testsuite/conformance/interfaces/aio_suspend/1-1.c b/testcases/open_posix_testsuite/conformance/interfaces/aio_suspend/1-1.c index 7d33e62..8c85ca5 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/aio_suspend/1-1.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/aio_suspend/1-1.c @@ -44,19 +44,11 @@ #define BUF_SIZE 1024*1024 #define WAIT_FOR_AIOCB 6 -int received_selected = 0; int received_all = 0; void sigrt1_handler(int signum, siginfo_t *info, void *context) { - if (info->si_value.sival_int == WAIT_FOR_AIOCB) - received_selected = 1; -} - -void -sigrt2_handler(int signum, siginfo_t *info, void *context) -{ received_all = 1; } @@ -123,30 +115,19 @@ main () aiocbs[i]->aio_buf = &bufs[i*BUF_SIZE]; aiocbs[i]->aio_nbytes = BUF_SIZE; aiocbs[i]->aio_lio_opcode = LIO_READ; - - /* Use SIRTMIN+1 for individual completions */ - aiocbs[i]->aio_sigevent.sigev_notify = SIGEV_SIGNAL; - aiocbs[i]->aio_sigevent.sigev_signo = SIGRTMIN+1; - aiocbs[i]->aio_sigevent.sigev_value.sival_int = i; } - /* Use SIGRTMIN+2 for list completion */ + /* Use SIGRTMIN+1 for list completion */ event.sigev_notify = SIGEV_SIGNAL; - event.sigev_signo = SIGRTMIN+2; + event.sigev_signo = SIGRTMIN+1; event.sigev_value.sival_ptr = NULL; - /* Setup handler for individual operation completion */ + /* Setup handler for list completion */ action.sa_sigaction = sigrt1_handler; sigemptyset(&action.sa_mask); action.sa_flags = SA_SIGINFO|SA_RESTART; sigaction(SIGRTMIN+1, &action, NULL); - /* Setup handler for list completion */ - action.sa_sigaction = sigrt2_handler; - sigemptyset(&action.sa_mask); - action.sa_flags = SA_SIGINFO|SA_RESTART; - sigaction(SIGRTMIN+2, &action, NULL); - /* Setup suspend list */ plist[0] = NULL; plist[1] = aiocbs[WAIT_FOR_AIOCB]; @@ -155,7 +136,8 @@ main () ret = lio_listio(LIO_NOWAIT, aiocbs, NUM_AIOCBS, &event); if (ret) { - printf(TNAME " Error at lio_listio() %d: %s\n", errno, strerror(errno)); + printf (TNAME " Error at lio_listio() %d: %s\n", + errno, strerror(errno)); for (i=0; i<NUM_AIOCBS; i++) free (aiocbs[i]); free (bufs); @@ -165,9 +147,10 @@ main () } /* Check selected request has not completed yet */ - if (received_selected) { - printf (TNAME " Error : AIOCB %d already completed before suspend\n", - WAIT_FOR_AIOCB); + err = aio_error(aiocbs[WAIT_FOR_AIOCB]); + if (err != EINPROGRESS) { + printf (TNAME " Error : AIOCB %d should not have completed " + "before suspend\n", WAIT_FOR_AIOCB); for (i=0; i<NUM_AIOCBS; i++) free (aiocbs[i]); free (bufs); @@ -178,11 +161,9 @@ main () /* Suspend on selected request */ ret = aio_suspend((const struct aiocb **)plist, 2, NULL); - - /* Check selected request has completed */ - if (!received_selected) { - printf (TNAME " Error : AIOCB %d should have completed after suspend\n", - WAIT_FOR_AIOCB); + if (ret) { + printf (TNAME " Error at aio_suspend() %d: %s\n", + errno, strerror (errno)); for (i=0; i<NUM_AIOCBS; i++) free (aiocbs[i]); free (bufs); @@ -191,9 +172,11 @@ main () exit (PTS_FAIL); } - - if (ret) { - printf (TNAME " Error at aio_suspend() %d: %s\n", errno, strerror (errno)); + /* Check selected request has completed */ + err = aio_error(aiocbs[WAIT_FOR_AIOCB]); + if (err) { + printf (TNAME " Error : AIOCB %d should have completed after " + "suspend\n", WAIT_FOR_AIOCB); for (i=0; i<NUM_AIOCBS; i++) free (aiocbs[i]); free (bufs); -- 1.7.0.4 ------------------------------------------------------------------------------ Centralized Desktop Delivery: Dell and VMware Reference Architecture Simplifying enterprise desktop deployment and management using Dell EqualLogic storage and VMware View: A highly scalable, end-to-end client virtualization framework. Read more! http://p.sf.net/sfu/dell-eql-dev2dev _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
