1998-04-11 09:33  Ulrich Drepper  <drepper@cygnus.com>

	* Makeconfig (rtobjdir): New variable.
	(rpath-link): Add rtobjdir and thread directory, if available.

	* test-skeleton.c: Add support to remove temporary files.
	Always define test_dir.  Improve message about expected signal.

	* rt/Makefile (tests): Add tst-aio.
	Add rules for tst-aio to be linked with librt and thread library.
	* rt/aio_misc.c: Correct fundamental bugs.
	* rt/aio_suspend.c: Correct bug in test for available request.
	Initialize conditional variable.
	* rt/lio_listio.c: Initialize conditional variable.
	* rt/lio_listio64.c: Likewise.
	* rt/tst-aio.c: New file.

	* sysdeps/libm-ieee754/s_signgam.c: Undo last change.
	* sysdeps/libm-ieee754/w_gamma.c: Likewise.  Adopt for ISO C 9x.
	* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
	* sysdeps/libm-ieee754/w_gammal.c: Likewise.
	* sysdeps/libm-ieee754/w_lgamma.c: Likewise.
	* sysdeps/libm-ieee754/w_lgammaf.c: Likewise.
	* sysdeps/libm-ieee754/w_lgammal.c: Likewise.

1998-04-11 14:49  Mark Kettenis  <kettenis@landau.phys.uva.nl>

	* posix/regex.c [_LIBC] (__re_syntax_options): Initialize to 0.

	* elf/dl-load.c (open_path): Use correct name for test whether
	directory in load path exists.

	* sysdeps/libm-ieee754/s_expm1.c: Remove variable one.
	* sysdeps/libm-ieee754/e_pow.c: Fix typo.
	Patches by Tom Rini <trini@kernel.crashing.org>.

	* wcsmbs/wcstof_l.c: Declare ____wcstoull_l_internal.
	* wcsmbs/wcstod_l.c: Likewise.
	* wcsmbs/wcstold_l.c: Likewise.
This commit is contained in:
Ulrich Drepper 1998-04-11 09:51:01 +00:00
parent e7993f207c
commit b9337b6a58
25 changed files with 349 additions and 75 deletions

View File

@ -1,5 +1,45 @@
1998-04-11 09:33 Ulrich Drepper <drepper@cygnus.com>
* Makeconfig (rtobjdir): New variable.
(rpath-link): Add rtobjdir and thread directory, if available.
* test-skeleton.c: Add support to remove temporary files.
Always define test_dir. Improve message about expected signal.
* rt/Makefile (tests): Add tst-aio.
Add rules for tst-aio to be linked with librt and thread library.
* rt/aio_misc.c: Correct fundamental bugs.
* rt/aio_suspend.c: Correct bug in test for available request.
Initialize conditional variable.
* rt/lio_listio.c: Initialize conditional variable.
* rt/lio_listio64.c: Likewise.
* rt/tst-aio.c: New file.
* sysdeps/libm-ieee754/s_signgam.c: Undo last change.
* sysdeps/libm-ieee754/w_gamma.c: Likewise. Adopt for ISO C 9x.
* sysdeps/libm-ieee754/w_gammaf.c: Likewise.
* sysdeps/libm-ieee754/w_gammal.c: Likewise.
* sysdeps/libm-ieee754/w_lgamma.c: Likewise.
* sysdeps/libm-ieee754/w_lgammaf.c: Likewise.
* sysdeps/libm-ieee754/w_lgammal.c: Likewise.
1998-04-11 14:49 Mark Kettenis <kettenis@landau.phys.uva.nl>
* posix/regex.c [_LIBC] (__re_syntax_options): Initialize to 0.
1998-04-10 Ulrich Drepper <drepper@cygnus.com> 1998-04-10 Ulrich Drepper <drepper@cygnus.com>
* elf/dl-load.c (open_path): Use correct name for test whether
directory in load path exists.
* sysdeps/libm-ieee754/s_expm1.c: Remove variable one.
* sysdeps/libm-ieee754/e_pow.c: Fix typo.
Patches by Tom Rini <trini@kernel.crashing.org>.
* wcsmbs/wcstof_l.c: Declare ____wcstoull_l_internal.
* wcsmbs/wcstod_l.c: Likewise.
* wcsmbs/wcstold_l.c: Likewise.
* include/byteswap.h: New file. * include/byteswap.h: New file.
* malloc/mtrace.c (mtrace): Use smaller output buffer to reduce * malloc/mtrace.c (mtrace): Use smaller output buffer to reduce

