glibc/linuxthreads
Ulrich Drepper 9c7ff11a5c Update.
2003-06-11  Ulrich Drepper  <drepper@redhat.com>

	* time/tzfile.c: Add a couple of __builtin_expect.

	Remove warnings gcc 3.3 shows.
	* argp/argp-help.c (hol_entry_short_iterate): Don't inline.
	* elf/dl-load.c (fillin_rpath): Likewise.
	(add_path): Likewise.
	* elf/dl-version.c (find_needed): Always inline.
	* elf/do-lookup.c (FCT): Don't inline.
	* iconv/Makefile: Extend vpath to intl subdir.
	(iconvconfig-modules): Add hash-string.
	* iconv/gconv_charset.h (strip): Don't inline.
	(upstr): Always inline.
	Move __gconv_compare_alias prototype to...
	* iconv/gconv_int.h: ...here.
	* iconv/gconv_db.c: Don't include gconv_charset.h.
	* iconv/gconv_conf.c (add_alias): Don't inline.
	(insert_module): Likewise.
	* iconv/gconv_simple.c (internal_ucs4_loop): Always inline.
	(internal_ucs4_loop_unaligned): Likewise.
	(internal_ucs4_loop_single): Likewise.
	(ucs4_internal_loop): Likewise.
	(ucs4_internal_loop_unaligned): Likewise.
	(ucs4_internal_loop_single): Likewise.
	(internal_ucs4le_loop): Always inline.
	(internal_ucs4le_loop_unaligned): Likewise.
	(internal_ucs4le_loop_single): Likewise.
	(ucs4le_internal_loop): Likewise.
	(ucs4le_internal_loop_unaligned): Likewise.
	(ucs4le_internal_loop_single): Likewise.
	* iconv/loop.c: Always inline the defined functions.
	* iconvdata/cns11642.h: Likewise.
	* iconvdata/cns11642l1.h: Likewise.
	* iconvdata/euc-kr.c: Likewise.
	* iconvdata/gb2312.h: Likewise.
	* iconvdata/jis0201.h: Likewise.
	* iconvdata/jis0208.h: Likewise.
	* iconvdata/jis0212.h: Likewise.
	* iconvdata/jisx0213.h: Likewise.
	* iconvdata/ksc5601.h: Likewise.
	* iconvdata/utf-7.c (base64): Don't inline.
	* include/libc-symbols.h (symbol_set_first_element): Add cast
	(symbol_set_end_p): Likewise.
	* include/set-hooks (RUN_HOOK): Likewise.
	* inet/Makefile (aux): Add ifreq.
	* intl/Makefile (aux): Add some entries from routines.  Add
	hash-string.
	* intl/hash-string.c: New file.
	* intl/hash-string.h: Remove hash_string definition.  Declare
	__hash_string.
	* iconv/gconv_cache.c (find_module_idx): Adjust hash_string caller.
	* iconv/iconvconfig.c (new_name): Likewise.
	* intl/dcigettext.c (_nl_find_msg): Likewise.
	* intl/loadmsgcat.c (_nl_load_domain): Likewise.
	* io/ftw.c (open_dir_stream): Always inline.
	(process_entry): Don't inline.
	* locale/findlocale.c: Include gconv_int.h.
	* locale/setlocale.c (new_composite_name): Don't inline.
	* locale/weight.h (findidx): Always inline.
	* locale/weightwc.h (findidx): Likewise.
	* locale/programs/linereader.c (lr_ignore_rest): Define here.
	* locale/programs/linereader.h (lr_ignore_rest): Don't define here,
	just declare it.
	(lr_getc): Always inline.
	(lr_ungetc): Likewise.
	* nss/nss_files/files-parse.c (parse_list): Likewise.
	* stdio-common/Makefile (aux): Add printf-parsemb and
	printf-parsewc.
	* stdio-common/_itoa.h (_itoa_word): Always inline.
	(_fitoa_word, _fitoa): Don't define here, only declare.
	* stdio-common/_itoa.c (_iftoa_word): Add here.
	(_fitoa): Likewise.
	* stdio-common/_itowa.h (_itowa_word): Always inline.
	* stdio-common/printf-parse.h (read_int): Don't inline.
	(find_spec): Don't define.
	Declare __find_specmb and __find_specwc.
	(parse_one_spec): Don't define.
	Declare __parse_one_specmb and __parse_one_specwc.
	* stdio-common/printf-parsemb.c: New file.
	* stdio-common/printf-parsewc.c: New file.
	* stdio-common/vfprintf.c: Update calls to find_spec and
	parse_one_spec for new names.
	* stdio-common/printf-prs.c: Likewise.  Define DONT_NEED_READ_INT.
	* stdlib/Makefile (aux): Add grouping and groupingwc.
	* stdlib/grouping.c: New file.
	* stdlib/groupingwc.c: New file.
	* stdlib/grouping.h (correctly_grouped_prefix): Don't define here.
	Just prototype.
	* stdlib/rpmatch.c (try): Don't inline.
	* stdlib/strtod.c (round_and_return): Don't line.
	(str_to_mpn): Likewise.
	(__mpn_lshift_1): Always inline.  Optimize only for constant count.
	Adjust for name change of correctly_grouped_prefix.
	* sysdeps/generic/strtol.c: Adjust for name change of
	correctly_grouped_prefix.
	* string/strxfrm.c (utf8_encode): Don't inline.
	* sysdeps/generic/dl-cache.c: Define _dl_cache_libcmp.
	* sysdeps/generic/dl-cache.h: Just declare _dl_cache_libcmp.
	* sysdeps/generic/ifreq.c: New file.
	* sysdeps/unix/sysv/linux/ifreq.c: New file.
	* sysdeps/generic/ifreq.h (__ifreq): Only declare here.
	* sysdeps/unix/sysv/linux/ifreq.h: Likewise.
	* sysdeps/generic/ldsodefs.h (_dl_name_match_p): Always inline.
	* sysdeps/generic/unwind-dw2-fde.c (start_fde_sort): Don't inline.
	(fde_split): Likewise.
	(fde_merge): Likewise.
	(end_fde_sort): Likewise.
	(init_object): Likewise.
	(binary_search_unencoded_fdes): Likewise.
	(binary_search_single_encoding_fdes): Likewise.
	(binary_search_mixed_encoding_fdes): Likewise.
	* sysdeps/generic/wordexp.c (w_addchar): Don't inline.
	* sysdeps/i386/dl-machine.c (elf_machine_runtime_setup): Always inline.
	* sysdeps/posix/sprofil.c (profil_count): Don't inline.
	* sysdeps/unix/sysv/linux/Makefile [subdir=io] (sysdep_routines):
	Add xstatconv.
	* sysdeps/unix/sysv/linux/xstatconv.h: New file.
	* sysdeps/unix/sysv/linux/xstatconv.c: Don't inline the function.
	Export them.  Prepend __ to name.
	* sysdeps/unix/sysv/linux/Dist: Add xstatconv.h.
	* sysdeps/unix/sysv/linux/fxstat.c: Adjust for name change of
	conversion functions.
	* sysdeps/unix/sysv/linux/fxstat64.c: Likewise.
	* sysdeps/unix/sysv/linux/lxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/lxstat64.c: Likewise.
	* sysdeps/unix/sysv/linux/xstat.c: Likewise.
	* sysdeps/unix/sysv/linux/xstat64.c: Likewise.
	* sysdeps/unix/sysv/linux/i386/fxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/i386/lxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/i386/xstat.c: Likewise.
	* sysdeps/unix/sysv/linux/pathconf.c (__statfs_link_max,
	__statfs_filesize_max, __statfs_symlinks): Define here.  __ prepended
	to name.  Change callers.
	* sysdeps/unix/sysv/linux/pathconf.h (__statfs_link_max,
	__statfs_filesize_max, __statfs_symlinks): Don't define here, just
	declare.
	* sysdeps/unix/sysv/linux/fpathconf.c: Change all callers.
	* time/tzfile.c (decode): Always inline.
	* wcsmbs/wcsnrtombs.c: Change type of inbuf to unsigned char*.
	Remove cast in tomb function call.
	* wcsmbs/wcsrtombs.c Likewise.
	* wcsmbs/wcstob.c: Introduce new temp variable to take pointer in
	tomb function call.
