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

Reply via email to