View File

@ -413,12 +413,13 @@ else
default-rpath = $(libdir) default-rpath = $(libdir)
endif endif
# This is how to find at build-time things that will be installed there. # This is how to find at build-time things that will be installed there.
rpath-link = $(common-objdir):$(mathobjdir):$(elfobjdir):$(nssobjdir):$(nisobjdir):$(dbobjdir) rpath-link = $(common-objdir):$(mathobjdir):$(elfobjdir):$(nssobjdir):$(nisobjdir):$(dbobjdir):$(rtobjdir)
mathobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)math) mathobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)math)
elfobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)elf) elfobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)elf)
nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss) nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
nisobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nis) nisobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nis)
dbobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)db2) dbobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)db2)
rtobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)rt)
else else
link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
endif endif
@ -750,6 +751,7 @@ ifneq (,$(findstring linuxthreads,$(add-ons)))
shared-thread-library = $(common-objpfx)linuxthreads/libpthread.so shared-thread-library = $(common-objpfx)linuxthreads/libpthread.so
static-thread-library = $(common-objpfx)linuxthreads/libpthread.a static-thread-library = $(common-objpfx)linuxthreads/libpthread.a
have-thread-library = yes have-thread-library = yes
rpath-link := $(rpath-link):$(common-objpfx)linuxthreads
endif endif
endif # Makeconfig not yet included endif # Makeconfig not yet included

View File