2003-06-11 23:22:36 +00:00
..
Examples 2002-11-13 Roland McGrath <roland@redhat.com> 2002-11-14 00:29:07 +00:00
man Update. 2002-07-28 19:04:09 +00:00
sysdeps Update. 2003-06-11 23:22:36 +00:00
alloca_cutoff.c * alloca_cutoff.c: Include internals.h. * sysdeps/pthread/errno-loc.c: Include linuxthreads/internals.h. * sysdeps/pthread/herrno-loc.c: Likewise. * sysdeps/pthread/res-state.c: Likewise. 2003-04-01 00:52:40 +00:00
attr.c Update. 2002-12-18 01:38:17 +00:00
Banner (open_archive): Replace using label 'again' with a loop to work around gcc 3.2 bug. 2002-08-28 12:00:53 +00:00
barrier.c 2002-08-26 Brian Youmans <3diff@gnu.org> 2002-08-26 22:40:48 +00:00
bug-sleep.c Update. 2002-07-10 20:50:46 +00:00
cancel.c * malloc/Versions (GLIBC_PRIVATE): Add __libc_thread_freeres. 2003-02-22 00:55:36 +00:00
ChangeLog Update. 2003-06-11 23:22:36 +00:00
Changes Update. 2000-08-05 08:10:02 +00:00
condvar.c Update. 2003-01-02 11:01:30 +00:00
configure
descr.h Update. 2003-04-26 04:15:50 +00:00
ecmutex.c * Examples/ex13.c: Make local functions static. 2000-12-27 17:14:56 +00:00
errno.c 2002-09-04 Bruno Haible <bruno@clisp.org> 2002-09-05 18:52:18 +00:00
events.c 2002-08-26 Brian Youmans <3diff@gnu.org> 2002-08-26 22:40:48 +00:00
FAQ.html
forward.c Update. 2003-01-03 01:35:14 +00:00
internals.h Update. 2003-04-20 07:39:20 +00:00
join.c Update. 2002-12-18 01:38:17 +00:00
joinrace.c Make local functions static. 2000-12-27 20:26:07 +00:00
libc_pthread_init.c Update. 2002-12-28 22:19:04 +00:00
libc-cancellation.c Update. 2003-01-03 01:35:14 +00:00
libc-tls-loc.c * sysdeps/generic/errno.c (__libc_errno): Remove alias. 2002-11-15 03:37:24 +00:00
libc-tsd.c * sysdeps/generic/errno.c (__libc_errno): Remove alias. 2002-11-15 03:37:24 +00:00
LICENSE
linuxthreads.texi Update. 2001-12-14 22:17:03 +00:00
lockfile.c Update. 2002-12-18 01:38:17 +00:00
Makeconfig * Makeconfig (shared-thread-library): Reverse link order to work 2003-04-23 06:09:13 +00:00
Makefile Update. 2003-06-10 02:32:35 +00:00
manager.c Update. 2003-04-25 22:28:13 +00:00
mutex.c Update. 2002-12-18 01:38:17 +00:00
old_pthread_atfork.c Update. 2002-12-31 08:00:19 +00:00
oldsemaphore.c Update. 2001-05-25 07:39:56 +00:00
pt-allocrtsig.c Update. 2002-12-18 01:38:17 +00:00
pt-machine.c 2002-08-26 Brian Youmans <3diff@gnu.org> 2002-08-26 22:40:48 +00:00
pt-system.c Update. 2003-01-07 00:42:43 +00:00
ptclock_gettime.c 2002-08-26 Brian Youmans <3diff@gnu.org> 2002-08-26 22:40:48 +00:00
ptclock_settime.c 2002-08-26 Brian Youmans <3diff@gnu.org> 2002-08-26 22:40:48 +00:00
ptfork.c Update. 2003-01-03 01:35:14 +00:00
pthandles.c Update. 2002-08-28 06:47:35 +00:00
pthread_atfork.c Update. 2002-12-31 08:00:19 +00:00
pthread.c (__pthread_initialize_manager): Remove one last p_multiple_threads call. 2003-04-26 17:08:49 +00:00
ptlongjmp.c Update. 2003-01-03 01:35:14 +00:00
queue.h
README
README.Xfree3.2
restart.h Update. 2000-04-15 17:39:36 +00:00
rwlock.c 2002-08-26 Brian Youmans <3diff@gnu.org> 2002-08-26 22:40:48 +00:00
semaphore.c Update. 2001-09-12 03:53:07 +00:00
semaphore.h * semaphore.h: Use struct _pthread_fastlock as an element of 2001-06-13 23:12:19 +00:00
shlib-versions Update. 2002-09-05 10:28:51 +00:00
sighandler.c Update. 2002-05-03 07:39:22 +00:00
signals.c Update. 2003-01-07 00:42:43 +00:00
specific.c UPdate. 2003-02-20 00:00:32 +00:00
spinlock.c Update. 2002-08-29 10:42:30 +00:00
spinlock.h Update. 2001-05-24 23:38:52 +00:00
tst-cancel1.c Test of cancellation handling. 2002-12-28 08:45:26 +00:00
tst-cancel2.c Test of cancellation handling. 2002-12-28 08:45:26 +00:00
tst-cancel3.c Test of cancellation handling. 2002-12-28 08:45:26 +00:00
tst-cancel4.c (tf_sleep): Lower sleep time a bit to not upset recent kernels. 2003-03-06 21:39:15 +00:00
tst-cancel5.c Test of cancellation handling. 2002-12-28 08:45:26 +00:00
tst-cancel6.c Test of cancellation handling. 2002-12-28 08:45:26 +00:00
tst-cancel7.c * sysdeps/unix/sysv/linux/sparc/sparc64/sigsuspend.c: Use the 2003-04-02 00:11:05 +00:00
tst-cancel-static.c Update. 2003-01-03 01:35:14 +00:00
tst-cancel-wrappers.sh Update. 2003-01-15 01:23:02 +00:00
tst-cancel.c Update. 2001-04-12 23:09:44 +00:00
tst-context.c * elf/tst-tls4.c: Define an unused TLS variable here, so that no lazy 2002-12-03 01:51:07 +00:00
tst-popen2.c Update. 2003-02-07 06:46:21 +00:00
tst-popen.c Update. 2003-01-09 20:30:21 +00:00
tst-signal.c Test for handling initial signal handler setting correctly. 2002-01-16 00:28:45 +00:00
tst-signal.sh Test for handling initial signal handler setting correctly. 2002-01-16 00:28:45 +00:00
tst-static-locale.c * locale/duplocale.c: Include <string.h>. 2002-08-30 22:07:28 +00:00
tststack.c 2002-08-26 Brian Youmans <3diff@gnu.org> 2002-08-26 22:40:48 +00:00
unload.c * elf/dl-load.c (_dl_map_object_from_fd): Don't check DF_STATIC_TLS. 2002-10-17 12:10:17 +00:00
Versions * Versions (libpthread: GLIBC_2.2): Remove 2003-03-19 03:34:48 +00:00

        Linuxthreads - POSIX 1003.1c kernel threads for Linux

      Copyright 1996, 1997 Xavier Leroy (Xavier.Leroy@inria.fr)


