posix: aio_cancel: 3-1, 4-1: prepare aiocb structures in advance
PATCH 1/3 posix: aio_cancel: 3-1, 4-1: prepare aiocb structures in advance
The tests work this way. They sequentially issue a number of aio_write() operations and then cancel them all. They expect that at least one of the operations has not been completed when they issue the cancel request. However, while preparing a request two calls to malloc() are made, one of them is for a 1 MB block. This is a relatively time-expensive operation, so on some systems it may (and does) happen that all AIO writes are completed before aio_cancel() is called.
Preparing all aiocb structures in advance eliminates this problem.
--- .../conformance/interfaces/aio_cancel/3-1.c | 7 ++++++- .../conformance/interfaces/aio_cancel/4-1.c | 2 ++ 2 files changed, 8 insertions(+), 1 deletions(-)
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/3-1.c +6 -1
@@ -65,6 +65,7 @@ int main(void) {char tmpfname[256 ];int fd; +struct aiocb *aiocb_list[BUF_NB ];struct aiocb *aiocb;struct sigaction action;int i;
@@ -121,7 +122,11 @@ int main(void) aiocb->aio_sigevent.sigev_value.sival_ptr = aiocb; aiocb->aio_reqprio =0 ; -if (aio_write (aiocb) ==-1 ) { + aiocb_list[i] = aiocb; + } + +for (i =0 ; i <BUF_NB ; i++) { +if (aio_write (aiocb_list[i]) ==-1 ) {printf (TNAME " loop %d: Error@aio_write(): %s\n" , i,strerror (errno));return PTS_FAIL ;
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/4-1.c +2 -0
@@ -86,7 +86,9 @@ int main(void) aiocb[i]->aio_nbytes =BUF_SIZE ; aiocb[i]->aio_offset =0 ; aiocb[i]->aio_sigevent.sigev_notify =SIGEV_NONE ; + } +for (i =0 ; i <BUF_NB ; i++) {if (aio_write (aiocb[i]) ==-1 ) {printf (TNAME " loop %d: Error@aio_write(): %s\n" , i,strerror (errno));
Signature · 1 line
1.7.1
PATCH 2/3 posix: aio_cancel: 5-1, 6-1, 7-1: initialize aio_reqprio
aiocb is allocated via malloc(), which does not clear the memory. aio_write() may fail with EINVAL if aio_reqprio is not properly initialized.
--- .../conformance/interfaces/aio_cancel/5-1.c | 1 + .../conformance/interfaces/aio_cancel/6-1.c | 1 + .../conformance/interfaces/aio_cancel/7-1.c | 1 + 3 files changed, 3 insertions(+), 0 deletions(-)
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/5-1.c +1 -0
@@ -86,6 +86,7 @@ int main(void) aiocb[i]->aio_nbytes =BUF_SIZE ; aiocb[i]->aio_offset =0 ; aiocb[i]->aio_sigevent.sigev_notify =SIGEV_NONE ; + aiocb[i]->aio_reqprio =0 ;if (aio_write (aiocb[i]) ==-1 ) { printf(TNAME " loop %d: Error at aio_write(): %s\n",
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/6-1.c +1 -0
@@ -87,6 +87,7 @@ int main(void) aiocb[i]->aio_nbytes =BUF_SIZE ; aiocb[i]->aio_offset =0 ; aiocb[i]->aio_sigevent.sigev_notify =SIGEV_NONE ; + aiocb[i]->aio_reqprio =0 ;if (aio_write (aiocb[i]) ==-1 ) { printf(TNAME " loop %d: Error at aio_write(): %s\n",
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/7-1.c +1 -0
@@ -90,6 +90,7 @@ int main(void) aiocb[i]->aio_nbytes =BUF_SIZE ; aiocb[i]->aio_offset =0 ; aiocb[i]->aio_sigevent.sigev_notify =SIGEV_NONE ; + aiocb[i]->aio_reqprio =0 ;if (aio_write (aiocb[i]) ==-1 ) { printf(TNAME " loop %d: Error at aio_write(): %s\n",
Signature · 1 line
1.7.1
PATCH 2/3 posix: aio_cancel: 5-1, 6-1, 7-1: initialize aio_reqprio
Hi!
Quoted 3 lines
aiocb is allocated via
malloc(), which does not clear the memory.aio_write()may fail with EINVAL ifaio_reqpriois not properly initialized.
The manual pages suggests to zero the whole structure before use either by using calloc() or with memset(), can we do that instead please?
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH 3/3 posix: aio_error: 2-1: initialize aio_reqprio
In reply to Stanislav Kholmanskikhaio_write() may fail if aio_reqprio is not properly initialized.
--- .../conformance/interfaces/aio_error/2-1.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
testcases/open_posix_testsuite/conformance/interfaces/aio_error/2-1.c +1 -0
@@ -79,6 +79,7 @@ int main(void) aiocb[i]->aio_nbytes =BUF_SIZE ; aiocb[i]->aio_offset =0 ; aiocb[i]->aio_sigevent.sigev_notify =SIGEV_NONE ; + aiocb[i]->aio_reqprio =0 ;if (aio_write (aiocb[i]) ==-1 ) { printf(TNAME " loop %d: Error at aio_write(): %s\n",
Signature · 1 line
1.7.1
PATCH 3/3 posix: aio_error: 2-1: initialize aio_reqprio
Hi!
Quoted 1 line
aio_write()may fail ifaio_reqpriois not properly initialized.
Here as well.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH 3/3 posix: aio_error: 2-1: initialize aio_reqprio
Thank you. Will do this shortly.
Quoted 5 lines · Cyril Hrubis
Hi!
Quoted 1 line
aio_write()may fail ifaio_reqpriois not properly initialized.Here as well.
PATCH 1/3 posix: aio_cancel: 3-1, 4-1: prepare aiocb structures in advance
In reply to Stanislav KholmanskikhHi!
Looks good, acked.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH 1/3 posix: aio_cancel: 3-1, 4-1: prepare aiocb structures in advance
This particular patch was pushed.
Thank you.
Quoted 3 lines · Cyril Hrubis
Hi!
Looks good, acked.