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.

Signed-off-by: Wanlong Gao <[email protected]>
---
 .../conformance/interfaces/aio_suspend/8-1.c       |   39 +++-----------------
 1 files changed, 6 insertions(+), 33 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 b31ad78..b87abd3 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,34 +114,24 @@ 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];
 
+resubmit:
        /* Submit request list */
        ret = lio_listio(LIO_NOWAIT, aiocbs, NUM_AIOCBS, &event);
 
@@ -162,21 +145,11 @@ 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);
-       }
+       if (aio_error(aiocbs[WAIT_FOR_AIOCB]) != EINPROGRESS)
+               goto resubmit;
 
        /* 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++)
-- 
1.7.9.rc0


------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to