* rt/lio_listio.c (lio_listio): Always disable individual
	notification.
	* rt/Makefile: Add rules to build and run tst-aio2.
	* rt/tst-aio2.c: New file.
This commit is contained in:
Ulrich Drepper 2000-07-26 06:30:30 +00:00
parent b7ed26c663
commit 025a5afa2d
4 changed files with 101 additions and 2 deletions

View File

@ -1,5 +1,10 @@
2000-07-25 Ulrich Drepper <drepper@redhat.com>
* rt/lio_listio.c (lio_listio): Always disable individual
notification.
* rt/Makefile: Add rules to build and run tst-aio2.
* rt/tst-aio2.c: New file.
* rt/lio_listio.c (lio_listio): Handle case of SIG == NULL correctly.
Reported by Kevin Beard <beardk@gatwick.Geco-Prakla.slb.com>.

View File

@ -40,7 +40,7 @@ include ../Makeconfig
ifeq ($(have-thread-library),yes)
tests := tst-aio tst-aio64 tst-clock tst-shm tst-timer
tests := tst-aio tst-aio64 tst-clock tst-shm tst-timer tst-aio2
extra-libs := librt
extra-libs-others := $(extra-libs)
@ -56,11 +56,13 @@ $(objpfx)librt.so: $(common-objpfx)libc.so $(shared-thread-library)
ifeq (yes,$(build-shared))
$(objpfx)tst-aio: $(objpfx)librt.so $(shared-thread-library)
$(objpfx)tst-aio2: $(objpfx)librt.so $(shared-thread-library)
$(objpfx)tst-aio64: $(objpfx)librt.so $(shared-thread-library)
$(objpfx)tst-clock: $(objpfx)librt.so $(shared-thread-library)
$(objpfx)tst-shm: $(objpfx)librt.so $(shared-thread-library)
else
$(objpfx)tst-aio: $(objpfx)librt.a $(static-thread-library)
$(objpfx)tst-aio2: $(objpfx)librt.a $(static-thread-library)
$(objpfx)tst-aio64: $(objpfx)librt.a $(static-thread-library)
$(objpfx)tst-clock: $(objpfx)librt.a $(static-thread-library)
$(objpfx)tst-shm: $(objpfx)librt.a $(static-thread-library)

View File

@ -1,5 +1,5 @@
/* Enqueue and list of read or write requests.
Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -42,6 +42,7 @@ lio_listio (mode, list, nent, sig)
int nent;
struct sigevent *sig;
{
struct sigevent defsigev;
struct requestlist *requests[nent];
int cnt;
volatile int total = 0;
@ -54,6 +55,12 @@ lio_listio (mode, list, nent, sig)
return -1;
}
if (sig == NULL)
{
defsigev.sigev_notify = SIGEV_NONE;
sig = &defsigev;
}
/* Request the mutex. */
pthread_mutex_lock (&__aio_requests_mutex);
@ -62,6 +69,7 @@ lio_listio (mode, list, nent, sig)
for (cnt = 0; cnt < nent; ++cnt)
if (list[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP)
{
list[cnt]->aio_sigevent.sigev_notify = SIGEV_NONE;
requests[cnt] = __aio_enqueue_request ((aiocb_union *) list[cnt],
list[cnt]->aio_lio_opcode);

84
rt/tst-aio2.c Normal file
View File

@ -0,0 +1,84 @@
/* Test for notification mechanism in lio_listio.
Copyright (C) 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 2000.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <aio.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int flag;
void
thrfct (sigval_t arg)
{
flag = 1;
}
int
do_test (int argc, char *argv[])
{
char name[] = "/tmp/aio2.XXXXXX";
int fd;
struct aiocb *arr[1];
struct aiocb cb;
static const char buf[] = "Hello World\n";
fd = mkstemp (name);
if (fd == -1)
{
printf ("cannot open temp name: %m\n");
return 1;
}
unlink (name);
arr[0] = &cb;
cb.aio_fildes = fd;
cb.aio_lio_opcode = LIO_WRITE;
cb.aio_reqprio = 0;
cb.aio_buf = (void *) buf;
cb.aio_nbytes = sizeof (buf) - 1;
cb.aio_sigevent.sigev_notify = SIGEV_THREAD;
cb.aio_sigevent.sigev_notify_function = thrfct;
cb.aio_sigevent.sigev_notify_attributes = NULL;
cb.aio_sigevent.sigev_value.sival_ptr = NULL;
if (lio_listio (LIO_WAIT, arr, 1, NULL) < 0)
{
printf ("lio_listio failed: %m\n");
return 1;
}
if (flag != 0)
{
puts ("thread created, should not have happened");
return 1;
}
puts ("all OK");
return 0;
}
#include "../test-skeleton.c"