aio_suspend() may be interrupted by IO request's completion signal, so we should use aio_error() instead of signal hander to check whether this request has complete. v2->v3: remove the aio submmit loop but add the aio waiting loop. v3->v4: remove the useless loop, keep origin
Signed-off-by: Wanlong Gao <[email protected]> --- .../conformance/interfaces/aio_suspend/8-1.c | 39 ++------------------ 1 files changed, 4 insertions(+), 35 deletions(-) diff --git a/testcases/open_posix_testsuite/conformance/interfaces/aio_suspend/8-1.c b/testcases/open_posix_testsuite/conformance/interfaces/aio_suspend/8-1.c index 9af9463..743e510 100644 --- a/testcases/open_posix_testsuite/conformance/interfaces/aio_suspend/8-1.c +++ b/testcases/open_posix_testsuite/conformance/interfaces/aio_suspend/8-1.c @@ -51,13 +51,6 @@ 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; } @@ -121,30 +114,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]; @@ -162,21 +144,8 @@ main () exit(PTS_UNRESOLVED); } - /* Check selected request has not completed yet */ - if (received_selected) { - printf(TNAME " Error : AIOCB %d already completed before suspend\n", - WAIT_FOR_AIOCB); - for (i = 0; i < NUM_AIOCBS; i++) - free(aiocbs[i]); - free(bufs); - free(aiocbs); - close(fd); - exit(PTS_FAIL); - } - /* Suspend on selected request */ ret = aio_suspend((const struct aiocb **)plist, 2, NULL); - if (ret) { printf(TNAME " Error at aio_suspend() %d: %s\n", errno, strerror(errno)); for (i=0; i<NUM_AIOCBS; i++) @@ -211,7 +180,7 @@ main () if (i == WAIT_FOR_AIOCB) continue; - err = aio_error(aiocbs[i]); + err = aio_error(aiocbs[i]); ret = aio_return(aiocbs[i]); if ((err != 0) && (ret != BUF_SIZE)) { -- 1.7.9 ------------------------------------------------------------------------------ Virtualization & Cloud Management Using Capacity Planning Cloud computing makes use of virtualization - but cloud computing also focuses on allowing computing to be delivered as a service. http://www.accelacomm.com/jaw/sfnl/114/51521223/ _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