DESCRIPTION:

This is release 0.7 (late beta) of LinuxThreads, a BiCapitalized
implementation of the Posix 1003.1c "pthread" interface for Linux.

LinuxThreads provides kernel-level threads: each thread is a separate
Unix process, sharing its address space with the other threads through
the new system call clone(). Scheduling between threads is handled by
the kernel scheduler, just like scheduling between Unix processes.


REQUIREMENTS:

- Linux version 2.0 and up (requires the new clone() system call
  and the new realtime scheduler).

- For Intel platforms: libc 5.2.18 or later is required.
  5.2.18 or 5.4.12 or later are recommended;
  5.3.12 and 5.4.7 have problems (see the FAQ.html file for more info).

- Also supports glibc 2 (a.k.a. libc 6), which actually comes with
  a specially-adapted version of this library.

- Currently supports Intel, Alpha, Sparc, Motorola 68k, ARM and MIPS
  platforms.

- Multiprocessors are supported.


INSTALLATION:

- Edit the Makefile, set the variables in the "Configuration" section.

- Do "make".

- Do "make install".


USING LINUXTHREADS:

        gcc -D_REENTRANT ... -lpthread

A complete set of manual pages is included. Also see the subdirectory
Examples/ for some sample programs.


STATUS:

- All functions in the Posix 1003.1c base interface implemented.
  Also supports priority scheduling.

