mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
Update.
1998-11-30 Andreas Jaeger <aj@arthur.rhein-neckar.de> * nscd/nscd_getpw_r.c: Include nscd_proto.h for prototypes. * sysdeps/generic/errno-loc.c: Include <errno.h> for prototype, undefine errno to get variable. * sysdeps/unix/sysv/linux/i386/setfsuid.c: Include <sys/fsuid.h> instead of <unistd.h> for prototype. * sysdeps/unix/sysv/linux/i386/setfsgid.c: Likewise. 1998-11-30 Ulrich Drepper <drepper@cygnus.com> * misc/err.h: Correct comments and use protected attribute keywords. Reported by Joseph Myers <jsm28@cam.ac.uk>. 1998-11-29 Roland McGrath <roland@baalperazim.frob.com> * malloc/thread-m.h [_LIBC]: Include <bits/libc-tsd.h>, and remove tsd stuff from pthreads/cthreads libc sections. Use __libc_tsd_define for MALLOC key. [_LIBC] (tsd_key_t, tsd_key_create): Define to a zero-size type and a no-op, respectively. [_LIBC] (tsd_setspecific, tsd_getspecific): Use __libc_tsd_get/set. * elf/dl-error.c: Include <bits/libc-tsd.h>. Use __libc_tsd_define for DL_ERROR key. (tsd_setspecific, tsd_getspecific): Rewritten using __libc_tsd_get/set. * sysdeps/mach/hurd/bits/libc-tsd.h: New file. * sysdeps/generic/bits/libc-tsd.h: New file. * Makefile (distribute): Add bits/libc-tsd.h. 1998-10-12 Roland McGrath <roland@baalperazim.frob.com> * elf/dl-error.c: Remove kludge to check for ld.so load address. There is no need if weak undefined symbols are not used in ld.so; see linuxthreads/ChangeLog for changes to files linuxthreads/sysdeps/pthread/bits/libc-lock.h and linuxthreads/sysdeps/pthread/bits/libc-tsd.h. 1998-11-30 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/i386/bits/string.h (__memset_cc): Fix typo (s->__s). * sysdeps/i386/i486/bits/string.h: Add prototypes for all new inline functions. * sysdeps/i386/bits/string.h: Likewise. 1998-11-30 Andreas Jaeger <aj@arthur.rhein-neckar.de> * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Remove ipc_kludge. 1998-11-30 Andreas Schwab <schwab@issan.cs.uni-dortmund.de> * db2/progs/db_load/db_load.c (main): Avoid -Wparentheses warning.
This commit is contained in:
parent
3f7b3d9b1f
commit
348ed5157b
57
ChangeLog
57
ChangeLog
@ -1,3 +1,60 @@
|
||||
1998-11-30 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||
|
||||
* nscd/nscd_getpw_r.c: Include nscd_proto.h for prototypes.
|
||||
|
||||
* sysdeps/generic/errno-loc.c: Include <errno.h> for prototype,
|
||||
undefine errno to get variable.
|
||||
|
||||
* sysdeps/unix/sysv/linux/i386/setfsuid.c: Include <sys/fsuid.h>
|
||||
instead of <unistd.h> for prototype.
|
||||
* sysdeps/unix/sysv/linux/i386/setfsgid.c: Likewise.
|
||||
|
||||
1998-11-30 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* misc/err.h: Correct comments and use protected attribute keywords.
|
||||
Reported by Joseph Myers <jsm28@cam.ac.uk>.
|
||||
|
||||
1998-11-29 Roland McGrath <roland@baalperazim.frob.com>
|
||||
|
||||
* malloc/thread-m.h [_LIBC]: Include <bits/libc-tsd.h>, and
|
||||
remove tsd stuff from pthreads/cthreads libc sections.
|
||||
Use __libc_tsd_define for MALLOC key.
|
||||
[_LIBC] (tsd_key_t, tsd_key_create): Define to a zero-size type and a
|
||||
no-op, respectively.
|
||||
[_LIBC] (tsd_setspecific, tsd_getspecific): Use __libc_tsd_get/set.
|
||||
|
||||
* elf/dl-error.c: Include <bits/libc-tsd.h>.
|
||||
Use __libc_tsd_define for DL_ERROR key.
|
||||
(tsd_setspecific, tsd_getspecific): Rewritten using __libc_tsd_get/set.
|
||||
|
||||
* sysdeps/mach/hurd/bits/libc-tsd.h: New file.
|
||||
* sysdeps/generic/bits/libc-tsd.h: New file.
|
||||
* Makefile (distribute): Add bits/libc-tsd.h.
|
||||
|
||||
1998-10-12 Roland McGrath <roland@baalperazim.frob.com>
|
||||
|
||||
* elf/dl-error.c: Remove kludge to check for ld.so load address.
|
||||
There is no need if weak undefined symbols are not used in ld.so;
|
||||
see linuxthreads/ChangeLog for changes to files
|
||||
linuxthreads/sysdeps/pthread/bits/libc-lock.h and
|
||||
linuxthreads/sysdeps/pthread/bits/libc-tsd.h.
|
||||
|
||||
1998-11-30 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||
|
||||
* sysdeps/i386/bits/string.h (__memset_cc): Fix typo (s->__s).
|
||||
|
||||
* sysdeps/i386/i486/bits/string.h: Add prototypes for all new
|
||||
inline functions.
|
||||
* sysdeps/i386/bits/string.h: Likewise.
|
||||
|
||||
1998-11-30 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||
|
||||
* sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Remove ipc_kludge.
|
||||
|
||||
1998-11-30 Andreas Schwab <schwab@issan.cs.uni-dortmund.de>
|
||||
|
||||
* db2/progs/db_load/db_load.c (main): Avoid -Wparentheses warning.
|
||||
|
||||
1998-09-12 Mark Kettenis <kettenis@phys.uva.nl>
|
||||
|
||||
* sysdeps/mach/hurd/dl-sysdep.c: Do not define
|
||||
|
95
FAQ
95
FAQ
@ -24,22 +24,23 @@ please let me know.
|
||||
What's wrong?
|
||||
1.4. Do I need a special linker or assembler?
|
||||
1.5. Which compiler should I use for powerpc?
|
||||
1.6. Do I need some more things to compile the GNU C Library?
|
||||
1.7. What version of the Linux kernel headers should be used?
|
||||
1.8. The compiler hangs while building iconvdata modules. What's
|
||||
1.6. Which tools should I use for ARM?
|
||||
1.7. Do I need some more things to compile the GNU C Library?
|
||||
1.8. What version of the Linux kernel headers should be used?
|
||||
1.9. The compiler hangs while building iconvdata modules. What's
|
||||
wrong?
|
||||
1.9. When I run `nm -u libc.so' on the produced library I still
|
||||
1.10. When I run `nm -u libc.so' on the produced library I still
|
||||
find unresolved symbols. Can this be ok?
|
||||
1.10. What are these `add-ons'?
|
||||
1.11. My XXX kernel emulates a floating-point coprocessor for me.
|
||||
1.11. What are these `add-ons'?
|
||||
1.12. My XXX kernel emulates a floating-point coprocessor for me.
|
||||
Should I enable --with-fp?
|
||||
1.12. When compiling GNU libc I get lots of errors saying functions
|
||||
1.13. When compiling GNU libc I get lots of errors saying functions
|
||||
in glibc are duplicated in libgcc.
|
||||
1.13. Why do I get messages about missing thread functions when I use
|
||||
1.14. Why do I get messages about missing thread functions when I use
|
||||
librt? I don't even use threads.
|
||||
1.14. What's the problem with configure --enable-omitfp?
|
||||
1.15. I get failures during `make check'. What shall I do?
|
||||
1.16. What is symbol versioning good for? Do I need it?
|
||||
1.15. What's the problem with configure --enable-omitfp?
|
||||
1.16. I get failures during `make check'. What shall I do?
|
||||
1.17. What is symbol versioning good for? Do I need it?
|
||||
|
||||
2. Installation and configuration issues
|
||||
|
||||
@ -140,6 +141,8 @@ please let me know.
|
||||
to EST5EDT things go wrong since glibc computes the wrong time
|
||||
from this information.
|
||||
4.4. What other sources of documentation about glibc are available?
|
||||
4.5. The timezone string for Sydney/Australia is wrong since even when
|
||||
daylight saving time is in effect the timezone string is EST.
|
||||
|
||||
|
||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||
@ -163,6 +166,7 @@ in the future, are:
|
||||
sparc-*-linux-gnu Linux-2.x on SPARC
|
||||
sparc64-*-linux-gnu Linux-2.x on UltraSPARC
|
||||
arm-*-none ARM standalone systems
|
||||
arm-*-linux Linux-2.x on ARM
|
||||
arm-*-linuxaout Linux-2.x on ARM using a.out binaries
|
||||
|
||||
Ports to other Linux platforms are in development, and may in fact work
|
||||
@ -191,7 +195,7 @@ a local mirror first.
|
||||
You should always try to use the latest official release. Older versions
|
||||
may not have all the features GNU libc requires. The current releases of
|
||||
egcs (1.0.3 and 1.1) and GNU CC (2.8.1) should work with the GNU C library
|
||||
(for powerpc see question question 1.5).
|
||||
(for powerpc see question question 1.5; for ARM see question question 1.6).
|
||||
|
||||
{ZW} You may have problems if you try to mix code compiled with
|
||||
EGCS and with GCC 2.8.1. See question 2.8 for details.
|
||||
@ -240,7 +244,18 @@ variables. There is a temporary patch at:
|
||||
Later versions of egcs may fix this problem.
|
||||
|
||||
|
||||
1.6. Do I need some more things to compile the GNU C Library?
|
||||
1.6. Which tools should I use for ARM?
|
||||
|
||||
{PB} You should use egcs 1.1 or a later version. For ELF systems some
|
||||
changes are needed to the compiler; a patch against egcs-1.1.x can be found
|
||||
at:
|
||||
|
||||
<ftp://ftp.netwinder.org/users/p/philb/egcs-1.1.1pre2-diff-981126>
|
||||
|
||||
Binutils 2.9.1.0.16 or later is also required.
|
||||
|
||||
|
||||
1.7. Do I need some more things to compile the GNU C Library?
|
||||
|
||||
{UD} Yes, there are some more :-).
|
||||
|
||||
@ -284,7 +299,7 @@ Later versions of egcs may fix this problem.
|
||||
If you have some more measurements let me know.
|
||||
|
||||
|
||||
1.7. What version of the Linux kernel headers should be used?
|
||||
1.8. What version of the Linux kernel headers should be used?
|
||||
|
||||
{AJ,UD} The headers from the most recent Linux kernel should be used. The
|
||||
headers used while compiling the GNU C library and the kernel binary used
|
||||
@ -307,7 +322,7 @@ kernel sources to the 2.1 tree, do `make oldconfig', and say no to all the
|
||||
new options.
|
||||
|
||||
|
||||
1.8. The compiler hangs while building iconvdata modules. What's
|
||||
1.9. The compiler hangs while building iconvdata modules. What's
|
||||
wrong?
|
||||
|
||||
{ZW} This is a problem with old versions of GCC. Initialization of large
|
||||
@ -317,7 +332,7 @@ time.
|
||||
The problem is fixed in egcs 1.1 but not in earlier releases.
|
||||
|
||||
|
||||
1.9. When I run `nm -u libc.so' on the produced library I still
|
||||
1.10. When I run `nm -u libc.so' on the produced library I still
|
||||
find unresolved symbols. Can this be ok?
|
||||
|
||||
{UD} Yes, this is ok. There can be several kinds of unresolved symbols:
|
||||
@ -333,7 +348,7 @@ Generally, you should make sure you find a real program which produces
|
||||
errors while linking before deciding there is a problem.
|
||||
|
||||
|
||||
1.10. What are these `add-ons'?
|
||||
1.11. What are these `add-ons'?
|
||||
|
||||
{UD} To avoid complications with export rules or external source code some
|
||||
optional parts of the libc are distributed as separate packages (e.g., the
|
||||
@ -356,7 +371,7 @@ else. The existing makefiles do most of the work; only some few stub rules
|
||||
must be written to get everything running.
|
||||
|
||||
|
||||
1.11. My XXX kernel emulates a floating-point coprocessor for me.
|
||||
1.12. My XXX kernel emulates a floating-point coprocessor for me.
|
||||
Should I enable --with-fp?
|
||||
|
||||
{ZW} An emulated FPU is just as good as a real one, as far as the C library
|
||||
@ -370,7 +385,7 @@ far more trouble than it's worth: you then have to compile
|
||||
(libgcc.a for GNU C), because the calling conventions change.
|
||||
|
||||
|
||||
1.12. When compiling GNU libc I get lots of errors saying functions
|
||||
1.13. When compiling GNU libc I get lots of errors saying functions
|
||||
in glibc are duplicated in libgcc.
|
||||
|
||||
{EY} This is *exactly* the same problem that I was having. The problem was
|
||||
@ -387,7 +402,7 @@ problems of this kind. The setting of CFLAGS is checked at the very
|
||||
beginning and if it is not usable `configure' will bark.
|
||||
|
||||
|
||||
1.13. Why do I get messages about missing thread functions when I use
|
||||
1.14. Why do I get messages about missing thread functions when I use
|
||||
librt? I don't even use threads.
|
||||
|
||||
{UD} In this case you probably mixed up your installation. librt uses
|
||||
@ -403,7 +418,7 @@ given path to find the implicitly referenced library while not disturbing
|
||||
any other link path.
|
||||
|
||||
|
||||
1.14. What's the problem with configure --enable-omitfp?
|
||||
1.15. What's the problem with configure --enable-omitfp?
|
||||
|
||||
{AJ} When --enable-omitfp is set the libraries are built without frame
|
||||
pointers. Some compilers produce buggy code for this model and therefore we
|
||||
@ -422,7 +437,7 @@ The compilation of these extra libraries and the compiler optimizations slow
|
||||
down the build process and need more disk space.
|
||||
|
||||
|
||||
1.15. I get failures during `make check'. What shall I do?
|
||||
1.16. I get failures during `make check'. What shall I do?
|
||||
|
||||
{AJ} The testsuite should compile and run cleanly on your system, every
|
||||
failure should be looked into. Depending on the failure I wouldn't advise
|
||||
@ -445,7 +460,7 @@ There are some failures which are not directly related to the GNU libc:
|
||||
development kernels have fixes for the floating point support on Alpha.
|
||||
|
||||
|
||||
1.16. What is symbol versioning good for? Do I need it?
|
||||
1.17. What is symbol versioning good for? Do I need it?
|
||||
|
||||
{AJ} Symbol versioning solves problems that are related to interface
|
||||
changes. One version of an interface might have been introduced in a
|
||||
@ -565,7 +580,7 @@ question 3.8 for details.
|
||||
source code. Until this law gets abolished we cannot ship the cryptographic
|
||||
functions together with glibc.
|
||||
|
||||
The functions are available, as an add-on (see question 1.10). People in the US
|
||||
The functions are available, as an add-on (see question 1.11). People in the US
|
||||
may get it from the same place they got GNU libc from. People outside the
|
||||
US should get the code from ftp://ftp.ifi.uio.no/pub/gnu, or another archive
|
||||
site outside the USA. The README explains how to install the sources.
|
||||
@ -1333,9 +1348,20 @@ from your favorite mirror of ftp.gnu.org.
|
||||
where the headers are stable. There are still lots of incompatible changes
|
||||
made and the libc headers have to follow.
|
||||
|
||||
Also, make sure you have a suitably recent kernel. As of the 970401
|
||||
snapshot, according to Philip Blundell <Philip.Blundell@pobox.com>, the
|
||||
required kernel version is at least 2.1.30.
|
||||
{PB} The 2.1 release of GNU libc aims to comply with the current versions of
|
||||
all the relevant standards. The IPv6 support libraries for older Linux
|
||||
systems used a different naming convention and so code written to work with
|
||||
them may need to be modified. If the standards make incompatible changes in
|
||||
the future then the libc may need to change again.
|
||||
|
||||
IPv6 will not work with a 2.0.x kernel. When kernel 2.2 is released it
|
||||
should contain all the necessary support; until then you should use the
|
||||
latest 2.1.x release you can find. As of 98/11/26 the currently recommended
|
||||
kernel for IPv6 is 2.1.129.
|
||||
|
||||
Also, as of the 2.1 release the IPv6 API provided by GNU libc is not
|
||||
100% complete. In particular the getipnodebyname and getipnodebyaddr
|
||||
functions are not implemented.
|
||||
|
||||
|
||||
4.3. When I set the timezone by setting the TZ environment variable
|
||||
@ -1375,6 +1401,21 @@ Looijaard describes a different way installing glibc2 as secondary libc at
|
||||
|
||||
Please note that this is not a complete list.
|
||||
|
||||
|
||||
4.5. The timezone string for Sydney/Australia is wrong since even when
|
||||
daylight saving time is in effect the timezone string is EST.
|
||||
|
||||
{UD} The problem for some timezones is that the local authorities decided
|
||||
to use the term "summer time" instead of "daylight saving time". In this
|
||||
case the abbreviation character `S' is the same as the standard one. So,
|
||||
for Sydney we have
|
||||
|
||||
Eastern Standard Time = EST
|
||||
Eastern Summer Time = EST
|
||||
|
||||
Great! To get this bug fixed convince the authorities to change the laws
|
||||
and regulations of the country this effects. glibc behaves correctly.
|
||||
|
||||
|
||||
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
||||
|
||||
|
51
bits/libc-tsd.h
Normal file
51
bits/libc-tsd.h
Normal file
@ -0,0 +1,51 @@
|
||||
/* libc-internal interface for thread-specific data. Stub version.
|
||||
Copyright (C) 1998 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 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. */
|
||||
|
||||
#ifndef _BITS_LIBC_TSD_H
|
||||
#define _BITS_LIBC_TSD_H 1
|
||||
|
||||
/* This file defines the following macros for accessing a small fixed
|
||||
set of thread-specific `void *' data used only internally by libc.
|
||||
|
||||
__libc_tsd_define(CLASS, KEY) -- Define or declare a `void *' datum
|
||||
for KEY. CLASS can be `static' for
|
||||
keys used in only one source file,
|
||||
empty for global definitions, or
|
||||
`extern' for global declarations.
|
||||
__libc_tsd_get(KEY) -- Return the `void *' datum for KEY.
|
||||
__libc_tsd_set(KEY, VALUE) -- Set the datum for KEY to VALUE.
|
||||
|
||||
The set of available KEY's will usually be provided as an enum,
|
||||
and contains (at least):
|
||||
_LIBC_TSD_KEY_MALLOC
|
||||
_LIBC_TSD_KEY_DL_ERROR
|
||||
All uses must be the literal _LIBC_TSD_* name in the __libc_tsd_* macros.
|
||||
Some implementations may not provide any enum at all and instead
|
||||
using string pasting in the macros. */
|
||||
|
||||
/* This is the generic/stub implementation for wholly single-threaded
|
||||
systems. We don't define an enum for the possible key values, because
|
||||
the KEYs translate directly into variables by macro magic. */
|
||||
|
||||
#define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data;
|
||||
#define __libc_tsd_get(KEY) (__libc_tsd_##KEY##_data)
|
||||
#define __libc_tsd_set(KEY, VALUE) (__libc_tsd_##KEY##_data = (VALUE))
|
||||
|
||||
|
||||
#endif /* bits/libc-tsd.h */
|
@ -161,7 +161,7 @@ main(argc, argv)
|
||||
|
||||
/* Get each key/data pair and add them to the database. */
|
||||
for (recno = 1;; ++recno) {
|
||||
if (dbtype == DB_RECNO)
|
||||
if (dbtype == DB_RECNO) {
|
||||
if (checkprint) {
|
||||
if (dbt_rprint(&data))
|
||||
break;
|
||||
@ -169,7 +169,7 @@ main(argc, argv)
|
||||
if (dbt_rdump(&data))
|
||||
break;
|
||||
}
|
||||
else
|
||||
} else
|
||||
if (checkprint) {
|
||||
if (dbt_rprint(&key))
|
||||
break;
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <elf/ldsodefs.h>
|
||||
#include <bits/libc-lock.h>
|
||||
#include <bits/libc-tsd.h>
|
||||
|
||||
/* This structure communicates state between _dl_catch_error and
|
||||
_dl_signal_error. */
|
||||
@ -36,44 +36,11 @@ struct catch
|
||||
calls can come from `_dl_map_object_deps', `_dlerror_run', or from
|
||||
any of the libc functionality which loads dynamic objects (NSS, iconv).
|
||||
Therefore we have to be prepared to save the state in thread-local
|
||||
memory. `catch' will only be used for the non-threaded case.
|
||||
memory. */
|
||||
|
||||
Please note the horrible kludge we have to use to check for the
|
||||
thread functions to be defined. The problem is that while running
|
||||
ld.so standalone (i.e., before the relocation with the available
|
||||
libc symbols) we do not have a real handling of undefined weak symbols.
|
||||
All symbols are relocated, regardless of the availability. They are
|
||||
relocated relative to the load address of the dynamic linker. Adding
|
||||
this start address to zero (the value in the GOT for undefined symbols)
|
||||
leads to an address which is the load address of ld.so. Once we have
|
||||
relocated with the libc values the value is NULL if the function is
|
||||
not available. Our "solution" is to regard NULL and the ld.so load
|
||||
address as indicators for unavailable weak symbols. */
|
||||
static struct catch *catch;
|
||||
|
||||
#ifdef PIC
|
||||
# define tsd_setspecific(data) \
|
||||
if (__libc_internal_tsd_set != (void *) _dl_rtld_map.l_addr \
|
||||
&& __libc_internal_tsd_set != NULL) \
|
||||
__libc_internal_tsd_set (_LIBC_TSD_KEY_DL_ERROR, data); \
|
||||
else \
|
||||
catch = (data)
|
||||
# define tsd_getspecific() \
|
||||
(__libc_internal_tsd_set != (void *) _dl_rtld_map.l_addr \
|
||||
&& __libc_internal_tsd_set != NULL \
|
||||
? (struct catch *) __libc_internal_tsd_get (_LIBC_TSD_KEY_DL_ERROR) \
|
||||
: catch)
|
||||
#else
|
||||
# define tsd_setspecific(data) \
|
||||
if (__libc_internal_tsd_set != NULL) \
|
||||
__libc_internal_tsd_set (_LIBC_TSD_KEY_DL_ERROR, data); \
|
||||
else \
|
||||
catch = (data)
|
||||
# define tsd_getspecific() \
|
||||
(__libc_internal_tsd_set != NULL \
|
||||
? (struct catch *) __libc_internal_tsd_get (_LIBC_TSD_KEY_DL_ERROR) \
|
||||
: catch)
|
||||
#endif
|
||||
__libc_tsd_define (static, DL_ERROR)
|
||||
#define tsd_getspecific() __libc_tsd_get (DL_ERROR)
|
||||
#define tsd_setspecific(data) __libc_tsd_set (DL_ERROR, (data))
|
||||
|
||||
|
||||
/* This points to a function which is called when an error is
|
||||
|
@ -1,3 +1,25 @@
|
||||
1998-11-29 Roland McGrath <roland@baalperazim.frob.com>
|
||||
|
||||
* sysdeps/pthread/bits/libc-tsd.h (__libc_tsd_define, __libc_tsd_get,
|
||||
__libc_tsd_set): New macros for new interface.
|
||||
* no-tsd.c: New file, provide uninitialized defns of
|
||||
__libc_internal_tsd_get and __libc_internal_tsd_set.
|
||||
* Makefile (routines): Add no-tsd.
|
||||
|
||||
1998-10-12 Roland McGrath <roland@baalperazim.frob.com>
|
||||
|
||||
* internals.h: Include <bits/libc-tsd.h>, not <bits/libc-lock.h>.
|
||||
* sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get,
|
||||
__libc_internal_tsd_set): Move decls to ...
|
||||
* sysdeps/pthread/bits/libc-tsd.h: New file for __libc_internal_tsd_*
|
||||
declarations.
|
||||
|
||||
* sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get,
|
||||
__libc_internal_tsd_set): Make these pointers to functions, not
|
||||
functions; remove #pragma weak decls for them.
|
||||
* specific.c (__libc_internal_tsd_get, __libc_internal_tsd_set):
|
||||
Define static functions and initialized pointers to them.
|
||||
|
||||
1998-11-18 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* Makefile (CFLAGS-mutex.c): Define as -D__NO_WEAK_PTHREAD_ALIASES.
|
||||
|
@ -27,7 +27,7 @@ linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \
|
||||
headers := pthread.h semaphore.h bits/semaphore.h
|
||||
distribute := internals.h queue.h restart.h spinlock.h
|
||||
|
||||
routines := weaks
|
||||
routines := weaks no-tsd
|
||||
|
||||
extra-libs := libpthread
|
||||
extra-libs-others := $(extra-libs)
|
||||
|
@ -16,7 +16,7 @@
|
||||
|
||||
/* Includes */
|
||||
|
||||
#include <bits/libc-lock.h> /* for _LIBC_TSD_KEY_N */
|
||||
#include <bits/libc-tsd.h> /* for _LIBC_TSD_KEY_N */
|
||||
#include <limits.h>
|
||||
#include <setjmp.h>
|
||||
#include <signal.h>
|
||||
|
33
linuxthreads/no-tsd.c
Normal file
33
linuxthreads/no-tsd.c
Normal file
@ -0,0 +1,33 @@
|
||||
/* libc-internal interface for thread-specific data.
|
||||
Copyright (C) 1998 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 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 <bits/libc-tsd.h>
|
||||
|
||||
/* This file provides uinitialized (common) definitions for the
|
||||
hooks used internally by libc to access thread-specific data.
|
||||
|
||||
When -lpthread is used, it provides initialized definitions for these
|
||||
variables (in specific.c), which override these uninitialized definitions.
|
||||
|
||||
If -lpthread is not used, these uninitialized variables default to zero,
|
||||
which the __libc_tsd_* macros check for. */
|
||||
|
||||
void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t));
|
||||
int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t,
|
||||
__const void *));
|
@ -161,17 +161,23 @@ void __pthread_destroy_specifics()
|
||||
|
||||
/* Thread-specific data for libc. */
|
||||
|
||||
int __libc_internal_tsd_set(enum __libc_tsd_key_t key, const void * pointer)
|
||||
static int
|
||||
libc_internal_tsd_set(enum __libc_tsd_key_t key, const void * pointer)
|
||||
{
|
||||
pthread_descr self = thread_self();
|
||||
|
||||
THREAD_SETMEM_NC(self, p_libc_specific[key], (void *) pointer);
|
||||
return 0;
|
||||
}
|
||||
int (*__libc_internal_tsd_set)(enum __libc_tsd_key_t key, const void * pointer)
|
||||
= libc_internal_tsd_set;
|
||||
|
||||
void * __libc_internal_tsd_get(enum __libc_tsd_key_t key)
|
||||
static void *
|
||||
libc_internal_tsd_get(enum __libc_tsd_key_t key)
|
||||
{
|
||||
pthread_descr self = thread_self();
|
||||
|
||||
return THREAD_GETMEM_NC(self, p_libc_specific[key]);
|
||||
}
|
||||
void * (*__libc_internal_tsd_get)(enum __libc_tsd_key_t key)
|
||||
= libc_internal_tsd_get;
|
||||
|
@ -149,19 +149,6 @@ typedef pthread_key_t __libc_key_t;
|
||||
#define __libc_setspecific(KEY, VALUE) \
|
||||
(__pthread_setspecific != NULL ? __pthread_setspecific (KEY, VALUE) : 0)
|
||||
|
||||
#ifdef _LIBC
|
||||
|
||||
/* Fast thread-specific data internal to libc. */
|
||||
enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0,
|
||||
_LIBC_TSD_KEY_DL_ERROR,
|
||||
_LIBC_TSD_KEY_N };
|
||||
|
||||
extern void *__libc_internal_tsd_get __P ((enum __libc_tsd_key_t));
|
||||
extern int __libc_internal_tsd_set __P ((enum __libc_tsd_key_t,
|
||||
__const void *));
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* Register handlers to execute before and after `fork'. */
|
||||
#define __libc_atfork(PREPARE, PARENT, CHILD) \
|
||||
@ -183,8 +170,6 @@ weak_extern (__pthread_mutexattr_settype)
|
||||
weak_extern (__pthread_key_create)
|
||||
weak_extern (__pthread_setspecific)
|
||||
weak_extern (__pthread_getspecific)
|
||||
weak_extern (__libc_internal_tsd_get)
|
||||
weak_extern (__libc_internal_tsd_set)
|
||||
weak_extern (__pthread_once)
|
||||
weak_extern (__pthread_initialize)
|
||||
weak_extern (__pthread_atfork)
|
||||
@ -202,8 +187,6 @@ weak_extern (_pthread_cleanup_pop_restore)
|
||||
# pragma weak __pthread_key_create
|
||||
# pragma weak __pthread_setspecific
|
||||
# pragma weak __pthread_getspecific
|
||||
# pragma weak __libc_internal_tsd_get
|
||||
# pragma weak __libc_internal_tsd_set
|
||||
# pragma weak __pthread_once
|
||||
# pragma weak __pthread_initialize
|
||||
# pragma weak __pthread_atfork
|
||||
|
43
linuxthreads/sysdeps/pthread/bits/libc-tsd.h
Normal file
43
linuxthreads/sysdeps/pthread/bits/libc-tsd.h
Normal file
@ -0,0 +1,43 @@
|
||||
/* libc-internal interface for thread-specific data. LinuxThreads version.
|
||||
Copyright (C) 1997, 1998 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 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. */
|
||||
|
||||
#ifndef _BITS_LIBC_TSD_H
|
||||
#define _BITS_LIBC_TSD_H 1
|
||||
|
||||
|
||||
/* Fast thread-specific data internal to libc. */
|
||||
enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0,
|
||||
_LIBC_TSD_KEY_DL_ERROR,
|
||||
_LIBC_TSD_KEY_N };
|
||||
|
||||
extern void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t));
|
||||
extern int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t,
|
||||
__const void *));
|
||||
|
||||
#define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data;
|
||||
#define __libc_tsd_get(KEY) \
|
||||
(__libc_internal_tsd_get != NULL \
|
||||
? __libc_internal_tsd_get (_LIBC_TSD_KEY_##KEY) \
|
||||
: __libc_tsd_##KEY##_data)
|
||||
#define __libc_tsd_set(KEY, VALUE) \
|
||||
(__libc_internal_tsd_set != NULL \
|
||||
? __libc_internal_tsd_set (_LIBC_TSD_KEY_##KEY, (VALUE)) \
|
||||
: ((__libc_tsd_##KEY##_data = (VALUE)), 0))
|
||||
|
||||
#endif /* bits/libc-tsd.h */
|
@ -40,20 +40,8 @@ typedef pthread_t thread_id;
|
||||
/* mutex */
|
||||
typedef pthread_mutex_t mutex_t;
|
||||
|
||||
/* thread specific data */
|
||||
typedef void * tsd_key_t;
|
||||
|
||||
#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||
|
||||
#define tsd_key_create(key, destr) ( *(key) = NULL )
|
||||
#define tsd_setspecific(key, data) \
|
||||
if (__libc_internal_tsd_set != NULL) { \
|
||||
__libc_internal_tsd_set(_LIBC_TSD_KEY_MALLOC, data); \
|
||||
} else { (key) = (Void_t *) data; }
|
||||
#define tsd_getspecific(key, vptr) \
|
||||
(vptr = (__libc_internal_tsd_get != NULL \
|
||||
? __libc_internal_tsd_get(_LIBC_TSD_KEY_MALLOC) : (key)))
|
||||
|
||||
#define mutex_init(m) \
|
||||
(__pthread_mutex_init != NULL ? __pthread_mutex_init (m, NULL) : 0)
|
||||
#define mutex_lock(m) \
|
||||
@ -85,20 +73,6 @@ typedef void * tsd_key_t;
|
||||
|
||||
#define mutex_trylock(m) (!__mutex_trylock(m))
|
||||
|
||||
#include <hurd/threadvar.h>
|
||||
|
||||
/* thread specific data */
|
||||
typedef int tsd_key_t;
|
||||
|
||||
static int tsd_keys_alloced = 0;
|
||||
|
||||
#define tsd_key_create(key, destr) \
|
||||
(assert (tsd_keys_alloced == 0), tsd_keys_alloced++)
|
||||
#define tsd_setspecific(key, data) \
|
||||
(*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC) = (unsigned long)(data))
|
||||
#define tsd_getspecific(key, vptr) \
|
||||
((vptr) = (void *)*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC))
|
||||
|
||||
#define thread_atfork(prepare, parent, child) do {} while(0)
|
||||
#define thread_atfork_static(prepare, parent, child) \
|
||||
text_set_element(_hurd_fork_prepare_hook, prepare); \
|
||||
@ -114,6 +88,18 @@ static int tsd_keys_alloced = 0;
|
||||
|
||||
#endif /* MUTEX_INITIALIZER && PTHREAD_MUTEX_INITIALIZER */
|
||||
|
||||
|
||||
/* thread specific data */
|
||||
|
||||
#include <bits/libc-tsd.h>
|
||||
|
||||
typedef int tsd_key_t[0]; /* no key data structure, libc magic does it */
|
||||
__libc_tsd_define (, MALLOC) /* declaration/common definition */
|
||||
#define tsd_key_create(key, destr) ((void) (key))
|
||||
#define tsd_setspecific(key, data) __libc_tsd_set (MALLOC, (data))
|
||||
#define tsd_getspecific(key, vptr) ((vptr) = __libc_tsd_get (MALLOC))
|
||||
|
||||
|
||||
#elif defined(USE_PTHREADS) /* Posix threads */
|
||||
|
||||
#include <pthread.h>
|
||||
|
23
misc/err.h
23
misc/err.h
@ -1,5 +1,5 @@
|
||||
/* 4.4BSD utility functions for error messages.
|
||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1996, 1997, 1998 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
|
||||
@ -30,27 +30,28 @@
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
/* Print FORMAT on stderr. */
|
||||
/* Print "program: ", FORMAT, ": ", the standard error string for errno,
|
||||
and a newline, on stderr. */
|
||||
extern void warn __P ((__const char *__format, ...))
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
extern void vwarn __P ((__const char *__format, __gnuc_va_list))
|
||||
__attribute__ ((format (printf, 1, 0)));
|
||||
__attribute__ ((__format__ (__printf__, 1, 0)));
|
||||
|
||||
/* Print "program: ", and FORMAT, and a newline, on stderr. */
|
||||
/* Likewise, but without ": " and the standard error string. */
|
||||
extern void warnx __P ((__const char *__format, ...))
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
extern void vwarnx __P ((__const char *__format, __gnuc_va_list))
|
||||
__attribute__ ((format (printf, 1, 0)));
|
||||
__attribute__ ((__format__ (__printf__, 1, 0)));
|
||||
|
||||
/* Likewise, and then exit with STATUS. */
|
||||
extern void err __P ((int __status, __const char *__format, ...))
|
||||
__attribute__ ((noreturn, format (printf, 2, 3)));
|
||||
__attribute__ ((__noreturn__, __format__ (__printf__, 2, 3)));
|
||||
extern void verr __P ((int __status, __const char *__format, __gnuc_va_list))
|
||||
__attribute__ ((noreturn, format (printf, 2, 0)));
|
||||
__attribute__ ((__noreturn__, __format__ (__printf__, 2, 0)));
|
||||
extern void errx __P ((int __status, __const char *__format, ...))
|
||||
__attribute__ ((noreturn, format (printf, 2, 3)));
|
||||
__attribute__ ((__noreturn__, __format__ (__printf__, 2, 3)));
|
||||
extern void verrx __P ((int __status, __const char *, __gnuc_va_list))
|
||||
__attribute__ ((noreturn, format (printf, 2, 0)));
|
||||
__attribute__ ((__noreturn__, __format__ (__printf__, 2, 0)));
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <sys/un.h>
|
||||
|
||||
#include "nscd-client.h"
|
||||
#include "nscd_proto.h"
|
||||
|
||||
int __nss_not_use_nscd_passwd;
|
||||
|
||||
|
51
sysdeps/generic/bits/libc-tsd.h
Normal file
51
sysdeps/generic/bits/libc-tsd.h
Normal file
@ -0,0 +1,51 @@
|
||||
/* libc-internal interface for thread-specific data. Stub version.
|
||||
Copyright (C) 1998 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 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. */
|
||||
|
||||
#ifndef _BITS_LIBC_TSD_H
|
||||
#define _BITS_LIBC_TSD_H 1
|
||||
|
||||
/* This file defines the following macros for accessing a small fixed
|
||||
set of thread-specific `void *' data used only internally by libc.
|
||||
|
||||
__libc_tsd_define(CLASS, KEY) -- Define or declare a `void *' datum
|
||||
for KEY. CLASS can be `static' for
|
||||
keys used in only one source file,
|
||||
empty for global definitions, or
|
||||
`extern' for global declarations.
|
||||
__libc_tsd_get(KEY) -- Return the `void *' datum for KEY.
|
||||
__libc_tsd_set(KEY, VALUE) -- Set the datum for KEY to VALUE.
|
||||
|
||||
The set of available KEY's will usually be provided as an enum,
|
||||
and contains (at least):
|
||||
_LIBC_TSD_KEY_MALLOC
|
||||
_LIBC_TSD_KEY_DL_ERROR
|
||||
All uses must be the literal _LIBC_TSD_* name in the __libc_tsd_* macros.
|
||||
Some implementations may not provide any enum at all and instead
|
||||
using string pasting in the macros. */
|
||||
|
||||
/* This is the generic/stub implementation for wholly single-threaded
|
||||
systems. We don't define an enum for the possible key values, because
|
||||
the KEYs translate directly into variables by macro magic. */
|
||||
|
||||
#define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data;
|
||||
#define __libc_tsd_get(KEY) (__libc_tsd_##KEY##_data)
|
||||
#define __libc_tsd_set(KEY, VALUE) (__libc_tsd_##KEY##_data = (VALUE))
|
||||
|
||||
|
||||
#endif /* bits/libc-tsd.h */
|
@ -1,6 +1,6 @@
|
||||
/* MT support function to get address of `errno' variable, non-threaded
|
||||
version.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1998 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
|
||||
@ -18,7 +18,8 @@
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
extern int errno;
|
||||
#include <errno.h>
|
||||
#undef errno
|
||||
|
||||
int *
|
||||
weak_const_function
|
||||
|
@ -45,6 +45,9 @@
|
||||
: memcpy (dest, src, n)))
|
||||
/* This looks horribly ugly, but the compiler can optimize it totally,
|
||||
as the count is constant. */
|
||||
__STRING_INLINE void *__memcpy_c (void *__dest, __const void *__src,
|
||||
size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memcpy_c (void *__dest, __const void *__src, size_t __n)
|
||||
{
|
||||
@ -170,6 +173,9 @@ memmove (void *__dest, __const void *__src, size_t __n)
|
||||
: __memset_cg (s, 0x01010101UL * (unsigned char) (c), n))\
|
||||
: __memset_gg (s, c, n)))
|
||||
|
||||
__STRING_INLINE void *__memset_cc (void *__s, unsigned long int __pattern,
|
||||
size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_cc (void *__s, unsigned long int __pattern, size_t __n)
|
||||
{
|
||||
@ -211,7 +217,7 @@ __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
|
||||
return __s;
|
||||
case 2:
|
||||
__COMMON_CODE ("\n\tstosw");
|
||||
return s;
|
||||
return __s;
|
||||
case 3:
|
||||
__COMMON_CODE ("\n\tstosw\n\tstosb");
|
||||
return __s;
|
||||
@ -219,6 +225,8 @@ __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
|
||||
#undef __COMMON_CODE
|
||||
}
|
||||
|
||||
__STRING_INLINE void *__memset_cg (void *__s, unsigned long __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_cg (void *__s, unsigned long __c, size_t __n)
|
||||
{
|
||||
@ -240,6 +248,8 @@ __memset_cg (void *__s, unsigned long __c, size_t __n)
|
||||
return __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE void *__memset_gg (void *__s, char __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_gg (void *__s, char __c, size_t __n)
|
||||
{
|
||||
@ -455,6 +465,8 @@ strncmp (__const char *__s1, __const char *__s2, size_t __n)
|
||||
? __strchr_c (s, ((c) & 0xff) << 8) \
|
||||
: __strchr_g (s, c)))
|
||||
|
||||
__STRING_INLINE char *__strchr_g (__const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strchr_g (__const char *__s, int __c)
|
||||
{
|
||||
@ -478,6 +490,8 @@ __strchr_g (__const char *__s, int __c)
|
||||
return __res - 1;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strchr_c (__const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strchr_c (__const char *__s, int __c)
|
||||
{
|
||||
|
@ -59,6 +59,9 @@
|
||||
? __memcpy_by2 (dest, src, n) \
|
||||
: __memcpy_g (dest, src, n))))
|
||||
|
||||
__STRING_INLINE void *__memcpy_by4 (void *__dest, __const void *__src,
|
||||
size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memcpy_by4 (void *__dest, __const void *__src, size_t __n)
|
||||
{
|
||||
@ -78,6 +81,9 @@ __memcpy_by4 (void *__dest, __const void *__src, size_t __n)
|
||||
return __dest;
|
||||
}
|
||||
|
||||
__STRING_INLINE void *__memcpy_by2 (void *__dest, __const void *__src,
|
||||
size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memcpy_by2 (void *__dest, __const void *__src, size_t __n)
|
||||
{
|
||||
@ -102,7 +108,10 @@ __memcpy_by2 (void *__dest, __const void *__src, size_t __n)
|
||||
return __dest;
|
||||
}
|
||||
|
||||
__STRING_INLINE void *
|
||||
__STRING_INLINE void *__memcpy_g (void *__dest, __const void *__src,
|
||||
size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memcpy_g (void *__dest, __const void *__src, size_t __n)
|
||||
{
|
||||
register unsigned long int __d0, __d1, __d2;
|
||||
@ -203,6 +212,8 @@ memcmp (__const void *__s1, __const void *__s2, size_t __n)
|
||||
? __memset_gc_by2 (s, c, n) \
|
||||
: __memset_gg (s, c, n))))
|
||||
|
||||
__STRING_INLINE void *__memset_cc_by4 (void *__s, int __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_cc_by4 (void *__s, int __c, size_t __n)
|
||||
{
|
||||
@ -220,6 +231,8 @@ __memset_cc_by4 (void *__s, int __c, size_t __n)
|
||||
return __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE void *__memset_cc_by2 (void *__s, int __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_cc_by2 (void *__s, int __c, size_t __n)
|
||||
{
|
||||
@ -241,6 +254,8 @@ __memset_cc_by2 (void *__s, int __c, size_t __n)
|
||||
return __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE void *__memset_gc_by4 (void *__s, int __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_gc_by4 (void *__s, int __c, size_t __n)
|
||||
{
|
||||
@ -262,6 +277,8 @@ __memset_gc_by4 (void *__s, int __c, size_t __n)
|
||||
return __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE void *__memset_gc_by2 (void *__s, int __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_gc_by2 (void *__s, int __c, size_t __n)
|
||||
{
|
||||
@ -287,6 +304,8 @@ __memset_gc_by2 (void *__s, int __c, size_t __n)
|
||||
return __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE void *__memset_cg (void *__s, int __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_cg (void *__s, int __c, size_t __n)
|
||||
{
|
||||
@ -304,6 +323,8 @@ __memset_cg (void *__s, int __c, size_t __n)
|
||||
return __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE void *__memset_gg (void *__s, int __c, size_t __n);
|
||||
|
||||
__STRING_INLINE void *
|
||||
__memset_gg (void *__s, int __c, size_t __n)
|
||||
{
|
||||
@ -362,6 +383,8 @@ memchr (__const void *__s, int __c, size_t __n)
|
||||
(__extension__ (__builtin_constant_p (str) \
|
||||
? __builtin_strlen (str) \
|
||||
: __strlen_g (str)))
|
||||
__STRING_INLINE size_t __strlen_g (__const char *__str);
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strlen_g (__const char *__str)
|
||||
{
|
||||
@ -438,6 +461,8 @@ __strlen_g (__const char *__str)
|
||||
} \
|
||||
(char *) __dest; }))
|
||||
|
||||
__STRING_INLINE char *__strcpy_g (char *__dest, __const char *__src);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strcpy_g (char *__dest, __const char *__src)
|
||||
{
|
||||
@ -530,6 +555,9 @@ __strcpy_g (char *__dest, __const char *__src)
|
||||
} \
|
||||
(char *) __dest; }))
|
||||
|
||||
__STRING_INLINE char *__mempcpy_by4 (char *__dest, __const char *__src,
|
||||
size_t __srclen);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen)
|
||||
{
|
||||
@ -549,6 +577,9 @@ __mempcpy_by4 (char *__dest, __const char *__src, size_t __srclen)
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__mempcpy_by2 (char *__dest, __const char *__src,
|
||||
size_t __srclen);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__mempcpy_by2 (char *__dest, __const char *__src, size_t __srclen)
|
||||
{
|
||||
@ -573,6 +604,9 @@ __mempcpy_by2 (char *__dest, __const char *__src, size_t __srclen)
|
||||
return __tmp + 2;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__mempcpy_byn (char *__dest, __const char *__src,
|
||||
size_t __srclen);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__mempcpy_byn (char *__dest, __const char *__src, size_t __srclen)
|
||||
{
|
||||
@ -595,6 +629,8 @@ __mempcpy_byn (char *__dest, __const char *__src, size_t __srclen)
|
||||
return __tmp;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__stpcpy_g (char *__dest, __const char *__src);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__stpcpy_g (char *__dest, __const char *__src)
|
||||
{
|
||||
@ -633,6 +669,9 @@ __stpcpy_g (char *__dest, __const char *__src)
|
||||
? __strncpy_by2 (dest, src, srclen, n) \
|
||||
: __strncpy_byn (dest, src, srclen, n)))
|
||||
|
||||
__STRING_INLINE char *__strncpy_by4 (char *__dest, __const char __src[],
|
||||
size_t __srclen, size_t __n);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strncpy_by4 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
|
||||
{
|
||||
@ -653,6 +692,9 @@ __strncpy_by4 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
|
||||
return __dest;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strncpy_by2 (char *__dest, __const char __src[],
|
||||
size_t __srclen, size_t __n);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strncpy_by2 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
|
||||
{
|
||||
@ -678,6 +720,9 @@ __strncpy_by2 (char *__dest, __const char __src[], size_t __srclen, size_t __n)
|
||||
return __dest;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strncpy_byn (char *__dest, __const char __src[],
|
||||
size_t __srclen, size_t __n);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strncpy_byn (char *__dest, __const char __src[], size_t __srclen, size_t __n)
|
||||
{
|
||||
@ -701,6 +746,9 @@ __strncpy_byn (char *__dest, __const char __src[], size_t __srclen, size_t __n)
|
||||
return __dest;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strncpy_gg (char *__dest, __const char *__src,
|
||||
size_t __n);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strncpy_gg (char *__dest, __const char *__src, size_t __n)
|
||||
{
|
||||
@ -738,6 +786,9 @@ __strncpy_gg (char *__dest, __const char *__src, size_t __n)
|
||||
? __strcat_c (dest, src, strlen (src) + 1) \
|
||||
: __strcat_g (dest, src)))
|
||||
|
||||
__STRING_INLINE char *__strcat_c (char *__dest, __const char __src[],
|
||||
size_t __srclen);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strcat_c (char *__dest, __const char __src[], size_t __srclen)
|
||||
{
|
||||
@ -765,6 +816,8 @@ __strcat_c (char *__dest, __const char __src[], size_t __srclen)
|
||||
return __dest;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strcat_g (char *__dest, __const char *__src);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strcat_g (char *__dest, __const char *__src)
|
||||
{
|
||||
@ -800,6 +853,9 @@ __strcat_g (char *__dest, __const char *__src)
|
||||
(__const char *) src, n), __dest)) \
|
||||
: __strncat_g (__dest, src, n); }))
|
||||
|
||||
__STRING_INLINE char *__strncat_g (char *__dest, __const char __src[],
|
||||
size_t __n);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strncat_g (char *__dest, __const char __src[], size_t __n)
|
||||
{
|
||||
@ -918,6 +974,8 @@ __strncat_g (char *__dest, __const char __src[], size_t __n)
|
||||
} \
|
||||
__result; }))
|
||||
|
||||
__STRING_INLINE int __strcmp_gg (__const char *__s1, __const char *__s2);
|
||||
|
||||
__STRING_INLINE int
|
||||
__strcmp_gg (__const char *__s1, __const char *__s2)
|
||||
{
|
||||
@ -954,6 +1012,9 @@ __strcmp_gg (__const char *__s1, __const char *__s2)
|
||||
? strcmp (s1, s2) \
|
||||
: __strncmp_g (s1, s2, n))))
|
||||
|
||||
__STRING_INLINE int __strncmp_g (__const char *__s1, __const char *__s2,
|
||||
size_t __n);
|
||||
|
||||
__STRING_INLINE int
|
||||
__strncmp_g (__const char *__s1, __const char *__s2, size_t __n)
|
||||
{
|
||||
@ -991,6 +1052,8 @@ __strncmp_g (__const char *__s1, __const char *__s2, size_t __n)
|
||||
? __strchr_c (s, ((c) & 0xff) << 8) \
|
||||
: __strchr_g (s, c)))
|
||||
|
||||
__STRING_INLINE char *__strchr_c (__const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strchr_c (__const char *__s, int __c)
|
||||
{
|
||||
@ -1012,6 +1075,8 @@ __strchr_c (__const char *__s, int __c)
|
||||
return __res;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strchr_g (__const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strchr_g (__const char *__s, int __c)
|
||||
{
|
||||
@ -1053,6 +1118,8 @@ __strchr_g (__const char *__s, int __c)
|
||||
: __strrchr_g (s, c)))
|
||||
|
||||
#ifdef __i686__
|
||||
__STRING_INLINE char *__strrchr_c (__const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strrchr_c (__const char *__s, int __c)
|
||||
{
|
||||
@ -1072,6 +1139,8 @@ __strrchr_c (__const char *__s, int __c)
|
||||
return __res - 1;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strrchr_g (__const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strrchr_g (__const char *__s, int __c)
|
||||
{
|
||||
@ -1092,6 +1161,8 @@ __strrchr_g (__const char *__s, int __c)
|
||||
return __res - 1;
|
||||
}
|
||||
#else
|
||||
__STRING_INLINE char *__strrchr_c (__const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strrchr_c (__const char *__s, int __c)
|
||||
{
|
||||
@ -1113,6 +1184,8 @@ __strrchr_c (__const char *__s, int __c)
|
||||
return __res;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strrchr_g (__const char *__s, int __c);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strrchr_g (__const char *__s, int __c)
|
||||
{
|
||||
@ -1159,6 +1232,8 @@ __strrchr_g (__const char *__s, int __c)
|
||||
: __strcspn_cg (s, reject, strlen (reject)))) \
|
||||
: __strcspn_g (s, reject)))
|
||||
|
||||
__STRING_INLINE size_t __strcspn_c1 (__const char *__s, int __reject);
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strcspn_c1 (__const char *__s, int __reject)
|
||||
{
|
||||
@ -1179,6 +1254,9 @@ __strcspn_c1 (__const char *__s, int __reject)
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE size_t __strcspn_cg (__const char *__s, __const char __reject[],
|
||||
size_t __reject_len);
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strcspn_cg (__const char *__s, __const char __reject[], size_t __reject_len)
|
||||
{
|
||||
@ -1201,7 +1279,9 @@ __strcspn_cg (__const char *__s, __const char __reject[], size_t __reject_len)
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE size_t __strcspn_g (__const char *__s, __const char *__reject);
|
||||
#ifdef __PIC__
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strcspn_g (__const char *__s, __const char *__reject)
|
||||
{
|
||||
@ -1269,6 +1349,8 @@ __strcspn_g (__const char *__s, __const char *__reject)
|
||||
: __strspn_cg (s, accept, strlen (accept)))) \
|
||||
: __strspn_g (s, accept)))
|
||||
|
||||
__STRING_INLINE size_t __strspn_c1 (__const char *__s, int __accept);
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strspn_c1 (__const char *__s, int __accept)
|
||||
{
|
||||
@ -1287,6 +1369,9 @@ __strspn_c1 (__const char *__s, int __accept)
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE size_t __strspn_cg (__const char *__s, __const char __accept[],
|
||||
size_t __accept_len);
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strspn_cg (__const char *__s, __const char __accept[], size_t __accept_len)
|
||||
{
|
||||
@ -1309,7 +1394,9 @@ __strspn_cg (__const char *__s, __const char __accept[], size_t __accept_len)
|
||||
return (__res - 1) - __s;
|
||||
}
|
||||
|
||||
__STRING_INLINE size_t __strspn_g (__const char *__s, __const char *__accept);
|
||||
#ifdef __PIC__
|
||||
|
||||
__STRING_INLINE size_t
|
||||
__strspn_g (__const char *__s, __const char *__accept)
|
||||
{
|
||||
@ -1375,6 +1462,9 @@ __strspn_g (__const char *__s, __const char *__accept)
|
||||
: __strpbrk_cg (s, accept, strlen (accept)))) \
|
||||
: __strpbrk_g (s, accept)))
|
||||
|
||||
__STRING_INLINE char *__strpbrk_cg (__const char *__s, __const char __accept[],
|
||||
size_t __accept_len);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strpbrk_cg (__const char *__s, __const char __accept[], size_t __accept_len)
|
||||
{
|
||||
@ -1401,7 +1491,9 @@ __strpbrk_cg (__const char *__s, __const char __accept[], size_t __accept_len)
|
||||
return __res;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strpbrk_g (__const char *__s, __const char *__accept);
|
||||
#ifdef __PIC__
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strpbrk_g (__const char *__s, __const char *__accept)
|
||||
{
|
||||
@ -1479,6 +1571,9 @@ __strpbrk_g (__const char *__s, __const char *__accept)
|
||||
|
||||
/* Please note that this function need not handle NEEDLEs with a
|
||||
length shorter than two. */
|
||||
__STRING_INLINE char *__strstr_cg (__const char *__haystack, __const char __needle[],
|
||||
size_t __needle_len);
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strstr_cg (__const char *__haystack, __const char __needle[],
|
||||
size_t __needle_len)
|
||||
@ -1504,7 +1599,9 @@ __strstr_cg (__const char *__haystack, __const char __needle[],
|
||||
return __res;
|
||||
}
|
||||
|
||||
__STRING_INLINE char *__strstr_g (__const char *__haystack, __const char *__needle);
|
||||
#ifdef __PIC__
|
||||
|
||||
__STRING_INLINE char *
|
||||
__strstr_g (__const char *__haystack, __const char *__needle)
|
||||
{
|
||||
|
37
sysdeps/mach/hurd/bits/libc-tsd.h
Normal file
37
sysdeps/mach/hurd/bits/libc-tsd.h
Normal file
@ -0,0 +1,37 @@
|
||||
/* libc-internal interface for thread-specific data. Hurd version.
|
||||
Copyright (C) 1998 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 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. */
|
||||
|
||||
#ifndef _BITS_LIBC_TSD_H
|
||||
#define _BITS_LIBC_TSD_H 1
|
||||
|
||||
#include <hurd/threadvar.h>
|
||||
|
||||
#define __libc_tsd_define(CLASS, KEY) /* nothing, always have threadvars */
|
||||
|
||||
#define __libc_tsd_threadvar_location(KEY) \
|
||||
((void **) __hurd_threadvar_location (_HURD_THREADVAR_##KEY))
|
||||
|
||||
#define __libc_tsd_get(KEY) \
|
||||
(*__libc_tsd_threadvar_location (KEY))
|
||||
|
||||
#define __libc_tsd_set(KEY, VALUE) \
|
||||
(*__libc_tsd_threadvar_location (KEY) = (VALUE))
|
||||
|
||||
|
||||
#endif /* bits/libc-tsd.h */
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995, 1996, 1997, 1998 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
|
||||
@ -50,13 +50,6 @@ struct ipc_perm
|
||||
};
|
||||
|
||||
|
||||
/* Kludge to work around Linux' restriction of only up to five
|
||||
arguments to a system call. */
|
||||
struct ipc_kludge
|
||||
{
|
||||
void *msgp;
|
||||
long int msgtyp;
|
||||
};
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
|
@ -17,8 +17,8 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/fsuid.h>
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/syscall.h>
|
||||
|
@ -17,8 +17,8 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/fsuid.h>
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/syscall.h>
|
||||
|
Loading…
Reference in New Issue
Block a user