mirror of
git://sourceware.org/git/glibc.git
synced 2025-04-18 14:30:43 +08:00
Updated to fedora-glibc-20060810T0627
This commit is contained in:
parent
503d6a9585
commit
2569265466
37
ChangeLog
37
ChangeLog
@ -1,3 +1,38 @@
|
||||
2006-08-09 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* malloc/memusagestat.c: Silence warnings.
|
||||
|
||||
* malloc/malloc.c: Dynamically size mmap treshold if the program
|
||||
frees mmaped blocks.
|
||||
Patch by Valerie Henson and Arjan van de Ven.
|
||||
|
||||
2006-08-08 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/ia64/bits/fcntl.h (O_DIRECT): Protect with
|
||||
__USE_GNU.
|
||||
|
||||
* stdlib/strtol_l.c (__strtol_ul_max_tab, __strtol_ul_rem_tab,
|
||||
__strtol_ull_max_tab, __strtol_ull_rem_tab): Declare.
|
||||
(DEF): Don't put the var into .gnu.linkonce.r.* section.
|
||||
Only provide var definitions in strtol_l (or for *ull*
|
||||
in strtoll_l).
|
||||
|
||||
* stdio-common/bug16.c (tests): New array.
|
||||
(do_tests): Allow the first hexadecimal digit
|
||||
to be 1, 2, 4 or 8. Do 3 additional tests.
|
||||
|
||||
* sysdeps/s390/fpu/libm-test-ulps: Update.
|
||||
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c (fchownat): Use
|
||||
fchownat syscall if available.
|
||||
* sysdeps/unix/sysv/linux/powerpc/fchownat.c (fchownat): Likewise.
|
||||
* sysdeps/unix/sysv/linux/sh/fchownat.c (fchownat): Likewise.
|
||||
* sysdeps/unix/sysv/linux/i386/fchownat.c (fchownat): Likewise.
|
||||
|
||||
2006-08-07 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* nis/nis_xdr.c: Avoid some function calls.
|
||||
|
||||
2006-08-07 Jakub Jelinek <jakub@redhat.com>
|
||||
Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
@ -7,7 +42,7 @@
|
||||
2006-08-07 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* nis/nis_call.c: Minor cleanups throughout.
|
||||
(rec_dirsearch) [HIGHER_NAME]: Correctly size ndomain array.
|
||||
(rec_dirsearch) [case HIGHER_NAME]: Correctly size ndomain array.
|
||||
(first_shoot): Add search_parent_first parameter. Only if it is set
|
||||
search parent server first.
|
||||
If directory for table found through cold start cache is not the same
|
||||
|
@ -3,5 +3,5 @@ glibc-branch := fedora
|
||||
glibc-base := HEAD
|
||||
DIST_BRANCH := devel
|
||||
COLLECTION := dist-fc4
|
||||
fedora-sync-date := 2006-08-07 18:59 UTC
|
||||
fedora-sync-tag := fedora-glibc-20060807T1859
|
||||
fedora-sync-date := 2006-08-10 06:27 UTC
|
||||
fedora-sync-tag := fedora-glibc-20060810T0627
|
||||
|
@ -1,4 +1,4 @@
|
||||
%define glibcrelease 18
|
||||
%define glibcrelease 19
|
||||
%define auxarches i586 i686 athlon sparcv9 alphaev6
|
||||
%define xenarches i686 athlon
|
||||
%ifarch %{xenarches}
|
||||
@ -1438,6 +1438,12 @@ rm -f *.filelist*
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Thu Aug 10 2006 Jakub Jelinek <jakub@redhat.com> 2.4.90-19
|
||||
- adaptive malloc brk/mmap threshold
|
||||
- fix fchownat to use kernel syscall (if available) on many arches (#201870)
|
||||
- only define O_DIRECT with -D_GNU_SOURCE on ia64 to match all
|
||||
other arches (#201748)
|
||||
|
||||
* Mon Aug 7 2006 Jakub Jelinek <jakub@redhat.com> 2.4.90-18
|
||||
- NIS+ fixes
|
||||
- fix memusage and xtrace scripts (#200736)
|
||||
|
@ -1414,6 +1414,19 @@ int __posix_memalign(void **, size_t, size_t);
|
||||
#define DEFAULT_TOP_PAD (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
|
||||
adjusted MMAP_THRESHOLD.
|
||||
*/
|
||||
|
||||
#ifndef DEFAULT_MMAP_THRESHOLD_MIN
|
||||
#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
|
||||
#endif
|
||||
|
||||
#ifndef DEFAULT_MMAP_THRESHOLD_MAX
|
||||
#define DEFAULT_MMAP_THRESHOLD_MAX (8 * 1024 * 1024 * sizeof(long))
|
||||
#endif
|
||||
|
||||
/*
|
||||
M_MMAP_THRESHOLD is the request size threshold for using mmap()
|
||||
to service a request. Requests of at least this size that cannot
|
||||
@ -1453,12 +1466,63 @@ int __posix_memalign(void **, size_t, size_t);
|
||||
"large" chunks, but the value of "large" varies across systems. The
|
||||
default is an empirically derived value that works well in most
|
||||
systems.
|
||||
|
||||
|
||||
Update in 2006:
|
||||
The above was written in 2001. Since then the world has changed a lot.
|
||||
Memory got bigger. Applications got bigger. The virtual address space
|
||||
layout in 32 bit linux changed.
|
||||
|
||||
In the new situation, brk() and mmap space is shared and there are no
|
||||
artificial limits on brk size imposed by the kernel. What is more,
|
||||
applications have started using transient allocations larger than the
|
||||
128Kb as was imagined in 2001.
|
||||
|
||||
The price for mmap is also high now; each time glibc mmaps from the
|
||||
kernel, the kernel is forced to zero out the memory it gives to the
|
||||
application. Zeroing memory is expensive and eats a lot of cache and
|
||||
memory bandwidth. This has nothing to do with the efficiency of the
|
||||
virtual memory system, by doing mmap the kernel just has no choice but
|
||||
to zero.
|
||||
|
||||
In 2001, the kernel had a maximum size for brk() which was about 800
|
||||
megabytes on 32 bit x86, at that point brk() would hit the first
|
||||
mmaped shared libaries and couldn't expand anymore. With current 2.6
|
||||
kernels, the VA space layout is different and brk() and mmap
|
||||
both can span the entire heap at will.
|
||||
|
||||
Rather than using a static threshold for the brk/mmap tradeoff,
|
||||
we are now using a simple dynamic one. The goal is still to avoid
|
||||
fragmentation. The old goals we kept are
|
||||
1) try to get the long lived large allocations to use mmap()
|
||||
2) really large allocations should always use mmap()
|
||||
and we're adding now:
|
||||
3) transient allocations should use brk() to avoid forcing the kernel
|
||||
having to zero memory over and over again
|
||||
|
||||
The implementation works with a sliding threshold, which is by default
|
||||
limited to go between 128Kb and 32Mb (64Mb for 64 bitmachines) and starts
|
||||
out at 128Kb as per the 2001 default.
|
||||
|
||||
This allows us to satisfy requirement 1) under the assumption that long
|
||||
lived allocations are made early in the process' lifespan, before it has
|
||||
started doing dynamic allocations of the same size (which will
|
||||
increase the threshold).
|
||||
|
||||
The upperbound on the threshold satisfies requirement 2)
|
||||
|
||||
The threshold goes up in value when the application frees memory that was
|
||||
allocated with the mmap allocator. The idea is that once the application
|
||||
starts freeing memory of a certain size, it's highly probable that this is
|
||||
a size the application uses for transient allocations. This estimator
|
||||
is there to satisfy the new third requirement.
|
||||
|
||||
*/
|
||||
|
||||
#define M_MMAP_THRESHOLD -3
|
||||
|
||||
#ifndef DEFAULT_MMAP_THRESHOLD
|
||||
#define DEFAULT_MMAP_THRESHOLD (128 * 1024)
|
||||
#define DEFAULT_MMAP_THRESHOLD DEFAULT_MMAP_THRESHOLD_MIN
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -2251,6 +2315,10 @@ struct malloc_par {
|
||||
int n_mmaps;
|
||||
int n_mmaps_max;
|
||||
int max_n_mmaps;
|
||||
/* the mmap_threshold is dynamic, until the user sets
|
||||
it manually, at which point we need to disable any
|
||||
dynamic behavior. */
|
||||
int no_dyn_threshold;
|
||||
|
||||
/* Cache malloc_getpagesize */
|
||||
unsigned int pagesize;
|
||||
@ -3428,6 +3496,14 @@ public_fREe(Void_t* mem)
|
||||
#if HAVE_MMAP
|
||||
if (chunk_is_mmapped(p)) /* release mmapped memory. */
|
||||
{
|
||||
/* see if the dynamic brk/mmap threshold needs adjusting */
|
||||
if (!mp_.no_dyn_threshold
|
||||
&& p->size > mp_.mmap_threshold
|
||||
&& p->size <= DEFAULT_MMAP_THRESHOLD_MAX)
|
||||
{
|
||||
mp_.mmap_threshold = chunksize (p);
|
||||
mp_.trim_threshold = 2 * mp_.mmap_threshold;
|
||||
}
|
||||
munmap_chunk(p);
|
||||
return;
|
||||
}
|
||||
@ -5418,10 +5494,12 @@ int mALLOPt(param_number, value) int param_number; int value;
|
||||
|
||||
case M_TRIM_THRESHOLD:
|
||||
mp_.trim_threshold = value;
|
||||
mp_.no_dyn_threshold = 1;
|
||||
break;
|
||||
|
||||
case M_TOP_PAD:
|
||||
mp_.top_pad = value;
|
||||
mp_.no_dyn_threshold = 1;
|
||||
break;
|
||||
|
||||
case M_MMAP_THRESHOLD:
|
||||
@ -5432,6 +5510,7 @@ int mALLOPt(param_number, value) int param_number; int value;
|
||||
else
|
||||
#endif
|
||||
mp_.mmap_threshold = value;
|
||||
mp_.no_dyn_threshold = 1;
|
||||
break;
|
||||
|
||||
case M_MMAP_MAX:
|
||||
@ -5441,6 +5520,7 @@ int mALLOPt(param_number, value) int param_number; int value;
|
||||
else
|
||||
#endif
|
||||
mp_.n_mmaps_max = value;
|
||||
mp_.no_dyn_threshold = 1;
|
||||
break;
|
||||
|
||||
case M_CHECK_ACTION:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Generate graphic from memory profiling data.
|
||||
Copyright (C) 1998, 1999, 2000, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 1998, 1999, 2000, 2005, 2006 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
@ -277,16 +277,16 @@ main (int argc, char *argv[])
|
||||
|
||||
gdImageString (im_out, gdFontSmall, 38, ysize - 14, (unsigned char *) "0",
|
||||
blue);
|
||||
snprintf(buf, sizeof (buf), heap_format, 0);
|
||||
snprintf (buf, sizeof (buf), heap_format, 0);
|
||||
gdImageString (im_out, gdFontSmall, maxsize_heap < 1024 ? 32 : 26,
|
||||
ysize - 26, buf, red);
|
||||
snprintf(buf, sizeof (buf), stack_format, 0);
|
||||
ysize - 26, (unsigned char *) buf, red);
|
||||
snprintf (buf, sizeof (buf), stack_format, 0);
|
||||
gdImageString (im_out, gdFontSmall, xsize - 37, ysize - 26,
|
||||
buf, green);
|
||||
(unsigned char *) buf, green);
|
||||
|
||||
if (string != NULL)
|
||||
gdImageString (im_out, gdFontLarge, (xsize - strlen (string) * 8) / 2,
|
||||
2, (char *) string, green);
|
||||
2, (unsigned char *) string, green);
|
||||
|
||||
gdImageStringUp (im_out, gdFontSmall, 1, ysize / 2 - 10,
|
||||
(unsigned char *) "allocated", red);
|
||||
@ -299,9 +299,11 @@ main (int argc, char *argv[])
|
||||
(unsigned char *) "stack", green);
|
||||
|
||||
snprintf (buf, sizeof (buf), heap_format, maxsize_heap / heap_scale);
|
||||
gdImageString (im_out, gdFontSmall, 39 - strlen (buf) * 6, 14, buf, red);
|
||||
gdImageString (im_out, gdFontSmall, 39 - strlen (buf) * 6, 14,
|
||||
(unsigned char *) buf, red);
|
||||
snprintf (buf, sizeof (buf), stack_format, maxsize_stack / stack_scale);
|
||||
gdImageString (im_out, gdFontSmall, xsize - 37, 14, buf, green);
|
||||
gdImageString (im_out, gdFontSmall, xsize - 37, 14,
|
||||
(unsigned char *) buf, green);
|
||||
|
||||
for (line = 1; line <= 3; ++line)
|
||||
{
|
||||
@ -312,7 +314,7 @@ main (int argc, char *argv[])
|
||||
snprintf (buf, sizeof (buf), heap_format, maxsize_heap / 4 * line /
|
||||
heap_scale);
|
||||
gdImageString (im_out, gdFontSmall, 39 - strlen (buf) * 6,
|
||||
ysize - 26 - cnt, buf, red);
|
||||
ysize - 26 - cnt, (unsigned char *) buf, red);
|
||||
|
||||
cnt2 = ((ysize - 40) * (maxsize_stack / 4 * line / stack_scale)) /
|
||||
(maxsize_stack / stack_scale);
|
||||
@ -322,11 +324,12 @@ main (int argc, char *argv[])
|
||||
snprintf (buf, sizeof (buf), stack_format, maxsize_stack / 4 * line /
|
||||
stack_scale);
|
||||
gdImageString (im_out, gdFontSmall, xsize - 37, ysize - 26 - cnt2,
|
||||
buf, green);
|
||||
(unsigned char *) buf, green);
|
||||
}
|
||||
|
||||
snprintf (buf, sizeof (buf), "%llu", (unsigned long long) total);
|
||||
gdImageString (im_out, gdFontSmall, xsize - 50, ysize - 14, buf, blue);
|
||||
gdImageString (im_out, gdFontSmall, xsize - 50, ysize - 14,
|
||||
(unsigned char *) buf, blue);
|
||||
|
||||
if (!time_based)
|
||||
{
|
||||
|
@ -35,10 +35,16 @@ xdr_nis_attr (XDR *xdrs, nis_attr *objp)
|
||||
return res;
|
||||
}
|
||||
|
||||
static __always_inline bool_t
|
||||
xdr_nis_name (XDR *xdrs, nis_name *objp)
|
||||
{
|
||||
return xdr_string (xdrs, objp, ~0);
|
||||
}
|
||||
|
||||
bool_t
|
||||
_xdr_nis_name (XDR *xdrs, nis_name *objp)
|
||||
{
|
||||
return xdr_string (xdrs, objp, ~0);
|
||||
return xdr_nis_name (xdrs, objp);
|
||||
}
|
||||
|
||||
static __always_inline bool_t
|
||||
@ -78,7 +84,7 @@ xdr_endpoint (XDR *xdrs, endpoint *objp)
|
||||
bool_t
|
||||
_xdr_nis_server (XDR *xdrs, nis_server *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_name (xdrs, &objp->name);
|
||||
bool_t res = xdr_nis_name (xdrs, &objp->name);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = xdr_array (xdrs, (char **) &objp->ep.ep_val, &objp->ep.ep_len,
|
||||
@ -96,7 +102,7 @@ _xdr_nis_server (XDR *xdrs, nis_server *objp)
|
||||
bool_t
|
||||
_xdr_directory_obj (XDR *xdrs, directory_obj *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_name (xdrs, &objp->do_name);
|
||||
bool_t res = xdr_nis_name (xdrs, &objp->do_name);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = xdr_nstype (xdrs, &objp->do_type);
|
||||
@ -161,7 +167,7 @@ xdr_link_obj (XDR *xdrs, link_obj *objp)
|
||||
&objp->li_attrs.li_attrs_len, ~0,
|
||||
sizeof (nis_attr), (xdrproc_t) xdr_nis_attr);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
res = _xdr_nis_name (xdrs, &objp->li_name);
|
||||
res = xdr_nis_name (xdrs, &objp->li_name);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@ -245,16 +251,16 @@ _xdr_nis_object (XDR *xdrs, nis_object *objp)
|
||||
bool_t res = xdr_nis_oid (xdrs, &objp->zo_oid);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = _xdr_nis_name (xdrs, &objp->zo_name);
|
||||
res = xdr_nis_name (xdrs, &objp->zo_name);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = _xdr_nis_name (xdrs, &objp->zo_owner);
|
||||
res = xdr_nis_name (xdrs, &objp->zo_owner);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = _xdr_nis_name (xdrs, &objp->zo_group);
|
||||
res = xdr_nis_name (xdrs, &objp->zo_group);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = _xdr_nis_name (xdrs, &objp->zo_domain);
|
||||
res = xdr_nis_name (xdrs, &objp->zo_domain);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = xdr_u_int (xdrs, &objp->zo_access);
|
||||
@ -272,16 +278,22 @@ _xdr_nis_object (XDR *xdrs, nis_object *objp)
|
||||
return res;
|
||||
}
|
||||
|
||||
bool_t
|
||||
_xdr_nis_error (XDR *xdrs, nis_error *objp)
|
||||
static __always_inline bool_t
|
||||
xdr_nis_error (XDR *xdrs, nis_error *objp)
|
||||
{
|
||||
return xdr_enum (xdrs, (enum_t *) objp);
|
||||
}
|
||||
|
||||
bool_t
|
||||
_xdr_nis_error (XDR *xdrs, nis_error *objp)
|
||||
{
|
||||
return xdr_nis_error (xdrs, objp);
|
||||
}
|
||||
|
||||
bool_t
|
||||
_xdr_nis_result (XDR *xdrs, nis_result *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_error (xdrs, &objp->status);
|
||||
bool_t res = xdr_nis_error (xdrs, &objp->status);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = xdr_array (xdrs, (char **) &objp->objects.objects_val,
|
||||
@ -313,7 +325,7 @@ libnsl_hidden_def (_xdr_nis_result)
|
||||
bool_t
|
||||
_xdr_ns_request (XDR *xdrs, ns_request *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_name (xdrs, &objp->ns_name);
|
||||
bool_t res = xdr_nis_name (xdrs, &objp->ns_name);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
res = xdr_array (xdrs, (char **) &objp->ns_object.ns_object_val,
|
||||
&objp->ns_object.ns_object_len, 1,
|
||||
@ -324,7 +336,7 @@ _xdr_ns_request (XDR *xdrs, ns_request *objp)
|
||||
bool_t
|
||||
_xdr_ib_request (XDR *xdrs, ib_request *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_name (xdrs, &objp->ibr_name);
|
||||
bool_t res = xdr_nis_name (xdrs, &objp->ibr_name);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = xdr_array (xdrs, (char **) &objp->ibr_srch.ibr_srch_val,
|
||||
@ -363,7 +375,7 @@ libnsl_hidden_def (_xdr_ib_request)
|
||||
bool_t
|
||||
_xdr_ping_args (XDR *xdrs, ping_args *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_name (xdrs, &objp->dir);
|
||||
bool_t res = xdr_nis_name (xdrs, &objp->dir);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
res = xdr_uint32_t (xdrs, &objp->stamp);
|
||||
return res;
|
||||
@ -372,7 +384,7 @@ _xdr_ping_args (XDR *xdrs, ping_args *objp)
|
||||
bool_t
|
||||
_xdr_cp_result (XDR *xdrs, cp_result *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_error (xdrs, &objp->cp_status);
|
||||
bool_t res = xdr_nis_error (xdrs, &objp->cp_status);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = xdr_uint32_t (xdrs, &objp->cp_zticks);
|
||||
@ -402,19 +414,19 @@ _xdr_nis_taglist (XDR *xdrs, nis_taglist *objp)
|
||||
bool_t
|
||||
_xdr_fd_args (XDR *xdrs, fd_args *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_name (xdrs, &objp->dir_name);
|
||||
bool_t res = xdr_nis_name (xdrs, &objp->dir_name);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
res = _xdr_nis_name (xdrs, &objp->requester);
|
||||
res = xdr_nis_name (xdrs, &objp->requester);
|
||||
return res;
|
||||
}
|
||||
|
||||
bool_t
|
||||
_xdr_fd_result (XDR *xdrs, fd_result *objp)
|
||||
{
|
||||
bool_t res = _xdr_nis_error (xdrs, &objp->status);
|
||||
bool_t res = xdr_nis_error (xdrs, &objp->status);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = _xdr_nis_name (xdrs, &objp->source);
|
||||
res = xdr_nis_name (xdrs, &objp->source);
|
||||
if (__builtin_expect (res, TRUE))
|
||||
{
|
||||
res = xdr_bytes (xdrs, (char **) &objp->dir_data.dir_data_val,
|
||||
|
@ -1,19 +1,42 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
struct
|
||||
{
|
||||
long double val;
|
||||
const char str[4][7];
|
||||
} tests[] =
|
||||
{
|
||||
{ 0x0.FFFFp+0L, { "0X1P+0", "0X2P-1", "0X4P-2", "0X8P-3" } },
|
||||
{ 0x0.FFFFp+1L, { "0X1P+1", "0X2P+0", "0X4P-1", "0X8P-2" } },
|
||||
{ 0x0.FFFFp+2L, { "0X1P+2", "0X2P+1", "0X4P+0", "0X8P-1" } },
|
||||
{ 0x0.FFFFp+3L, { "0X1P+3", "0X2P+2", "0X4P+1", "0X8P+0" } }
|
||||
};
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
char buf[100];
|
||||
snprintf (buf, sizeof (buf), "%.0LA", 0x0.FFFFp+0L);
|
||||
int ret = 0;
|
||||
|
||||
if (strcmp (buf, "0X1P+0") != 0)
|
||||
{
|
||||
printf ("got \"%s\", expected \"0X1P+0\"\n", buf);
|
||||
return 1;
|
||||
for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
|
||||
{
|
||||
snprintf (buf, sizeof (buf), "%.0LA", tests[i].val);
|
||||
|
||||
size_t j;
|
||||
for (j = 0; j < 4; ++j)
|
||||
if (strcmp (buf, tests[i].str[j]) == 0)
|
||||
break;
|
||||
|
||||
if (j == 4)
|
||||
{
|
||||
printf ("%zd: got \"%s\", expected \"%s\" or equivalent\n",
|
||||
i, buf, tests[i].str[0]);
|
||||
ret = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Convert string representing a number to integer value, using given locale.
|
||||
Copyright (C) 1997, 2002, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 1997, 2002, 2004, 2006 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
@ -168,10 +168,15 @@
|
||||
/* Define tables of maximum values and remainders in order to detect
|
||||
overflow. Do this at compile-time in order to avoid the runtime
|
||||
overhead of the division. */
|
||||
extern const unsigned long __strtol_ul_max_tab[] attribute_hidden;
|
||||
extern const unsigned char __strtol_ul_rem_tab[] attribute_hidden;
|
||||
#if defined(QUAD) && __WORDSIZE == 32
|
||||
extern const unsigned long long __strtol_ull_max_tab[] attribute_hidden;
|
||||
extern const unsigned char __strtol_ull_rem_tab[] attribute_hidden;
|
||||
#endif
|
||||
|
||||
#define DEF(TYPE, NAME) \
|
||||
const TYPE NAME[] attribute_hidden \
|
||||
__attribute__((section(".gnu.linkonce.r." #NAME))) = \
|
||||
const TYPE NAME[] attribute_hidden = \
|
||||
{ \
|
||||
F(2), F(3), F(4), F(5), F(6), F(7), F(8), F(9), F(10), \
|
||||
F(11), F(12), F(13), F(14), F(15), F(16), F(17), F(18), F(19), F(20), \
|
||||
@ -179,20 +184,22 @@
|
||||
F(31), F(32), F(33), F(34), F(35), F(36) \
|
||||
}
|
||||
|
||||
#define F(X) ULONG_MAX / X
|
||||
#if !UNSIGNED && !defined (USE_WIDE_CHAR) && !defined (QUAD)
|
||||
# define F(X) ULONG_MAX / X
|
||||
DEF (unsigned long, __strtol_ul_max_tab);
|
||||
#undef F
|
||||
#if defined(QUAD) && __WORDSIZE == 32
|
||||
# undef F
|
||||
# define F(X) ULONG_MAX % X
|
||||
DEF (unsigned char, __strtol_ul_rem_tab);
|
||||
# undef F
|
||||
#endif
|
||||
#if !UNSIGNED && !defined (USE_WIDE_CHAR) && defined (QUAD) \
|
||||
&& __WORDSIZE == 32
|
||||
# define F(X) ULONG_LONG_MAX / X
|
||||
DEF (unsigned long long, __strtol_ull_max_tab);
|
||||
# undef F
|
||||
# define F(X) ULONG_LONG_MAX % X
|
||||
DEF (unsigned char, __strtol_ull_rem_tab);
|
||||
# undef F
|
||||
#else
|
||||
# define F(X) ULONG_MAX % X
|
||||
DEF (unsigned char, __strtol_ul_rem_tab);
|
||||
# undef F
|
||||
#endif
|
||||
#undef DEF
|
||||
|
||||
|
@ -513,16 +513,16 @@ ifloat: 1
|
||||
# j0
|
||||
Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1":
|
||||
double: 1
|
||||
float: 1
|
||||
float: 2
|
||||
idouble: 1
|
||||
ifloat: 1
|
||||
ifloat: 2
|
||||
Test "j0 (0.75) == 0.864242275166648623555731103820923211":
|
||||
float: 1
|
||||
ifloat: 1
|
||||
Test "j0 (10.0) == -0.245935764451348335197760862485328754":
|
||||
double: 2
|
||||
double: 3
|
||||
float: 1
|
||||
idouble: 2
|
||||
idouble: 3
|
||||
ifloat: 1
|
||||
ildouble: 2
|
||||
ldouble: 2
|
||||
@ -533,9 +533,9 @@ ildouble: 2
|
||||
ldouble: 2
|
||||
Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1":
|
||||
double: 1
|
||||
float: 1
|
||||
float: 2
|
||||
idouble: 1
|
||||
ifloat: 1
|
||||
ifloat: 2
|
||||
Test "j0 (8.0) == 0.171650807137553906090869407851972001":
|
||||
float: 1
|
||||
ifloat: 1
|
||||
@ -569,16 +569,16 @@ ldouble: 4
|
||||
# jn
|
||||
Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1":
|
||||
double: 1
|
||||
float: 1
|
||||
float: 2
|
||||
idouble: 1
|
||||
ifloat: 1
|
||||
ifloat: 2
|
||||
Test "jn (0, 0.75) == 0.864242275166648623555731103820923211":
|
||||
float: 1
|
||||
ifloat: 1
|
||||
Test "jn (0, 10.0) == -0.245935764451348335197760862485328754":
|
||||
double: 2
|
||||
double: 3
|
||||
float: 1
|
||||
idouble: 2
|
||||
idouble: 3
|
||||
ifloat: 1
|
||||
ildouble: 2
|
||||
ldouble: 2
|
||||
@ -589,9 +589,9 @@ ildouble: 2
|
||||
ldouble: 2
|
||||
Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1":
|
||||
double: 1
|
||||
float: 1
|
||||
float: 2
|
||||
idouble: 1
|
||||
ifloat: 1
|
||||
ifloat: 2
|
||||
Test "jn (0, 8.0) == 0.171650807137553906090869407851972001":
|
||||
float: 1
|
||||
ifloat: 1
|
||||
@ -661,9 +661,9 @@ idouble: 1
|
||||
ifloat: 1
|
||||
Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563":
|
||||
double: 3
|
||||
float: 1
|
||||
float: 2
|
||||
idouble: 3
|
||||
ifloat: 1
|
||||
ifloat: 2
|
||||
ildouble: 2
|
||||
ldouble: 2
|
||||
Test "jn (3, 2.0) == 0.128943249474402051098793332969239835":
|
||||
@ -925,9 +925,9 @@ ildouble: 1
|
||||
ldouble: 1
|
||||
Test "yn (10, 10.0) == -0.359814152183402722051986577343560609":
|
||||
double: 2
|
||||
float: 1
|
||||
float: 2
|
||||
idouble: 2
|
||||
ifloat: 1
|
||||
ifloat: 2
|
||||
ildouble: 2
|
||||
ldouble: 2
|
||||
Test "yn (10, 2.0) == -129184.542208039282635913145923304214":
|
||||
@ -1228,9 +1228,9 @@ float: 1
|
||||
ifloat: 1
|
||||
|
||||
Function: "j0":
|
||||
double: 2
|
||||
double: 3
|
||||
float: 2
|
||||
idouble: 2
|
||||
idouble: 3
|
||||
ifloat: 2
|
||||
ildouble: 2
|
||||
ldouble: 2
|
||||
|
@ -61,6 +61,24 @@ extern int __libc_missing_32bit_uids;
|
||||
int
|
||||
fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
{
|
||||
int result;
|
||||
|
||||
#ifdef __NR_fchownat
|
||||
# ifndef __ASSUME_ATFCTS
|
||||
if (__have_atfcts >= 0)
|
||||
# endif
|
||||
{
|
||||
result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag);
|
||||
# ifndef __ASSUME_ATFCTS
|
||||
if (result == -1 && errno == ENOSYS)
|
||||
__have_atfcts = -1;
|
||||
else
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __ASSUME_ATFCTS
|
||||
if (flag & ~AT_SYMLINK_NOFOLLOW)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
@ -87,14 +105,13 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
file = buf;
|
||||
}
|
||||
|
||||
int result;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
|
||||
#if defined __NR_lchown || __ASSUME_LCHOWN_SYSCALL > 0
|
||||
# if __ASSUME_LCHOWN_SYSCALL == 0
|
||||
# if defined __NR_lchown || __ASSUME_LCHOWN_SYSCALL > 0
|
||||
# if __ASSUME_LCHOWN_SYSCALL == 0
|
||||
static int __libc_old_chown;
|
||||
|
||||
# ifdef __NR_chown32
|
||||
# ifdef __NR_chown32
|
||||
if (__libc_missing_32bit_uids <= 0)
|
||||
{
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
@ -111,7 +128,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
|
||||
__libc_missing_32bit_uids = 1;
|
||||
}
|
||||
# endif /* __NR_chown32 */
|
||||
# endif /* __NR_chown32 */
|
||||
|
||||
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
||||
@ -135,13 +152,13 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
|
||||
result = INTERNAL_SYSCALL (lchown, err, 3, CHECK_STRING (file), owner,
|
||||
group);
|
||||
# elif __ASSUME_32BITUIDS
|
||||
# elif __ASSUME_32BITUIDS
|
||||
/* This implies __ASSUME_LCHOWN_SYSCALL. */
|
||||
result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
|
||||
group);
|
||||
# else
|
||||
# else
|
||||
/* !__ASSUME_32BITUIDS && ASSUME_LCHOWN_SYSCALL */
|
||||
# ifdef __NR_chown32
|
||||
# ifdef __NR_chown32
|
||||
if (__libc_missing_32bit_uids <= 0)
|
||||
{
|
||||
result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
|
||||
@ -153,7 +170,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
|
||||
__libc_missing_32bit_uids = 1;
|
||||
}
|
||||
# endif /* __NR_chown32 */
|
||||
# endif /* __NR_chown32 */
|
||||
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
||||
{
|
||||
@ -162,10 +179,10 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
}
|
||||
|
||||
result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner, group);
|
||||
# endif
|
||||
#else
|
||||
# endif
|
||||
# else
|
||||
result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner, group);
|
||||
#endif
|
||||
# endif
|
||||
|
||||
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
|
||||
goto fail;
|
||||
@ -175,4 +192,5 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
fail:
|
||||
__atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
@ -43,9 +43,9 @@
|
||||
#define O_SYNC 010000
|
||||
#define O_FSYNC O_SYNC
|
||||
#define O_ASYNC 020000
|
||||
#define O_DIRECT 040000
|
||||
|
||||
#ifdef __USE_GNU
|
||||
# define O_DIRECT 040000
|
||||
# define O_DIRECTORY 0200000 /* must be a directory */
|
||||
# define O_NOFOLLOW 0400000 /* don't follow links */
|
||||
# define O_NOATIME 01000000 /* Do not set atime. */
|
||||
|
@ -37,6 +37,24 @@
|
||||
int
|
||||
fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
{
|
||||
int result;
|
||||
|
||||
#ifdef __NR_fchownat
|
||||
# ifndef __ASSUME_ATFCTS
|
||||
if (__have_atfcts >= 0)
|
||||
# endif
|
||||
{
|
||||
result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag);
|
||||
# ifndef __ASSUME_ATFCTS
|
||||
if (result == -1 && errno == ENOSYS)
|
||||
__have_atfcts = -1;
|
||||
else
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __ASSUME_ATFCTS
|
||||
if (flag & ~AT_SYMLINK_NOFOLLOW)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
@ -63,15 +81,14 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
file = buf;
|
||||
}
|
||||
|
||||
int result;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
|
||||
#if __ASSUME_LCHOWN_SYSCALL
|
||||
# if __ASSUME_LCHOWN_SYSCALL
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
result = INTERNAL_SYSCALL (lchown, err, 3, file, owner, group);
|
||||
else
|
||||
result = INTERNAL_SYSCALL (chown, err, 3, file, owner, group);
|
||||
#else
|
||||
# else
|
||||
char link[PATH_MAX + 2];
|
||||
char path[2 * PATH_MAX + 4];
|
||||
int loopct;
|
||||
@ -89,7 +106,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
goto out;
|
||||
}
|
||||
|
||||
# ifdef __NR_lchown
|
||||
# ifdef __NR_lchown
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
{
|
||||
result = INTERNAL_SYSCALL (lchown, err, 3, __ptrvalue (file), owner,
|
||||
@ -110,25 +127,25 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
}
|
||||
libc_old_chown = -1;
|
||||
}
|
||||
# else
|
||||
# else
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
{
|
||||
result = INTERNAL_SYSCALL (chown, err, 3, __ptrvalue (file), owner,
|
||||
group);
|
||||
goto out;
|
||||
}
|
||||
# endif
|
||||
# endif
|
||||
|
||||
result = __readlink (file, link, PATH_MAX + 1);
|
||||
if (result == -1)
|
||||
{
|
||||
# ifdef __NR_lchown
|
||||
# ifdef __NR_lchown
|
||||
result = INTERNAL_SYSCALL (lchown, err, 3, __ptrvalue (file), owner,
|
||||
group);
|
||||
# else
|
||||
# else
|
||||
result = INTERNAL_SYSCALL (chown, err, 3, __ptrvalue (file), owner,
|
||||
group);
|
||||
# endif
|
||||
# endif
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -178,11 +195,11 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
|
||||
if (result == -1)
|
||||
{
|
||||
# ifdef __NR_lchown
|
||||
# ifdef __NR_lchown
|
||||
result = INTERNAL_SYSCALL (lchown, err, 3, path, owner, group);
|
||||
# else
|
||||
# else
|
||||
result = INTERNAL_SYSCALL (chown, err, 3, path, owner, group);
|
||||
# endif
|
||||
# endif
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -190,16 +207,17 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
return -1;
|
||||
|
||||
out:
|
||||
#endif
|
||||
# endif
|
||||
|
||||
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
|
||||
{
|
||||
#if !__ASSUME_LCHOWN_SYSCALL
|
||||
# if !__ASSUME_LCHOWN_SYSCALL
|
||||
fail:
|
||||
#endif
|
||||
# endif
|
||||
__atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf);
|
||||
result = -1;
|
||||
}
|
||||
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
@ -53,6 +53,24 @@ extern int __libc_missing_32bit_uids;
|
||||
int
|
||||
fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
{
|
||||
int result;
|
||||
|
||||
#ifdef __NR_fchownat
|
||||
# ifndef __ASSUME_ATFCTS
|
||||
if (__have_atfcts >= 0)
|
||||
# endif
|
||||
{
|
||||
result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag);
|
||||
# ifndef __ASSUME_ATFCTS
|
||||
if (result == -1 && errno == ENOSYS)
|
||||
__have_atfcts = -1;
|
||||
else
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __ASSUME_ATFCTS
|
||||
if (flag & ~AT_SYMLINK_NOFOLLOW)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
@ -79,16 +97,15 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
file = buf;
|
||||
}
|
||||
|
||||
int result;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
|
||||
#if __ASSUME_32BITUIDS > 0
|
||||
# if __ASSUME_32BITUIDS > 0
|
||||
result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
|
||||
group);
|
||||
#else
|
||||
# else
|
||||
static int __libc_old_chown;
|
||||
|
||||
# ifdef __NR_chown32
|
||||
# ifdef __NR_chown32
|
||||
if (__libc_missing_32bit_uids <= 0)
|
||||
{
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
@ -105,7 +122,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
|
||||
__libc_missing_32bit_uids = 1;
|
||||
}
|
||||
# endif /* __NR_chown32 */
|
||||
# endif /* __NR_chown32 */
|
||||
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
||||
{
|
||||
@ -128,7 +145,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
|
||||
result = INTERNAL_SYSCALL (lchown, err, 3, CHECK_STRING (file), owner,
|
||||
group);
|
||||
#endif
|
||||
# endif
|
||||
|
||||
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
|
||||
{
|
||||
@ -138,4 +155,5 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
}
|
||||
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
@ -40,6 +40,24 @@ extern int __libc_missing_32bit_uids;
|
||||
int
|
||||
fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
{
|
||||
int result;
|
||||
|
||||
#ifdef __NR_fchownat
|
||||
# ifndef __ASSUME_ATFCTS
|
||||
if (__have_atfcts >= 0)
|
||||
# endif
|
||||
{
|
||||
result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag);
|
||||
# ifndef __ASSUME_ATFCTS
|
||||
if (result == -1 && errno == ENOSYS)
|
||||
__have_atfcts = -1;
|
||||
else
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __ASSUME_ATFCTS
|
||||
if (flag & ~AT_SYMLINK_NOFOLLOW)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
@ -66,18 +84,17 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
file = buf;
|
||||
}
|
||||
|
||||
int result;
|
||||
INTERNAL_SYSCALL_DECL (err);
|
||||
|
||||
#if __ASSUME_32BITUIDS > 0
|
||||
# if __ASSUME_32BITUIDS > 0
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
result = INTERNAL_SYSCALL (lchown32, err, 3, CHECK_STRING (file), owner,
|
||||
group);
|
||||
else
|
||||
result = INTERNAL_SYSCALL (chown32, err, 3, CHECK_STRING (file), owner,
|
||||
group);
|
||||
#else
|
||||
# ifdef __NR_chown32
|
||||
# else
|
||||
# ifdef __NR_chown32
|
||||
if (__libc_missing_32bit_uids <= 0)
|
||||
{
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
@ -94,7 +111,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
|
||||
__libc_missing_32bit_uids = 1;
|
||||
}
|
||||
# endif /* __NR_chown32 */
|
||||
# endif /* __NR_chown32 */
|
||||
|
||||
if (((owner + 1) > (gid_t) ((__kernel_uid_t) -1U))
|
||||
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
||||
@ -109,7 +126,7 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
else
|
||||
result = INTERNAL_SYSCALL (chown, err, 3, CHECK_STRING (file), owner,
|
||||
group);
|
||||
#endif
|
||||
# endif
|
||||
|
||||
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (result, err), 0))
|
||||
{
|
||||
@ -119,4 +136,5 @@ fchownat (int fd, const char *file, uid_t owner, gid_t group, int flag)
|
||||
}
|
||||
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user