summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-08-01 17:16:42 +0000
committerJakub Jelinek <jakub@redhat.com>2007-08-01 17:16:42 +0000
commite08057b1ff24258dd7460ad81e84491f7a28b424 (patch)
treef63a12d52cbc1796013a84382fe25f57ac675204 /sysdeps
parent4baf42dd00e8cafc79e2a3c94ef8effa6ef0a921 (diff)
Updated to fedora-glibc-20070801T1703cvs/fedora-glibc-2_6_90-2
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/unwind-dw2-fde-glibc.c7
-rw-r--r--sysdeps/generic/unwind-dw2-fde.c15
-rw-r--r--sysdeps/generic/unwind-dw2.c22
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c109
-rw-r--r--sysdeps/unix/sysv/linux/i386/posix_fallocate.c58
-rw-r--r--sysdeps/unix/sysv/linux/i386/posix_fallocate64.c61
-rw-r--r--sysdeps/unix/sysv/linux/i386/syscalls.list1
-rw-r--r--sysdeps/unix/sysv/linux/posix_fallocate.c2
8 files changed, 243 insertions, 32 deletions
diff --git a/sysdeps/generic/unwind-dw2-fde-glibc.c b/sysdeps/generic/unwind-dw2-fde-glibc.c
index 0038a0cbf6..932a972743 100644
--- a/sysdeps/generic/unwind-dw2-fde-glibc.c
+++ b/sysdeps/generic/unwind-dw2-fde-glibc.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2007 Free Software Foundation, Inc.
Contributed by Jakub Jelinek <jakub@redhat.com>.
This file is part of the GNU C Library.
@@ -235,10 +235,11 @@ _Unwind_IteratePhdrCallback (struct dl_phdr_info *info, size_t size, void *ptr)
if (data->ret != NULL)
{
unsigned int encoding = get_fde_encoding (data->ret);
+ _Unwind_Ptr func;
read_encoded_value_with_base (encoding,
base_from_cb_data (encoding, data),
- data->ret->pc_begin,
- (_Unwind_Ptr *)&data->func);
+ data->ret->pc_begin, &func);
+ data->func = (void *) func;
}
return 1;
}
diff --git a/sysdeps/generic/unwind-dw2-fde.c b/sysdeps/generic/unwind-dw2-fde.c
index 13945b9719..8d62e46114 100644
--- a/sysdeps/generic/unwind-dw2-fde.c
+++ b/sysdeps/generic/unwind-dw2-fde.c
@@ -1,5 +1,5 @@
/* Subroutines needed for unwinding stack frames for exception handling. */
-/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2006
+/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2006, 2007
Free Software Foundation, Inc.
Contributed by Jason Merrill <jason@cygnus.com>.
@@ -301,7 +301,8 @@ get_cie_encoding (struct dwarf_cie *cie)
if (aug[0] != 'z')
return DW_EH_PE_absptr;
- p = aug + strlen (aug) + 1; /* Skip the augmentation string. */
+ /* Skip the augmentation string. */
+ p = aug + strlen ((const char *) aug) + 1;
p = read_uleb128 (p, &utmp); /* Skip code alignment. */
p = read_sleb128 (p, &stmp); /* Skip data alignment. */
p++; /* Skip return address column. */
@@ -838,7 +839,7 @@ linear_search_fdes (struct object *ob, fde *this_fde, void *pc)
else
{
_Unwind_Ptr mask;
- const char *p;
+ const unsigned char *p;
p = read_encoded_value_with_base (encoding, base,
this_fde->pc_begin, &pc_begin);
@@ -908,7 +909,7 @@ binary_search_single_encoding_fdes (struct object *ob, void *pc)
size_t i = (lo + hi) / 2;
fde *f = vec->array[i];
_Unwind_Ptr pc_begin, pc_range;
- const char *p;
+ const unsigned char *p;
p = read_encoded_value_with_base (encoding, base, f->pc_begin,
&pc_begin);
@@ -936,7 +937,7 @@ binary_search_mixed_encoding_fdes (struct object *ob, void *pc)
size_t i = (lo + hi) / 2;
fde *f = vec->array[i];
_Unwind_Ptr pc_begin, pc_range;
- const char *p;
+ const unsigned char *p;
int encoding;
encoding = get_fde_encoding (f);
@@ -1046,6 +1047,7 @@ _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases)
if (f)
{
int encoding;
+ _Unwind_Ptr func;
bases->tbase = ob->tbase;
bases->dbase = ob->dbase;
@@ -1054,7 +1056,8 @@ _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases)
if (ob->s.b.mixed_encoding)
encoding = get_fde_encoding (f);
read_encoded_value_with_base (encoding, base_from_object (encoding, ob),
- f->pc_begin, (_Unwind_Ptr *)&bases->func);
+ f->pc_begin, &func);
+ bases->func = (void *) func;
}
return f;
diff --git a/sysdeps/generic/unwind-dw2.c b/sysdeps/generic/unwind-dw2.c
index d818e5dfd8..ba5723aa62 100644
--- a/sysdeps/generic/unwind-dw2.c
+++ b/sysdeps/generic/unwind-dw2.c
@@ -1,5 +1,5 @@
/* DWARF2 exception handling and frame unwind runtime interface routines.
- Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2005,2006
+ Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2005,2006,2007
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -309,8 +309,9 @@ extract_cie_info (struct dwarf_cie *cie, struct _Unwind_Context *context,
/* "P" indicates a personality routine in the CIE augmentation. */
else if (aug[0] == 'P')
{
- p = read_encoded_value (context, *p, p + 1,
- (_Unwind_Ptr *) &fs->personality);
+ _Unwind_Ptr personality;
+ p = read_encoded_value (context, *p, p + 1, &personality);
+ fs->personality = (_Unwind_Personality_Fn) personality;
aug += 1;
}
@@ -771,8 +772,12 @@ execute_cfa_program (const unsigned char *insn_ptr,
else switch (insn)
{
case DW_CFA_set_loc:
- insn_ptr = read_encoded_value (context, fs->fde_encoding,
- insn_ptr, (_Unwind_Ptr *) &fs->pc);
+ {
+ _Unwind_Ptr pc;
+ insn_ptr = read_encoded_value (context, fs->fde_encoding,
+ insn_ptr, &pc);
+ fs->pc = (void *) pc;
+ }
break;
case DW_CFA_advance_loc1:
@@ -992,8 +997,11 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
insn = aug + i;
}
if (fs->lsda_encoding != DW_EH_PE_omit)
- aug = read_encoded_value (context, fs->lsda_encoding, aug,
- (_Unwind_Ptr *) &context->lsda);
+ {
+ _Unwind_Ptr lsda;
+ aug = read_encoded_value (context, fs->lsda_encoding, aug, &lsda);
+ context->lsda = (void *) lsda;
+ }
/* Then the insns in the FDE up to our target PC. */
if (insn == NULL)
diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
index d655ba3b27..ee7a539a6f 100644
--- a/sysdeps/unix/sysv/linux/getsysstats.c
+++ b/sysdeps/unix/sysv/linux/getsysstats.c
@@ -1,5 +1,5 @@
/* Determine various system internal values, Linux version.
- Copyright (C) 1996-2001, 2002, 2003, 2006 Free Software Foundation, Inc.
+ Copyright (C) 1996-2001, 2002, 2003, 2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -21,7 +21,9 @@
#include <alloca.h>
#include <assert.h>
#include <ctype.h>
+#include <dirent.h>
#include <errno.h>
+#include <fcntl.h>
#include <mntent.h>
#include <paths.h>
#include <stdio.h>
@@ -32,6 +34,7 @@
#include <sys/sysinfo.h>
#include <atomic.h>
+#include <not-cancel.h>
/* How we can determine the number of available processors depends on
@@ -64,14 +67,13 @@
while (0)
#endif
-int
-__get_nprocs ()
+
+static int
+count_processors_in_proc (void)
{
char buffer[8192];
int result = 1;
- /* XXX Here will come a test for the new system call. */
-
/* The /proc/stat format is more uniform, use it by default. */
FILE *fp = fopen ("/proc/stat", "rc");
if (fp != NULL)
@@ -100,38 +102,115 @@ __get_nprocs ()
return result;
}
+
+
+int
+__get_nprocs ()
+{
+ /* XXX Here will come a test for the new system call. */
+
+ /* Try to use the sysfs filesystem. It has actual information about
+ online processors. */
+ DIR *dir = __opendir ("/sys/devices/system/cpu");
+ if (dir != NULL)
+ {
+ int dfd = dirfd (dir);
+ int count = 0;
+ struct dirent64 *d;
+
+ while ((d = __readdir64 (dir)) != NULL)
+ /* NB: the sysfs has d_type support. */
+ if (d->d_type == DT_DIR && strncmp (d->d_name, "cpu", 3) == 0)
+ {
+ char *endp;
+ unsigned long int nr = strtoul (d->d_name + 3, &endp, 10);
+ if (nr != ULONG_MAX && endp != d->d_name + 3 && *endp == '\0')
+ {
+ /* Try reading the online file. */
+ char oname[_D_ALLOC_NAMLEN (d) + sizeof "/online"];
+ strcpy (stpcpy (oname, d->d_name), "/online");
+
+ /* We unconditionally use openat since the "online"
+ file became readable only after the openat system
+ call was introduced. */
+ char buf[1];
+ int fd = openat_not_cancel_3 (dfd, oname, O_RDONLY);
+
+ /* If we cannot read the online file we have to assume
+ the CPU is online. */
+ if (fd < 0)
+ ++count;
+ else
+ {
+ if (read_not_cancel (fd, buf, sizeof (buf)) < 0
+ || buf[0] == '1')
+ ++count;
+
+ close_not_cancel_no_status (fd);
+ }
+ }
+ }
+
+ __closedir (dir);
+
+ return count;
+ }
+
+ return count_processors_in_proc ();
+}
weak_alias (__get_nprocs, get_nprocs)
-#ifdef GET_NPROCS_CONF_PARSER
/* On some architectures it is possible to distinguish between configured
and active cpus. */
int
__get_nprocs_conf ()
{
- char buffer[8192];
- int result = 1;
-
/* XXX Here will come a test for the new system call. */
+ /* Try to use the sysfs filesystem. It has actual information about
+ online processors. */
+ DIR *dir = __opendir ("/sys/devices/system/cpu");
+ if (dir != NULL)
+ {
+ int count = 0;
+ struct dirent64 *d;
+
+ while ((d = __readdir64 (dir)) != NULL)
+ /* NB: the sysfs has d_type support. */
+ if (d->d_type == DT_DIR && strncmp (d->d_name, "cpu", 3) == 0)
+ {
+ char *endp;
+ unsigned long int nr = strtoul (d->d_name + 3, &endp, 10);
+ if (nr != ULONG_MAX && endp != d->d_name + 3 && *endp == '\0')
+ ++count;
+ }
+
+ __closedir (dir);
+
+ return count;
+ }
+
+ int result = 1;
+
+#ifdef GET_NPROCS_CONF_PARSER
/* If we haven't found an appropriate entry return 1. */
FILE *fp = fopen ("/proc/cpuinfo", "rc");
if (fp != NULL)
{
+ char buffer[8192];
+
/* No threads use this stream. */
__fsetlocking (fp, FSETLOCKING_BYCALLER);
GET_NPROCS_CONF_PARSER (fp, buffer, result);
fclose (fp);
}
+#else
+ result = count_processors_in_proc ();
+#endif
return result;
}
-#else
-/* As far as I know Linux has no separate numbers for configured and
- available processors. So make the `get_nprocs_conf' function an
- alias. */
-strong_alias (__get_nprocs, __get_nprocs_conf)
-#endif
weak_alias (__get_nprocs_conf, get_nprocs_conf)
/* General function to get information about memory status from proc
diff --git a/sysdeps/unix/sysv/linux/i386/posix_fallocate.c b/sysdeps/unix/sysv/linux/i386/posix_fallocate.c
new file mode 100644
index 0000000000..c974d06afc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/posix_fallocate.c
@@ -0,0 +1,58 @@
+/* Copyright (C) 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fcntl.h>
+#include <kernel-features.h>
+#include <sysdep.h>
+
+#define posix_fallocate static internal_fallocate
+#include <sysdeps/posix/posix_fallocate.c>
+#undef posix_fallocate
+
+#if !defined __ASSUME_FALLOCATE && defined __NR_fallocate
+int __have_fallocate attribute_hidden;
+#endif
+
+extern int __fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
+ attribute_hidden;
+
+/* Reserve storage for the data of the file associated with FD. */
+int
+posix_fallocate (int fd, __off_t offset, __off_t len)
+{
+#ifdef __NR_fallocate
+# ifndef __ASSUME_FALLOCATE
+ if (__builtin_expect (__have_fallocate >= 0, 1))
+# endif
+ {
+ int res = __fallocate64 (fd, 0, offset, len);
+ if (! res)
+ return 0;
+
+# ifndef __ASSUME_FALLOCATE
+ if (__builtin_expect (res == ENOSYS, 0))
+ __have_fallocate = -1;
+ else
+# endif
+ if (res != EOPNOTSUPP)
+ return res;
+ }
+#endif
+
+ return internal_fallocate (fd, offset, len);
+}
diff --git a/sysdeps/unix/sysv/linux/i386/posix_fallocate64.c b/sysdeps/unix/sysv/linux/i386/posix_fallocate64.c
new file mode 100644
index 0000000000..d5b4d597c1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/posix_fallocate64.c
@@ -0,0 +1,61 @@
+/* Copyright (C) 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <fcntl.h>
+#include <kernel-features.h>
+#include <sysdep.h>
+
+extern int __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len);
+#define __posix_fallocate64_l64 static internal_fallocate64
+#include <sysdeps/posix/posix_fallocate64.c>
+#undef __posix_fallocate64_l64
+
+#if !defined __ASSUME_FALLOCATE && defined __NR_fallocate
+/* Defined in posix_fallocate.c. */
+extern int __have_fallocate attribute_hidden;
+#endif
+
+extern int __fallocate64 (int fd, int mode, __off64_t offset, __off64_t len)
+ attribute_hidden;
+
+/* Reserve storage for the data of the file associated with FD. */
+int
+__posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len)
+{
+#ifdef __NR_fallocate
+# ifndef __ASSUME_FALLOCATE
+ if (__builtin_expect (__have_fallocate >= 0, 1))
+# endif
+ {
+ int res = __fallocate64 (fd, 0, offset, len);
+
+ if (! res)
+ return 0;
+
+# ifndef __ASSUME_FALLOCATE
+ if (__builtin_expect (res == ENOSYS, 0))
+ __have_fallocate = -1;
+ else
+# endif
+ if (res != EOPNOTSUPP)
+ return res;
+ }
+#endif
+
+ return internal_fallocate64 (fd, offset, len);
+}
diff --git a/sysdeps/unix/sysv/linux/i386/syscalls.list b/sysdeps/unix/sysv/linux/i386/syscalls.list
index 3ff3a73aab..c532a78869 100644
--- a/sysdeps/unix/sysv/linux/i386/syscalls.list
+++ b/sysdeps/unix/sysv/linux/i386/syscalls.list
@@ -6,3 +6,4 @@ vm86 - vm86 i:ip __vm86 vm86@@GLIBC_2.3.4
oldgetrlimit EXTRA getrlimit i:ip __old_getrlimit getrlimit@GLIBC_2.0
oldsetrlimit EXTRA setrlimit i:ip __old_setrlimit setrlimit@GLIBC_2.0
waitpid - waitpid Ci:ipi __waitpid waitpid __libc_waitpid
+fallocate64 EXTRA fallocate Vi:iiiiii __fallocate64
diff --git a/sysdeps/unix/sysv/linux/posix_fallocate.c b/sysdeps/unix/sysv/linux/posix_fallocate.c
index 9cfade60ca..6944793fa2 100644
--- a/sysdeps/unix/sysv/linux/posix_fallocate.c
+++ b/sysdeps/unix/sysv/linux/posix_fallocate.c
@@ -39,7 +39,7 @@ posix_fallocate (int fd, __off_t offset, __off_t len)
# endif
{
INTERNAL_SYSCALL_DECL (err);
- int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0,
+ int res = INTERNAL_SYSCALL (fallocate, err, 6, fd, 0,
__LONG_LONG_PAIR (offset >> 31, offset),
__LONG_LONG_PAIR (len >> 31, len));