@ -919,7 +919,8 @@ open_path (const char *name, size_t namelen, int preloaded,
test whether there is any directory at all. */ test whether there is any directory at all. */
struct stat st; struct stat st;
buf[this_dir->dirnamelen + capstr[cnt].len] = '\0'; buf[this_dir->dirnamelen
+ MAX (capstr[cnt].len - 1, 0)] = '\0';
if (__xstat (_STAT_VER, buf, &st) != 0 if (__xstat (_STAT_VER, buf, &st) != 0
|| ! S_ISDIR (st.st_mode)) || ! S_ISDIR (st.st_mode))

View File

@ -244,7 +244,7 @@ mtrace ()
if (mallstream != NULL) if (mallstream != NULL)
{ {
/* Be sure it doesn't malloc its buffer! */ /* Be sure it doesn't malloc its buffer! */
setvbuf (mallstream, malloc_trace_buffer, TRACE_BUFFER_SIZE); setbuffer (mallstream, malloc_trace_buffer, TRACE_BUFFER_SIZE);
fprintf (mallstream, "= Start\n"); fprintf (mallstream, "= Start\n");
tr_old_free_hook = __free_hook; tr_old_free_hook = __free_hook;
__free_hook = tr_freehook; __free_hook = tr_freehook;

View File

@ -200,8 +200,14 @@ enum
#ifdef __USE_MISC #ifdef __USE_MISC
/* Support for various different standard error handling behaviors. */ /* Support for various different standard error handling behaviors. */
typedef enum
typedef enum { _IEEE_ = -1, _SVID_, _XOPEN_, _POSIX_ } _LIB_VERSION_TYPE; {
_IEEE_ = -1, /* According to IEEE 754/IEEE 854. */
_SVID_, /* According to System V, release 4. */
_XOPEN_, /* Nowadays also Unix98. */
_POSIX_,
_ISOC_ /* Actually this is ISO C 9X. */
} _LIB_VERSION_TYPE;
/* This variable can be changed at run-time to any of the values above to /* This variable can be changed at run-time to any of the values above to
affect floating point error handling behavior (it may also be necessary affect floating point error handling behavior (it may also be necessary

View File

@ -966,13 +966,13 @@ printchar (c)
/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
also be assigned to arbitrarily: each pattern buffer stores its own also be assigned to arbitrarily: each pattern buffer stores its own
syntax, so it can be changed between regex compilations. */ syntax, so it can be changed between regex compilations. */
/* This has no initializer because initialized variables in Emacs
become read-only after dumping. */
#ifdef _LIBC #ifdef _LIBC
reg_syntax_t __re_syntax_options; reg_syntax_t __re_syntax_options = 0;
weak_alias (__re_syntax_options, re_syntax_options) weak_alias (__re_syntax_options, re_syntax_options)
# define re_syntax_options __re_syntax_options # define re_syntax_options __re_syntax_options
#else #else
/* This has no initializer because initialized variables in Emacs
become read-only after dumping. */
reg_syntax_t re_syntax_options; reg_syntax_t re_syntax_options;
#endif #endif

View File

@ -30,6 +30,8 @@ librt-routines := aio_cancel aio_error aio_fsync aio_misc aio_read \
librt-map := librt.map librt-map := librt.map
tests := tst-aio
# Make sure that everything is distributed independent of configuration. # Make sure that everything is distributed independent of configuration.
distribute := aio_misc.h $(librt-routines:=.c) $(librt-map) distribute := aio_misc.h $(librt-routines:=.c) $(librt-map)
@ -48,3 +50,5 @@ include ../Rules
# This ensures they will load libc.so for needed symbols if loaded by # This ensures they will load libc.so for needed symbols if loaded by
# a statically-linked program that hasn't already loaded it. # a statically-linked program that hasn't already loaded it.
$(objpfx)librt.so: $(common-objpfx)libc.so $(shared-thread-library) $(objpfx)librt.so: $(common-objpfx)libc.so $(shared-thread-library)
$(objpfx)tst-aio: $(objpfx)librt.so $(shared-thread-library)

View File

@ -1,5 +1,5 @@
/* Handle general operations. /* Handle general operations.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -27,7 +27,6 @@
#include "aio_misc.h" #include "aio_misc.h"
/* Pool of request list entries. */ /* Pool of request list entries. */
static struct requestlist **pool; static struct requestlist **pool;
@ -273,7 +272,7 @@ __aio_enqueue_request (aiocb_union *aiocbp, int operation)
/* The current file descriptor is worked on. It makes no sense /* The current file descriptor is worked on. It makes no sense
to start another thread since this new thread would fight to start another thread since this new thread would fight
with the running thread for the resources. But we also cannot with the running thread for the resources. But we also cannot
say that the thread processing this desriptor shall imeediately say that the thread processing this desriptor shall immediately
after finishing the current job process this request if there after finishing the current job process this request if there
are other threads in the running queue which have a higher are other threads in the running queue which have a higher
priority. */ priority. */
@ -392,14 +391,18 @@ handle_fildes_io (void *arg)
pthread_t self = pthread_self (); pthread_t self = pthread_self ();
struct sched_param param; struct sched_param param;
struct requestlist *runp = (struct requestlist *) arg; struct requestlist *runp = (struct requestlist *) arg;
aiocb_union *aiocbp = runp->aiocbp; aiocb_union *aiocbp;
int policy; int policy;
int fildes = runp->aiocbp->aiocb.aio_fildes; int fildes;
pthread_getschedparam (self, &policy, &param); pthread_getschedparam (self, &policy, &param);
do do
{ {
/* Update our variables. */
aiocbp = runp->aiocbp;
fildes = aiocbp->aiocb.aio_fildes;
/* Change the priority to the requested value (if necessary). */ /* Change the priority to the requested value (if necessary). */
if (aiocbp->aiocb.__abs_prio != param.sched_priority if (aiocbp->aiocb.__abs_prio != param.sched_priority
|| aiocbp->aiocb.__policy != policy) || aiocbp->aiocb.__policy != policy)
@ -467,8 +470,8 @@ handle_fildes_io (void *arg)
/* Now dequeue the current request. */ /* Now dequeue the current request. */
if (runp->next_prio == NULL) if (runp->next_prio == NULL)
{ {
/* No outstanding request for this descriptor. Process the /* No outstanding request for this descriptor. Remove this
runlist if necessary. */ descriptor from the list. */
if (runp->next_fd != NULL) if (runp->next_fd != NULL)
runp->next_fd->last_fd = runp->last_fd; runp->next_fd->last_fd = runp->last_fd;
if (runp->last_fd != NULL) if (runp->last_fd != NULL)
@ -488,15 +491,12 @@ handle_fildes_io (void *arg)
/* Free the old element. */ /* Free the old element. */
__aio_free_request (runp); __aio_free_request (runp);
runp = freelist; runp = runlist;
if (runp != NULL) if (runp != NULL)
{ {
/* We must not run requests which are not marked `running'. */ /* We must not run requests which are not marked `running'. */
if (runp->running == yes) if (runp->running == yes)
{ runlist = runp->next_run;
freelist = runp->next_run;
runp->running = allocated;
}
else else
{ {
struct requestlist *old; struct requestlist *old;
@ -516,6 +516,8 @@ handle_fildes_io (void *arg)
/* If no request to work on we will stop the thread. */ /* If no request to work on we will stop the thread. */
if (runp == NULL) if (runp == NULL)
--nthreads; --nthreads;
else
runp->running = allocated;
/* Release the mutex. */ /* Release the mutex. */
pthread_mutex_unlock (&__aio_requests_mutex); pthread_mutex_unlock (&__aio_requests_mutex);

View File

@ -1,5 +1,5 @@
/* Suspend until termination of a requests. /* Suspend until termination of a requests.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -40,24 +40,17 @@ aio_suspend (list, nent, timeout)
int nent; int nent;
const struct timespec *timeout; const struct timespec *timeout;
{ {
pthread_cond_t cond;
struct waitlist waitlist[nent]; struct waitlist waitlist[nent];
struct requestlist *requestlist[nent]; struct requestlist *requestlist[nent];
pthread_cond_t cond;
int cnt; int cnt;
int result = 0; int result = 0;
int dummy;
int none = 1;
/* Request the mutex. */ /* Request the mutex. */
pthread_mutex_lock (&__aio_requests_mutex); pthread_mutex_lock (&__aio_requests_mutex);
/* First look whether there is already a terminated request. */
for (cnt = 0; cnt < nent; ++cnt)
if (list[cnt] != NULL && list[cnt]->__error_code != EINPROGRESS)
break;
if (cnt == nent)
{
int oldstate;
/* There is not yet a finished request. Signal the request that /* There is not yet a finished request. Signal the request that
we are working for it. */ we are working for it. */
for (cnt = 0; cnt < nent; ++cnt) for (cnt = 0; cnt < nent; ++cnt)
@ -69,12 +62,21 @@ aio_suspend (list, nent, timeout)
{ {
waitlist[cnt].cond = &cond; waitlist[cnt].cond = &cond;
waitlist[cnt].next = requestlist[cnt]->waiting; waitlist[cnt].next = requestlist[cnt]->waiting;
waitlist[cnt].counterp = NULL; waitlist[cnt].counterp = &dummy;
waitlist[cnt].sigevp = NULL; waitlist[cnt].sigevp = NULL;
requestlist[cnt]->waiting = &waitlist[cnt]; requestlist[cnt]->waiting = &waitlist[cnt];
none = 0;
} }
} }
/* If there is a not finished request wait for it. */
if (!none)
{
int oldstate;
/* Initialize the conditional variable. */
pthread_cond_init (&cond, NULL);
/* Since `pthread_cond_wait'/`pthread_cond_timedwait' are cancelation /* Since `pthread_cond_wait'/`pthread_cond_timedwait' are cancelation
points we must be careful. We added entries to the waiting lists points we must be careful. We added entries to the waiting lists
which we must remove. So defer cancelation for now. */ which we must remove. So defer cancelation for now. */
@ -87,7 +89,7 @@ aio_suspend (list, nent, timeout)
timeout); timeout);
/* Now remove the entry in the waiting list for all requests /* Now remove the entry in the waiting list for all requests
which didn't terminate */ which didn't terminate. */
for (cnt = 0; cnt < nent; ++cnt) for (cnt = 0; cnt < nent; ++cnt)
if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS if (list[cnt] != NULL && list[cnt]->__error_code == EINPROGRESS
&& requestlist[cnt] != NULL) && requestlist[cnt] != NULL)
@ -107,6 +109,11 @@ aio_suspend (list, nent, timeout)
/* Now it's time to restore the cancelation state. */ /* Now it's time to restore the cancelation state. */
pthread_setcancelstate (oldstate, NULL); pthread_setcancelstate (oldstate, NULL);
/* Release the conditional variable. */
if (pthread_cond_destroy (&cond) != 0)
/* This must never happen. */
abort ();
if (result != 0) if (result != 0)
{ {
/* An error occurred. Possibly it's EINTR. We have to translate /* An error occurred. Possibly it's EINTR. We have to translate

View File

@ -1,5 +1,5 @@
/* Enqueue and list of read or write requests. /* Enqueue and list of read or write requests.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -86,6 +86,9 @@ lio_listio (mode, list, nent, sig)
struct waitlist waitlist[nent]; struct waitlist waitlist[nent];
int oldstate; int oldstate;
/* Initialize the conditional variable. */
pthread_cond_init (&cond, NULL);
total = 0; total = 0;
for (cnt = 0; cnt < nent; ++cnt) for (cnt = 0; cnt < nent; ++cnt)
if (list[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP if (list[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP
@ -110,6 +113,11 @@ lio_listio (mode, list, nent, sig)
/* Now it's time to restore the cancelation state. */ /* Now it's time to restore the cancelation state. */
pthread_setcancelstate (oldstate, NULL); pthread_setcancelstate (oldstate, NULL);
/* Release the conditional variable. */
if (pthread_cond_destroy (&cond) != 0)
/* This must never happen. */
abort ();
} }
else else
{ {

View File

@ -1,5 +1,5 @@
/* Enqueue and list of read or write requests, 64bit offset version. /* Enqueue and list of read or write requests, 64bit offset version.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -86,6 +86,9 @@ lio_listio64 (mode, list, nent, sig)
struct waitlist waitlist[nent]; struct waitlist waitlist[nent];
int oldstate; int oldstate;
/* Initialize the conditional variable. */
pthread_cond_init (&cond, NULL);
total = 0; total = 0;
for (cnt = 0; cnt < nent; ++cnt) for (cnt = 0; cnt < nent; ++cnt)
if (list[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP if (list[cnt] != NULL && list[cnt]->aio_lio_opcode != LIO_NOP
@ -109,6 +112,11 @@ lio_listio64 (mode, list, nent, sig)
/* Now it's time to restore the cancelation state. */ /* Now it's time to restore the cancelation state. */
pthread_setcancelstate (oldstate, NULL); pthread_setcancelstate (oldstate, NULL);
/* Release the conditional variable. */
if (pthread_cond_destroy (&cond) != 0)
/* This must never happen. */
abort ();
} }
else else
{ {

142
rt/tst-aio.c Normal file
View File

@ -0,0 +1,142 @@
/* Tests for AIO in librt.
Copyright (C) 1998 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
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 <errno.h>
#include <error.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
/* prototype for our test function. */
extern int do_test (int argc, char *argv[]);
/* We might need a bit longer timeout. */
#define TIMEOUT 20 /* sec */
/* This defines the `main' function and some more. */
#include <test-skeleton.c>
int
test_file (const void *buf, size_t size, int fd, const char *msg)
{
struct stat st;
char tmp[size];
errno = 0;
if (fstat (fd, &st) < 0)
{
error (0, errno, "%s: failed stat", msg);
return 1;
}
if (st.st_size != size)
{
error (0, errno, "%s: wrong size: %lu, should be %lu",
msg, (unsigned long int) st.st_size, (unsigned long int) size);
return 1;
}
if (pread (fd, tmp, size, 0) != size)
{
error (0, errno, "%s: failed stat", msg);
return 1;
}
if (memcmp (buf, tmp, size) != 0)
{
error (0, errno, "%s: failed comparison", msg);
return 1;
}
if (ftruncate (fd, 0) < 0)
{
error (0, errno, "%s: failed truncate", msg);
return 1;
}
return 0;
}
int
do_test (int argc, char *argv[])
{
char *name;
char name_len;
struct aiocb cbs[10];
struct aiocb *cbp[10];
char buf[1000];
size_t cnt;
int fd;
int result = 0;
int go_on;
name_len = strlen (test_dir);
name = malloc (name_len + sizeof ("/aioXXXXXX"));
mempcpy (mempcpy (name, test_dir, name_len),
"/aioXXXXXX", sizeof ("/aioXXXXXX"));
add_temp_file (name);
/* Open our test file. */
fd = mkstemp (name);
if (fd == -1)
error (EXIT_FAILURE, errno, "cannot open test file `%s'", name);
/* Preparation. */
for (cnt = 0; cnt < 10; ++cnt)
{
cbs[cnt].aio_fildes = fd;
cbs[cnt].aio_reqprio = 0;
cbs[cnt].aio_buf = memset (&buf[cnt * 100], '0' + cnt, 100);
cbs[cnt].aio_nbytes = 100;
cbs[cnt].aio_offset = cnt * 100;
cbs[cnt].aio_sigevent.sigev_notify = SIGEV_NONE;
cbp[cnt] = &cbs[cnt];
}
/* First a simple test. */
for (cnt = 10; cnt > 0; )
aio_write (cbp[--cnt]);
/* Wait 'til the results are there. */
do
{
aio_suspend ((const struct aiocb *const *) cbp, 10, NULL);
go_on = 0;
for (cnt = 0; cnt < 10; ++cnt)
if (cbp[cnt] != NULL && aio_error (cbp[cnt]) == EINPROGRESS)
go_on = 1;
else
{
if (cbp[cnt] != NULL)
printf ("request %d finished\n", cnt);
cbp[cnt] = NULL;
}
}
while (go_on);
/* Test this. */
result |= test_file (buf, sizeof (buf), fd, "aio_write");
return result;
}

View File

@ -266,7 +266,7 @@ C[] = {
r2 = C[8]+s2*C[9]; s24=s22*s22; r2 = C[8]+s2*C[9]; s24=s22*s22;
r3 = C[6]+s2*C[7]; s26=s24*s22; r3 = C[6]+s2*C[7]; s26=s24*s22;
r = r3*s22 + r2*s24 + r1*s26; r = r3*s22 + r2*s24 + r1*s26;
#endfi #endif
r += s_l*(s_h+s); r += s_l*(s_h+s);
s2 = s_h*s_h; s2 = s_h*s_h;
t_h = 3.0+s2+r; t_h = 3.0+s2+r;

View File

@ -120,7 +120,6 @@ static const double
#else #else
static double static double
#endif #endif
one = 1.0,
huge = 1.0e+300, huge = 1.0e+300,
tiny = 1.0e-300, tiny = 1.0e-300,
o_threshold = 7.09782712893383973096e+02,/* 0x40862E42, 0xFEFA39EF */ o_threshold = 7.09782712893383973096e+02,/* 0x40862E42, 0xFEFA39EF */

View File

@ -1,4 +1,3 @@
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
int __signgam = 0; int signgam;
weak_alias (__signgam, signgam)

View File

@ -22,8 +22,6 @@ static char rcsid[] = "$NetBSD: w_gamma.c,v 1.7 1995/11/20 22:06:43 jtc Exp $";
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int __signgam;
#ifdef __STDC__ #ifdef __STDC__
double __gamma(double x) double __gamma(double x)
#else #else
@ -34,7 +32,7 @@ extern int __signgam;
double y; double y;
#ifndef _IEEE_LIBM #ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
y = __ieee754_lgamma_r(x,&__signgam); y = __ieee754_lgamma_r(x,&signgam);
else else
{ {
#endif #endif

View File

@ -20,8 +20,6 @@ static char rcsid[] = "$NetBSD: w_gammaf.c,v 1.4 1995/11/20 22:06:48 jtc Exp $";
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int __signgam;
#ifdef __STDC__ #ifdef __STDC__
float __gammaf(float x) float __gammaf(float x)
#else #else
@ -32,7 +30,7 @@ extern int __signgam;
float y; float y;
#ifndef _IEEE_LIBM #ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
y = __ieee754_lgammaf_r(x,&__signgam); y = __ieee754_lgammaf_r(x,&signgam);
else else
{ {
#endif #endif

View File

@ -25,8 +25,6 @@ static char rcsid[] = "$NetBSD: $";
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int __signgam;
#ifdef __STDC__ #ifdef __STDC__
long double __gammal(long double x) long double __gammal(long double x)
#else #else
@ -37,7 +35,7 @@ extern int __signgam;
long double y; long double y;
#ifndef _IEEE_LIBM #ifndef _IEEE_LIBM
if (_LIB_VERSION == _SVID_) if (_LIB_VERSION == _SVID_)
y = __ieee754_lgammal_r(x,&__signgam); y = __ieee754_lgammal_r(x,&signgam);
else else
{ {
#endif #endif

View File

@ -23,8 +23,6 @@ static char rcsid[] = "$NetBSD: w_lgamma.c,v 1.6 1995/05/10 20:49:24 jtc Exp $";
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int __signgam;
#ifdef __STDC__ #ifdef __STDC__
double __lgamma(double x) double __lgamma(double x)
#else #else
@ -33,10 +31,14 @@ extern int __signgam;
#endif #endif
{ {
#ifdef _IEEE_LIBM #ifdef _IEEE_LIBM
return __ieee754_lgamma_r(x,&__signgam); return __ieee754_lgamma_r(x,&signgam);
#else #else
double y; double y;
y = __ieee754_lgamma_r(x,&__signgam); int local_signgam;
y = __ieee754_lgamma_r(x,&local_signgam);
if (_LIB_VERSION != _ISOC_)
/* ISO C 9x does not define the global variable. */
signgam = local_signgam;
if(_LIB_VERSION == _IEEE_) return y; if(_LIB_VERSION == _IEEE_) return y;
if(!__finite(y)&&__finite(x)) { if(!__finite(y)&&__finite(x)) {
if(__floor(x)==x&&x<=0.0) if(__floor(x)==x&&x<=0.0)

View File

@ -20,8 +20,6 @@ static char rcsid[] = "$NetBSD: w_lgammaf.c,v 1.3 1995/05/10 20:49:30 jtc Exp $"
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int __signgam;
#ifdef __STDC__ #ifdef __STDC__
float __lgammaf(float x) float __lgammaf(float x)
#else #else
@ -30,10 +28,14 @@ extern int __signgam;
#endif #endif
{ {
#ifdef _IEEE_LIBM #ifdef _IEEE_LIBM
return __ieee754_lgammaf_r(x,&__signgam); return __ieee754_lgammaf_r(x,&signgam);
#else #else
float y; float y;
y = __ieee754_lgammaf_r(x,&__signgam); int local_signgam;
y = __ieee754_lgammaf_r(x,&local_signgam);
if (_LIB_VERSION != _ISOC_)
/* ISO C 9x does not define the global variable. */
signgam = local_signgam;
if(_LIB_VERSION == _IEEE_) return y; if(_LIB_VERSION == _IEEE_) return y;
if(!__finitef(y)&&__finitef(x)) { if(!__finitef(y)&&__finitef(x)) {
if(__floorf(x)==x&&x<=(float)0.0) if(__floorf(x)==x&&x<=(float)0.0)

View File

@ -27,8 +27,6 @@ static char rcsid[] = "$NetBSD: $";
#include "math.h" #include "math.h"
#include "math_private.h" #include "math_private.h"
extern int __signgam;
#ifdef __STDC__ #ifdef __STDC__
long double __lgammal(long double x) long double __lgammal(long double x)
#else #else
@ -37,10 +35,14 @@ extern int __signgam;
#endif #endif
{ {
#ifdef _IEEE_LIBM #ifdef _IEEE_LIBM
return __ieee754_lgammal_r(x,&__signgam); return __ieee754_lgammal_r(x,&signgam);
#else #else
long double y; long double y;
y = __ieee754_lgammal_r(x,&__signgam); int local_signgam;
y = __ieee754_lgammal_r(x,&local_signgam);
if (_LIB_VERSION != _ISOC_)
/* ISO C 9x does not define the global variable. */
signgam = local_signgam;
if(_LIB_VERSION == _IEEE_) return y; if(_LIB_VERSION == _IEEE_) return y;
if(!__finitel(y)&&__finitel(x)) { if(!__finitel(y)&&__finitel(x)) {
if(__floorl(x)==x&&x<=0.0) if(__floorl(x)==x&&x<=0.0)

View File

@ -18,6 +18,7 @@
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <getopt.h> #include <getopt.h>
#include <search.h>
#include <signal.h> #include <signal.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -52,6 +53,39 @@ static int pid;
/* Directory to place temporary files in. */ /* Directory to place temporary files in. */
static const char *test_dir; static const char *test_dir;
/* List of temporary files. */
struct name_list
{
struct qelem q;
const char *name;
} *name_list;
/* Add temporary files in list. */
void
add_temp_file (const char *name)
{
struct name_list *newp = (struct name_list *) calloc (sizeof (*newp), 1);
if (newp != NULL)
{
newp->name = name;
if (name_list == NULL)
name_list = (struct name_list *) &newp->q;
else
insque (newp, name_list);
}
}
/* Delete all temporary files. */
void
delete_temp_files (void)
{
while (name_list != NULL)
{
remove (name_list->name);
name_list = (struct name_list *) name_list->q.q_forw;
}
}
/* Timeout handler. We kill the child and exit with an error. */ /* Timeout handler. We kill the child and exit with an error. */
void void
timeout_handler (int sig __attribute__ ((unused))) timeout_handler (int sig __attribute__ ((unused)))
@ -114,11 +148,20 @@ main (int argc, char *argv[])
exit (1); exit (1);
} }
} }
else
{
test_dir = getenv ("TMPDIR");
if (test_dir == NULL || test_dir[0] == '\0')
test_dir = "/tmp";
}
/* If we are not expected to fork run the function immediately. */ /* If we are not expected to fork run the function immediately. */
if (direct) if (direct)
return TEST_FUNCTION; return TEST_FUNCTION;
/* make sure temporary files are deleted. */
atexit (delete_temp_files);
/* Set up the test environment: /* Set up the test environment:
- prevent core dumps - prevent core dumps
- set up the timer - set up the timer
@ -166,8 +209,12 @@ main (int argc, char *argv[])
#endif #endif
if (WTERMSIG (status) != EXPECTED_SIGNAL) if (WTERMSIG (status) != EXPECTED_SIGNAL)
{ {
if (EXPECTED_SIGNAL != 0)
fprintf (stderr, "Incorrect signal from child: got `%s', need `%s'\n", fprintf (stderr, "Incorrect signal from child: got `%s', need `%s'\n",
strsignal (WTERMSIG (status)), strsignal (EXPECTED_SIGNAL)); strsignal (WTERMSIG (status)), strsignal (EXPECTED_SIGNAL));
else
fprintf (stderr, "Incorrect signal from child: got `%s'\n",
strsignal (WTERMSIG (status)));
exit (1); exit (1);
} }

View File

@ -1,5 +1,5 @@
/* Convert string representing a number to integer value, using given locale. /* Convert string representing a number to integer value, using given locale.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -26,5 +26,8 @@
extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int, extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int,
__locale_t); __locale_t);
extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
wchar_t **, int, int,
__locale_t);
#include <wcstod.c> #include <wcstod.c>

View File

@ -1,5 +1,5 @@
/* Convert string representing a number to integer value, using given locale. /* Convert string representing a number to integer value, using given locale.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -26,5 +26,8 @@
extern float ____wcstof_l_internal (const wchar_t *, wchar_t **, int, extern float ____wcstof_l_internal (const wchar_t *, wchar_t **, int,
__locale_t); __locale_t);
extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
wchar_t **, int, int,
__locale_t);
#include <wcstof.c> #include <wcstof.c>

View File

@ -1,5 +1,5 @@
/* Convert string representing a number to integer value, using given locale. /* Convert string representing a number to integer value, using given locale.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -26,5 +26,8 @@
extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int, extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int,
__locale_t); __locale_t);
extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
wchar_t **, int, int,
__locale_t);
#include <wcstold.c> #include <wcstold.c>