- For users of libc 5 (H.J.Lu's libc), a number of C library functions
  are reimplemented or wrapped to make them thread-safe, including:
  * malloc functions
  * stdio functions (define _REENTRANT before including <stdio.h>)
  * per-thread errno variable (define _REENTRANT before including <errno.h>)
  * directory reading functions (opendir(), etc)
  * sleep()
  * gmtime(), localtime()

  New library functions provided:
  * flockfile(), funlockfile(), ftrylockfile()
  * reentrant versions of network database functions (gethostbyname_r(), etc)
    and password functions (getpwnam_r(), etc).

- libc 6 (glibc 2) provides much better thread support than libc 5,
  and comes with a specially-adapted version of LinuxThreads.
  For serious multithreaded programming, you should consider switching
  to glibc 2. It is available from ftp.gnu.org:/pub/gnu and its mirrors.


WARNING:

Many existing libraries are not compatible with LinuxThreads,
either because they are not inherently thread-safe, or because they
have not been compiled with the -D_REENTRANT.  For more info, see the
FAQ.html file in this directory.

A prime example of the latter is Xlib. If you link it with
LinuxThreads, you'll probably get an "unknown 0 error" very
early. This is just a consequence of the Xlib binaries using the
global variable "errno" to fetch error codes, while LinuxThreads and
the C library use the per-thread "errno" location.

See the file README.Xfree3.3 for info on how to compile the Xfree 3.3
libraries to make them compatible with LinuxThreads.


KNOWN BUGS AND LIMITATIONS:

- Threads share pretty much everything they should share according
  to the standard: memory space, file descriptors, signal handlers,
  current working directory, etc. One thing that they do not share
  is their pid's and parent pid's. According to the standard, they
  should have the same, but that's one thing we cannot achieve
  in this implementation (until the CLONE_PID flag to clone() becomes
  usable).

- The current implementation uses the two signals SIGUSR1 and SIGUSR2,
  so user-level code cannot employ them. Ideally, there should be two
  signals reserved for this library. One signal is used for restarting
  threads blocked on mutexes or conditions; the other is for thread
  cancellation.

  *** This is not anymore true when the application runs on a kernel
      newer than approximately 2.1.60.

- The stacks for the threads are allocated high in the memory space,
  below the stack of the initial process, and spaced 2M apart.
  Stacks are allocated with the "grow on demand" flag, so they don't
  use much virtual space initially (4k, currently), but can grow
  up to 2M if needed.

  Reserving such a large address space for each thread means that,
  on a 32-bit architecture, no more than about 1000 threads can
  coexist (assuming a 2Gb address space for user processes),
  but this is reasonable, since each thread uses up one entry in the
  kernel's process table, which is usually limited to 512 processes.

  Another potential problem of the "grow on demand" scheme is that
  nothing prevents the user from mmap'ing something in the 2M address
  window reserved for a thread stack, possibly causing later extensions of
  that stack to fail. Mapping at fixed addresses should be avoided
  when using this library.

- Signal handling does not fully conform to the Posix standard,
  due to the fact that threads are here distinct processes that can be
  sent signals individually, so there's no notion of sending a signal
  to "the" process (the collection of all threads).
  More precisely, here is a summary of the standard requirements
  and how they are met by the implementation:

  1- Synchronous signals (generated by the thread execution, e.g. SIGFPE)
     are delivered to the thread that raised them.
     (OK.)

  2- A fatal asynchronous signal terminates all threads in the process.
     (OK. The thread manager notices when a thread dies on a signal
      and kills all other threads with the same signal.)

  3- An asynchronous signal will be delivered to one of the threads
     of the program which does not block the signal (it is unspecified
     which).
     (No, the signal is delivered to the thread it's been sent to,
      based on the pid of the thread. If that thread is currently
      blocking the signal, the signal remains pending.)

  4- The signal will be delivered to at most one thread.
     (OK, except for signals generated from the terminal or sent to
      the process group, which will be delivered to all threads.)

- The current implementation of the MIPS support assumes a MIPS ISA II
  processor or better.  These processors support atomic operations by
  ll/sc instructions.  Older R2000/R3000 series processors are not
  supported yet; support for these will have higher overhead.

- The current implementation of the ARM support assumes that the SWP
  (atomic swap register with memory) instruction is available.  This is
  the case for all processors except for the ARM1 and ARM2.  On StrongARM,
  the SWP instruction does not bypass the cache, so multi-processor support
  will be more troublesome.