1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
2002-10-09  Ulrich Drepper  <drepper@redhat.com>

	* Versions.def (libc): Add GLIBC_2.3.1.
	(libpthread): Add GLIBC_2.3.1.

	* include/signal.h: Add libc_hidden_proto for __sigwait, __sigwaitinfo,
	and __sigtimedwait.
	* signal/Versions: Add __sigtimedwait, __sigwait, and __sigwaitinfo.
	* sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Add
	libc_hidden_def.
	* sysdeps/unix/sysv/linux/sigwait.c (__sigwait): Likewise.
	* sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise.

	* include/sys/msg.h: Declare __libc_msgrcv and __libc_msgsnd.
	* sysdeps/unix/sysv/linux/msgrcv.c (__msgrcv): Rename to __libc_msgrcv
	and make old name an alias.
	* sysdeps/unix/sysv/linux/msgsnd.c (__msgsnd): Rename to __libc_msgsnd
	and make old name an alias.
	* sysvipc/Versions (libc) [GLIBC_PRIVATE]: Add __libc_msgrcv and
	__libc_msgsnd.

	* include/sys/uio.h: Declare __libc_readv and __libc_writev.
	* misc/Versions (libc) [GLIBC_PRIVATE]: Add __libc_readv and
	__libc_writev.
	* sysdeps/generic/readv.c (__readv): Rename to __libc_readv and make
	old name an alias.
	* sysdeps/posix/readv.c: Likewise
	* sysdeps/unix/sysv/aix/readv.c: Likewise.
	* sysdeps/unix/sysv/linux/readv.c: Likewise.
	* sysdeps/generic/writev.c (__writev): Rename to __libc_writev and make
	old name an alias.
	* sysdeps/posix/writev.c: Likewise
	* sysdeps/unix/sysv/aix/writev.c: Likewise.
	* sysdeps/unix/sysv/linux/writev.c: Likewise.

	* include/sys/wait.h: Declare __waitid.
	* posix/Versions (libc) [GLIBC_PRIVATE]: Add __waitid.
	* sysdeps/generic/waitid.c (waitid): Rename to __waitid and make old
	name an alias.
	* sysdeps/posix/waitid.c: Likewise.
	* sysdeps/unix/sysv/aix/waitid.c: Likewise.

	* sysdeps/unix/sysv/linux/syscalls.list: Add creat syscall.

2002-10-07  Jakub Jelinek  <jakub@redhat.com>

	* include/alloca.h (__libc_use_alloca, __libc_alloca_cutoff): New
	prototypes.
	(__MAX_ALLOCA_CUTOFF): Define.
	Include allocalim.h.
	* resolv/nss_dns/dns-host.c (_nss_dns_gethostbyname2_r,
	_nss_dns_gethostbyaddr_r): Use alloca or malloc to allocate
	host_buffer depending on __libc_use_alloca.
	* resolv/nss_dns/dns-network.c (_nss_dns_getnetbyname_r,
	_nss_dns_getnetbyaddr_r): Use alloca or malloc to allocate
	net_buffer depending on __libc_use_alloca.
	* resolv/res_query.c (res_nquery): Use alloca or malloc to allocate
	buf depending on __libc_use_alloca.
	* resolv/gethnamaddr.c (gethostbyname2, gethostbyaddr): Likewise.
	* stdio-common/vfprintf.c (vfprintf): Use __libc_use_alloca
	instead of hardcoded constants.
	Pass proper size argument to alloca and compute end for wide char
	version.
	* stdio-common/printf_fp.c (__printf_fp): Use __libc_use_alloca
	instead of hardcoded constants.
	* string/strcoll.c (strcoll): Likewise.
	* string/strxfrm.c (strxfrm): Likewise.
	* sysdeps/posix/readv.c (__readv): Likewise.
	* sysdeps/posix/writev.c (__writev): Likewise.
	* sysdeps/generic/allocalim.h: New file.
This commit is contained in:
Ulrich Drepper
2002-10-09 09:42:48 +00:00
parent 4c2821faea
commit 6166815d69
43 changed files with 424 additions and 200 deletions

View File

@ -1,3 +1,74 @@
2002-10-09 Ulrich Drepper <drepper@redhat.com>
* Versions.def (libc): Add GLIBC_2.3.1.
(libpthread): Add GLIBC_2.3.1.
* include/signal.h: Add libc_hidden_proto for __sigwait, __sigwaitinfo,
and __sigtimedwait.
* signal/Versions: Add __sigtimedwait, __sigwait, and __sigwaitinfo.
* sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Add
libc_hidden_def.
* sysdeps/unix/sysv/linux/sigwait.c (__sigwait): Likewise.
* sysdeps/unix/sysv/linux/sigwaitinfo.c (__sigwaitinfo): Likewise.
* include/sys/msg.h: Declare __libc_msgrcv and __libc_msgsnd.
* sysdeps/unix/sysv/linux/msgrcv.c (__msgrcv): Rename to __libc_msgrcv
and make old name an alias.
* sysdeps/unix/sysv/linux/msgsnd.c (__msgsnd): Rename to __libc_msgsnd
and make old name an alias.
* sysvipc/Versions (libc) [GLIBC_PRIVATE]: Add __libc_msgrcv and
__libc_msgsnd.
* include/sys/uio.h: Declare __libc_readv and __libc_writev.
* misc/Versions (libc) [GLIBC_PRIVATE]: Add __libc_readv and
__libc_writev.
* sysdeps/generic/readv.c (__readv): Rename to __libc_readv and make
old name an alias.
* sysdeps/posix/readv.c: Likewise
* sysdeps/unix/sysv/aix/readv.c: Likewise.
* sysdeps/unix/sysv/linux/readv.c: Likewise.
* sysdeps/generic/writev.c (__writev): Rename to __libc_writev and make
old name an alias.
* sysdeps/posix/writev.c: Likewise
* sysdeps/unix/sysv/aix/writev.c: Likewise.
* sysdeps/unix/sysv/linux/writev.c: Likewise.
* include/sys/wait.h: Declare __waitid.
* posix/Versions (libc) [GLIBC_PRIVATE]: Add __waitid.
* sysdeps/generic/waitid.c (waitid): Rename to __waitid and make old
name an alias.
* sysdeps/posix/waitid.c: Likewise.
* sysdeps/unix/sysv/aix/waitid.c: Likewise.
* sysdeps/unix/sysv/linux/syscalls.list: Add creat syscall.
2002-10-07 Jakub Jelinek <jakub@redhat.com>
* include/alloca.h (__libc_use_alloca, __libc_alloca_cutoff): New
prototypes.
(__MAX_ALLOCA_CUTOFF): Define.
Include allocalim.h.
* resolv/nss_dns/dns-host.c (_nss_dns_gethostbyname2_r,
_nss_dns_gethostbyaddr_r): Use alloca or malloc to allocate
host_buffer depending on __libc_use_alloca.
* resolv/nss_dns/dns-network.c (_nss_dns_getnetbyname_r,
_nss_dns_getnetbyaddr_r): Use alloca or malloc to allocate
net_buffer depending on __libc_use_alloca.
* resolv/res_query.c (res_nquery): Use alloca or malloc to allocate
buf depending on __libc_use_alloca.
* resolv/gethnamaddr.c (gethostbyname2, gethostbyaddr): Likewise.
* stdio-common/vfprintf.c (vfprintf): Use __libc_use_alloca
instead of hardcoded constants.
Pass proper size argument to alloca and compute end for wide char
version.
* stdio-common/printf_fp.c (__printf_fp): Use __libc_use_alloca
instead of hardcoded constants.
* string/strcoll.c (strcoll): Likewise.
* string/strxfrm.c (strxfrm): Likewise.
* sysdeps/posix/readv.c (__readv): Likewise.
* sysdeps/posix/writev.c (__writev): Likewise.
* sysdeps/generic/allocalim.h: New file.
2002-10-08 Roland McGrath <roland@redhat.com> 2002-10-08 Roland McGrath <roland@redhat.com>
* configure.in (aux_missing warning): Change "too old" to * configure.in (aux_missing warning): Change "too old" to

View File

@ -11,4 +11,11 @@ extern void *__alloca (size_t __size);
# define __alloca(size) __builtin_alloca (size) # define __alloca(size) __builtin_alloca (size)
#endif /* GCC. */ #endif /* GCC. */
extern int __libc_use_alloca (size_t size) __attribute__ ((const));
extern int __libc_alloca_cutoff (size_t size) __attribute__ ((const));
#define __MAX_ALLOCA_CUTOFF 65536
#include <allocalim.h>
#endif #endif

View File

@ -22,9 +22,12 @@ extern int __sigprocmask (int __how,
extern int __sigsuspend (__const sigset_t *__set); extern int __sigsuspend (__const sigset_t *__set);
libc_hidden_proto (__sigsuspend) libc_hidden_proto (__sigsuspend)
extern int __sigwait (__const sigset_t *__set, int *__sig); extern int __sigwait (__const sigset_t *__set, int *__sig);
libc_hidden_proto (__sigwait)
extern int __sigwaitinfo (__const sigset_t *__set, siginfo_t *__info); extern int __sigwaitinfo (__const sigset_t *__set, siginfo_t *__info);
libc_hidden_proto (__sigwaitinfo)
extern int __sigtimedwait (__const sigset_t *__set, siginfo_t *__info, extern int __sigtimedwait (__const sigset_t *__set, siginfo_t *__info,
__const struct timespec *__timeout); __const struct timespec *__timeout);
libc_hidden_proto (__sigtimedwait)
extern int __sigqueue (__pid_t __pid, int __sig, extern int __sigqueue (__pid_t __pid, int __sig,
__const union sigval __val); __const union sigval __val);
extern int __sigvec (int __sig, __const struct sigvec *__vec, extern int __sigvec (int __sig, __const struct sigvec *__vec,

View File

@ -1 +1,9 @@
#ifndef _SYS_MSG_H
#include <sysvipc/sys/msg.h> #include <sysvipc/sys/msg.h>
extern int __libc_msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp,
int msgflg);
extern int __libc_msgsnd (int msqid, const void *msgp, size_t msgsz,
int msgflg);
#endif

View File

@ -4,6 +4,10 @@
/* Now define the internal interfaces. */ /* Now define the internal interfaces. */
extern ssize_t __readv (int __fd, __const struct iovec *__vector, extern ssize_t __readv (int __fd, __const struct iovec *__vector,
int __count); int __count);
extern ssize_t __libc_readv (int __fd, __const struct iovec *__vector,
int __count);
extern ssize_t __writev (int __fd, __const struct iovec *__vector, extern ssize_t __writev (int __fd, __const struct iovec *__vector,
int __count); int __count);
extern ssize_t __libc_writev (int __fd, __const struct iovec *__vector,
int __count);
#endif #endif

View File

@ -5,6 +5,7 @@
extern __pid_t __waitpid (__pid_t __pid, int *__stat_loc, extern __pid_t __waitpid (__pid_t __pid, int *__stat_loc,
int __options); int __options);
libc_hidden_proto (__waitpid) libc_hidden_proto (__waitpid)
extern int __waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options);
extern __pid_t __libc_waitpid (pid_t __pid, int *__stat_loc, int __options); extern __pid_t __libc_waitpid (pid_t __pid, int *__stat_loc, int __options);
extern __pid_t __libc_wait (int *__stat_loc); extern __pid_t __libc_wait (int *__stat_loc);

View File

@ -20,8 +20,7 @@ libc {
GLIBC_PRIVATE { GLIBC_PRIVATE {
# Internal libc interface to libpthread # Internal libc interface to libpthread
__libc_internal_tsd_get; __libc_internal_tsd_set; __libc_internal_tsd_get; __libc_internal_tsd_set;
__libc_internal_tsd_address; __libc_internal_tsd_address; __libc_alloca_cutoff;
} }
} }
@ -163,7 +162,7 @@ libpthread {
GLIBC_PRIVATE { GLIBC_PRIVATE {
# Internal libc interface to libpthread # Internal libc interface to libpthread
__libc_internal_tsd_get; __libc_internal_tsd_set; __libc_internal_tsd_get; __libc_internal_tsd_set;
__libc_internal_tsd_address; __libc_internal_tsd_address; __libc_alloca_cutoff;
__pthread_kill_other_threads_np; __pthread_kill_other_threads_np;
} }
} }

View File

@ -165,6 +165,8 @@ struct _pthread_descr_struct {
#ifdef USE_TLS #ifdef USE_TLS
char *p_stackaddr; /* Stack address. */ char *p_stackaddr; /* Stack address. */
#endif #endif
size_t p_alloca_cutoff; /* Maximum size which should be allocated
using alloca() instead of malloc(). */
/* New elements must be added at the end. */ /* New elements must be added at the end. */
} __attribute__ ((aligned(32))); /* We need to align the structure so that } __attribute__ ((aligned(32))); /* We need to align the structure so that
doubles are aligned properly. This is 8 doubles are aligned properly. This is 8

View File

@ -334,7 +334,8 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
char ** out_new_thread, char ** out_new_thread,
char ** out_new_thread_bottom, char ** out_new_thread_bottom,
char ** out_guardaddr, char ** out_guardaddr,
size_t * out_guardsize) size_t * out_guardsize,
size_t * out_stacksize)
{ {
pthread_descr new_thread; pthread_descr new_thread;
char * new_thread_bottom; char * new_thread_bottom;
@ -388,6 +389,7 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
/* Clear the thread data structure. */ /* Clear the thread data structure. */
memset (new_thread, '\0', sizeof (*new_thread)); memset (new_thread, '\0', sizeof (*new_thread));
#endif #endif
stacksize = attr->__stacksize;
} }
else else
{ {
@ -559,6 +561,11 @@ static int pthread_allocate_stack(const pthread_attr_t *attr,
*out_new_thread_bottom = new_thread_bottom; *out_new_thread_bottom = new_thread_bottom;
*out_guardaddr = guardaddr; *out_guardaddr = guardaddr;
*out_guardsize = guardsize; *out_guardsize = guardsize;
#ifdef NEED_SEPARATE_REGISTER_STACK
*out_stacksize = stacksize / 2;
#else
*out_stacksize = stacksize;
#endif
return 0; return 0;
} }
@ -575,7 +582,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
char * new_thread_bottom; char * new_thread_bottom;
pthread_t new_thread_id; pthread_t new_thread_id;
char *guardaddr = NULL; char *guardaddr = NULL;
size_t guardsize = 0; size_t guardsize = 0, stksize = 0;
int pagesize = __getpagesize(); int pagesize = __getpagesize();
int saved_errno = 0; int saved_errno = 0;
@ -608,7 +615,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
continue; continue;
if (pthread_allocate_stack(attr, thread_segment(sseg), if (pthread_allocate_stack(attr, thread_segment(sseg),
pagesize, &stack_addr, &new_thread_bottom, pagesize, &stack_addr, &new_thread_bottom,
&guardaddr, &guardsize) == 0) &guardaddr, &guardsize, &stksize) == 0)
{ {
#ifdef USE_TLS #ifdef USE_TLS
new_thread->p_stackaddr = stack_addr; new_thread->p_stackaddr = stack_addr;
@ -639,6 +646,8 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
new_thread->p_guardsize = guardsize; new_thread->p_guardsize = guardsize;
new_thread->p_nr = sseg; new_thread->p_nr = sseg;
new_thread->p_inheritsched = attr ? attr->__inheritsched : 0; new_thread->p_inheritsched = attr ? attr->__inheritsched : 0;
new_thread->p_alloca_cutoff = stksize / 4 > __MAX_ALLOCA_CUTOFF
? __MAX_ALLOCA_CUTOFF : stksize / 4;
/* Initialize the thread handle */ /* Initialize the thread handle */
__pthread_init_lock(&__pthread_handles[sseg].h_lock); __pthread_init_lock(&__pthread_handles[sseg].h_lock);
__pthread_handles[sseg].h_descr = new_thread; __pthread_handles[sseg].h_descr = new_thread;

View File

@ -38,3 +38,8 @@ void **(*__libc_internal_tsd_address) (enum __libc_tsd_key_t)
__THROW __attribute__ ((__const__)); __THROW __attribute__ ((__const__));
#endif /* !(USE_TLS && HAVE___THREAD) */ #endif /* !(USE_TLS && HAVE___THREAD) */
int __libc_alloca_cutoff (size_t size)
{
return size <= __MAX_ALLOCA_CUTOFF;
}

View File

@ -63,58 +63,20 @@ static pthread_descr manager_thread;
/* Descriptor of the initial thread */ /* Descriptor of the initial thread */
struct _pthread_descr_struct __pthread_initial_thread = { struct _pthread_descr_struct __pthread_initial_thread = {
{ .p_header.data.self = &__pthread_initial_thread,
{ .p_nextlive = &__pthread_initial_thread,
.self = &__pthread_initial_thread /* pthread_descr self */ .p_prevlive = &__pthread_initial_thread,
} .p_tid = PTHREAD_THREADS_MAX,
}, .p_lock = &__pthread_handles[0].h_lock,
&__pthread_initial_thread, /* pthread_descr p_nextlive */ .p_start_args = PTHREAD_START_ARGS_INITIALIZER(NULL),
&__pthread_initial_thread, /* pthread_descr p_prevlive */ #if !(USE_TLS && HAVE___THREAD)
NULL, /* pthread_descr p_nextwaiting */ .p_errnop = &_errno,
NULL, /* pthread_descr p_nextlock */ .p_h_errnop = &_h_errno,
PTHREAD_THREADS_MAX, /* pthread_t p_tid */ .p_resp = &_res,
0, /* int p_pid */ #endif
0, /* int p_priority */ .p_userstack = 1,
&__pthread_handles[0].h_lock, /* struct _pthread_fastlock * p_lock */ .p_resume_count = __ATOMIC_INITIALIZER,
0, /* int p_signal */ .p_alloca_cutoff = __MAX_ALLOCA_CUTOFF
NULL, /* sigjmp_buf * p_signal_buf */
NULL, /* sigjmp_buf * p_cancel_buf */
0, /* char p_terminated */
0, /* char p_detached */
0, /* char p_exited */
NULL, /* void * p_retval */
0, /* int p_retval */
NULL, /* pthread_descr p_joining */
NULL, /* struct _pthread_cleanup_buffer * p_cleanup */
0, /* char p_cancelstate */
0, /* char p_canceltype */
0, /* char p_canceled */
NULL, /* char * p_in_sighandler */
0, /* char p_sigwaiting */
PTHREAD_START_ARGS_INITIALIZER(NULL),
/* struct pthread_start_args p_start_args */
{NULL}, /* void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE] */
{NULL}, /* void * p_libc_specific[_LIBC_TSD_KEY_N] */
&_errno, /* int *p_errnop */
0, /* int p_errno */
&_h_errno, /* int *p_h_errnop */
0, /* int p_h_errno */
&_res, /* struct __res_state *p_resp */
{}, /* struct __res_state p_res */
1, /* int p_userstack */
NULL, /* void * p_guardaddr */
0, /* size_t p_guardsize */
0, /* Always index 0 */
0, /* int p_report_events */
{{{0, }}, 0, NULL}, /* td_eventbuf_t p_eventbuf */
__ATOMIC_INITIALIZER, /* struct pthread_atomic p_resume_count */
0, /* char p_woken_by_cancel */
0, /* char p_condvar_avail */
0, /* char p_sem_avail */
NULL, /* struct pthread_extricate_if *p_extricate */
NULL, /* pthread_readlock_info *p_readlock_list; */
NULL, /* pthread_readlock_info *p_readlock_free; */
0 /* int p_untracked_readlock_count; */
}; };
/* Descriptor of the manager thread; none of this is used but the error /* Descriptor of the manager thread; none of this is used but the error
@ -123,58 +85,15 @@ struct _pthread_descr_struct __pthread_initial_thread = {
#define manager_thread (&__pthread_manager_thread) #define manager_thread (&__pthread_manager_thread)
struct _pthread_descr_struct __pthread_manager_thread = { struct _pthread_descr_struct __pthread_manager_thread = {
{ .p_header.data.self = &__pthread_manager_thread,
{ .p_lock = &__pthread_handles[1].h_lock,
.self = &__pthread_manager_thread /* pthread_descr self */ .p_start_args = PTHREAD_START_ARGS_INITIALIZER(__pthread_manager),
} #if !(USE_TLS && HAVE___THREAD)
}, .p_errnop = &__pthread_manager_thread.p_errno,
NULL, /* pthread_descr p_nextlive */ #endif
NULL, /* pthread_descr p_prevlive */ .p_nr = 1,
NULL, /* pthread_descr p_nextwaiting */ .p_resume_count = __ATOMIC_INITIALIZER,
NULL, /* pthread_descr p_nextlock */ .p_alloca_cutoff = PTHREAD_STACK_MIN / 4
0, /* int p_tid */
0, /* int p_pid */
0, /* int p_priority */
&__pthread_handles[1].h_lock, /* struct _pthread_fastlock * p_lock */
0, /* int p_signal */
NULL, /* sigjmp_buf * p_signal_buf */
NULL, /* sigjmp_buf * p_cancel_buf */
0, /* char p_terminated */
0, /* char p_detached */
0, /* char p_exited */
NULL, /* void * p_retval */
0, /* int p_retval */
NULL, /* pthread_descr p_joining */
NULL, /* struct _pthread_cleanup_buffer * p_cleanup */
0, /* char p_cancelstate */
0, /* char p_canceltype */
0, /* char p_canceled */
NULL, /* char * p_in_sighandler */
0, /* char p_sigwaiting */
PTHREAD_START_ARGS_INITIALIZER(__pthread_manager),
/* struct pthread_start_args p_start_args */
{NULL}, /* void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE] */
{NULL}, /* void * p_libc_specific[_LIBC_TSD_KEY_N] */
&__pthread_manager_thread.p_errno, /* int *p_errnop */
0, /* int p_errno */
NULL, /* int *p_h_errnop */
0, /* int p_h_errno */
NULL, /* struct __res_state *p_resp */
{}, /* struct __res_state p_res */
0, /* int p_userstack */
NULL, /* void * p_guardaddr */
0, /* size_t p_guardsize */
1, /* Always index 1 */
0, /* int p_report_events */
{{{0, }}, 0, NULL}, /* td_eventbuf_t p_eventbuf */
__ATOMIC_INITIALIZER, /* struct pthread_atomic p_resume_count */
0, /* char p_woken_by_cancel */
0, /* char p_condvar_avail */
0, /* char p_sem_avail */
NULL, /* struct pthread_extricate_if *p_extricate */
NULL, /* pthread_readlock_info *p_readlock_list; */
NULL, /* pthread_readlock_info *p_readlock_free; */
0 /* int p_untracked_readlock_count; */
}; };
#endif #endif
@ -418,6 +337,7 @@ __pthread_initialize_minimal(void)
# if __LT_SPINLOCK_INIT != 0 # if __LT_SPINLOCK_INIT != 0
self->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER; self->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER;
# endif # endif
self->p_alloca_cutoff = __MAX_ALLOCA_CUTOFF;
/* Another variable which points to the thread descriptor. */ /* Another variable which points to the thread descriptor. */
__pthread_main_thread = self; __pthread_main_thread = self;
@ -487,6 +407,15 @@ __pthread_init_max_stacksize(void)
} }
#endif #endif
__pthread_max_stacksize = max_stack; __pthread_max_stacksize = max_stack;
if (max_stack / 4 < __MAX_ALLOCA_CUTOFF)
{
#ifdef USE_TLS
pthread_descr self = THREAD_SELF;
self->p_alloca_cutoff = max_stack / 4;
#else
__pthread_initial_thread.p_alloca_cutoff = max_stack / 4;
#endif
}
} }
@ -629,6 +558,7 @@ int __pthread_initialize_manager(void)
# if __LT_SPINLOCK_INIT != 0 # if __LT_SPINLOCK_INIT != 0
self->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER; self->p_resume_count = (struct pthread_atomic) __ATOMIC_INITIALIZER;
# endif # endif
tcb->p_alloca_cutoff = PTHREAD_STACK_MIN / 4;
#else #else
tcb = &__pthread_manager_thread; tcb = &__pthread_manager_thread;
#endif #endif

View File

@ -239,3 +239,9 @@ void **(*const __libc_internal_tsd_address) (enum __libc_tsd_key_t key)
__THROW __attribute__ ((__const__)) = libc_internal_tsd_address; __THROW __attribute__ ((__const__)) = libc_internal_tsd_address;
#endif #endif
int __libc_alloca_cutoff (size_t size)
{
pthread_descr self = thread_self();
return size <= THREAD_GETMEM_NC(self, p_alloca_cutoff);
}

View File

@ -0,0 +1,26 @@
/* Determine whether block of given size can be allocated on the stack or not.
Copyright (C) 2002 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 <limits.h>
extern inline int __libc_use_alloca (size_t size)
{
return (__builtin_expect (size <= PTHREAD_STACK_MIN / 4, 1)
|| __libc_alloca_cutoff (size));
}

View File

@ -127,6 +127,10 @@ libc {
# s* # s*
setxattr; setxattr;
} }
GLIBC_2.3.1 {
# Support for cancellation points.
__libc_readv; __libc_writev;
}
GLIBC_PRIVATE { GLIBC_PRIVATE {
# functions which have an additional interface since they are # functions which have an additional interface since they are
# cancelable. # cancelable.

View File

@ -114,5 +114,6 @@ libc {
# are cancelable. # are cancelable.
__libc_wait; __libc_waitpid; __libc_pause; __libc_nanosleep; __libc_fork; __libc_wait; __libc_waitpid; __libc_pause; __libc_nanosleep; __libc_fork;
__libc_pread; __libc_pread64; __libc_pwrite; __libc_pwrite64; __libc_pread; __libc_pread64; __libc_pwrite; __libc_pwrite64;
__waitid;
} }
} }

View File

@ -510,10 +510,11 @@ gethostbyname2(name, af)
const char *name; const char *name;
int af; int af;
{ {
querybuf buf; querybuf *buf;
register const char *cp; register const char *cp;
char *bp; char *bp;
int n, size, type, len; int n, size, type, len, use_malloc = 0;
struct hostent *ret;
extern struct hostent *_gethtbyname2(); extern struct hostent *_gethtbyname2();
if ((_res.options & RES_INIT) == 0 && __res_ninit(&_res) == -1) { if ((_res.options & RES_INIT) == 0 && __res_ninit(&_res) == -1) {
@ -615,13 +616,26 @@ gethostbyname2(name, af)
break; break;
} }
if ((n = res_nsearch(&_res, name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) { if (!__libc_use_alloca (MAXPACKET)) {
buf = (querybuf *) malloc (sizeof (*buf));
if (buf == NULL) {
__set_h_errno (NETDB_INTERNAL);
return NULL;
}
use_malloc = 1;
} else
buf = (querybuf *) alloca (sizeof (*buf));
if ((n = res_nsearch(&_res, name, C_IN, type, buf->buf, sizeof(buf->buf))) < 0) {
dprintf("res_nsearch failed (%d)\n", n); dprintf("res_nsearch failed (%d)\n", n);
if (errno == ECONNREFUSED) if (errno == ECONNREFUSED)
return (_gethtbyname2(name, af)); return (_gethtbyname2(name, af));
return (NULL); return (NULL);
} }
return (getanswer(&buf, n, name, type)); ret = getanswer(buf, n, name, type);
if (use_malloc)
free (buf);
return ret;
} }
struct hostent * struct hostent *
@ -633,9 +647,9 @@ gethostbyaddr(addr, len, af)
const u_char *uaddr = (const u_char *)addr; const u_char *uaddr = (const u_char *)addr;
static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
int n; int n, use_malloc = 0;
socklen_t size; socklen_t size;
querybuf buf; querybuf *buf;
register struct hostent *hp; register struct hostent *hp;
char qbuf[MAXDNAME+1], *qp = NULL; char qbuf[MAXDNAME+1], *qp = NULL;
#ifdef SUNSECURITY #ifdef SUNSECURITY
@ -696,18 +710,34 @@ gethostbyaddr(addr, len, af)
default: default:
abort(); abort();
} }
n = res_nquery(&_res, qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
if (!__libc_use_alloca (MAXPACKET)) {
buf = (querybuf *) malloc (sizeof (*buf));
if (buf == NULL) {
__set_h_errno (NETDB_INTERNAL);
return NULL;
}
use_malloc = 1;
} else
buf = (querybuf *) alloca (sizeof (*buf));
n = res_nquery(&_res, qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf);
if (n < 0 && af == AF_INET6) { if (n < 0 && af == AF_INET6) {
strcpy(qp, "ip6.int"); strcpy(qp, "ip6.int");
n = res_nquery(&_res, qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf); n = res_nquery(&_res, qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf);
} }
if (n < 0) { if (n < 0) {
if (use_malloc)
free (buf);
dprintf("res_nquery failed (%d)\n", n); dprintf("res_nquery failed (%d)\n", n);
if (errno == ECONNREFUSED) if (errno == ECONNREFUSED)
return (_gethtbyaddr(addr, len, af)); return (_gethtbyaddr(addr, len, af));
return (NULL); return (NULL);
} }
if (!(hp = getanswer(&buf, n, qbuf, T_PTR))) hp = getanswer(buf, n, qbuf, T_PTR);
if (use_malloc)
free (buf);
if (!hp)
return (NULL); /* h_errno was set by getanswer() */ return (NULL); /* h_errno was set by getanswer() */
#ifdef SUNSECURITY #ifdef SUNSECURITY
if (af == AF_INET) { if (af == AF_INET) {

View File

@ -132,12 +132,13 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
char *buffer, size_t buflen, int *errnop, char *buffer, size_t buflen, int *errnop,
int *h_errnop) int *h_errnop)
{ {
querybuf host_buffer; querybuf *host_buffer;
char tmp[NS_MAXDNAME]; char tmp[NS_MAXDNAME];
int size, type, n; int size, type, n;
const char *cp; const char *cp;
int map = 0; int map = 0, use_malloc = 0;
int olderr = errno; int olderr = errno;
enum nss_status status;
if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1) if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1)
return NSS_STATUS_UNAVAIL; return NSS_STATUS_UNAVAIL;
@ -169,8 +170,21 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
&& (cp = res_hostalias (&_res, name, tmp, sizeof (tmp))) != NULL) && (cp = res_hostalias (&_res, name, tmp, sizeof (tmp))) != NULL)
name = cp; name = cp;
n = res_nsearch (&_res, name, C_IN, type, host_buffer.buf, if (!__libc_use_alloca (MAXPACKET))
sizeof (host_buffer.buf)); {
host_buffer = (querybuf *) malloc (sizeof (querybuf));
if (host_buffer == NULL)
{
*errnop = ENOMEM;
return NSS_STATUS_UNAVAIL;
}
use_malloc = 1;
}
else
host_buffer = (querybuf *) alloca (sizeof (querybuf));
n = res_nsearch (&_res, name, C_IN, type, host_buffer->buf,
sizeof (host_buffer->buf));
if (n < 0) if (n < 0)
{ {
enum nss_status status = (errno == ECONNREFUSED enum nss_status status = (errno == ECONNREFUSED
@ -185,11 +199,15 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
by having the RES_USE_INET6 bit in _res.options set, we try by having the RES_USE_INET6 bit in _res.options set, we try
another lookup. */ another lookup. */
if (af == AF_INET6 && (_res.options & RES_USE_INET6)) if (af == AF_INET6 && (_res.options & RES_USE_INET6))
n = res_nsearch (&_res, name, C_IN, T_A, host_buffer.buf, n = res_nsearch (&_res, name, C_IN, T_A, host_buffer->buf,
sizeof (host_buffer.buf)); sizeof (host_buffer->buf));
if (n < 0) if (n < 0)
return status; {
if (use_malloc)
free (host_buffer);
return status;
}
map = 1; map = 1;
@ -197,8 +215,11 @@ _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
result->h_length = INADDRSZ;; result->h_length = INADDRSZ;;
} }
return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen, status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen,
errnop, h_errnop, map); errnop, h_errnop, map);
if (use_malloc)
free (host_buffer);
return status;
} }
@ -236,10 +257,10 @@ _nss_dns_gethostbyaddr_r (const void *addr, socklen_t len, int af,
char *h_addr_ptrs[MAX_NR_ADDRS + 1]; char *h_addr_ptrs[MAX_NR_ADDRS + 1];
char linebuffer[0]; char linebuffer[0];
} *host_data = (struct host_data *) buffer; } *host_data = (struct host_data *) buffer;
querybuf host_buffer; querybuf *host_buffer;
char qbuf[MAXDNAME+1], *qp = NULL; char qbuf[MAXDNAME+1], *qp = NULL;
size_t size; size_t size;
int n, status; int n, status, use_malloc = 0;
int olderr = errno; int olderr = errno;
if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1) if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1)
@ -294,23 +315,40 @@ _nss_dns_gethostbyaddr_r (const void *addr, socklen_t len, int af,
break; break;
} }
n = res_nquery (&_res, qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf, if (!__libc_use_alloca (MAXPACKET))
sizeof host_buffer); {
host_buffer = (querybuf *) malloc (sizeof (querybuf));
if (host_buffer == NULL)
{
*errnop = ENOMEM;
return NSS_STATUS_UNAVAIL;
}
use_malloc = 1;
}
else
host_buffer = (querybuf *) alloca (sizeof (querybuf));
n = res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer->buf,
sizeof (host_buffer->buf));
if (n < 0 && af == AF_INET6) if (n < 0 && af == AF_INET6)
{ {
strcpy (qp, "ip6.int"); strcpy (qp, "ip6.int");
n = res_nquery (&_res, qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf, n = res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer->buf,
sizeof host_buffer); sizeof (host_buffer->buf));
} }
if (n < 0) if (n < 0)
{ {
*h_errnop = h_errno; *h_errnop = h_errno;
__set_errno (olderr); __set_errno (olderr);
if (use_malloc)
free (host_buffer);
return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
} }
status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen, status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
errnop, h_errnop, 0 /* XXX */); errnop, h_errnop, 0 /* XXX */);
if (use_malloc)
free (host_buffer);
if (status != NSS_STATUS_SUCCESS) if (status != NSS_STATUS_SUCCESS)
{ {
*h_errnop = h_errno; *h_errnop = h_errno;

View File

@ -110,27 +110,47 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result,
int *herrnop) int *herrnop)
{ {
/* Return entry for network with NAME. */ /* Return entry for network with NAME. */
querybuf net_buffer; querybuf *net_buffer;
int anslen; int anslen, use_malloc = 0;
char *qbuf; char *qbuf;
enum nss_status status;
if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1) if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1)
return NSS_STATUS_UNAVAIL; return NSS_STATUS_UNAVAIL;
qbuf = strdupa (name); qbuf = strdupa (name);
anslen = res_nsearch (&_res, qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
sizeof (querybuf)); if (!__libc_use_alloca (MAXPACKET))
{
net_buffer = (querybuf *) malloc (sizeof (querybuf));
if (net_buffer == NULL)
{
*errnop = ENOMEM;
return NSS_STATUS_UNAVAIL;
}
use_malloc = 1;
}
else
net_buffer = (querybuf *) alloca (sizeof (querybuf));
anslen = res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer->buf,
sizeof (net_buffer->buf));
if (anslen < 0) if (anslen < 0)
{ {
/* Nothing found. */ /* Nothing found. */
*errnop = errno; *errnop = errno;
if (use_malloc)
free (net_buffer);
return (errno == ECONNREFUSED return (errno == ECONNREFUSED
|| errno == EPFNOSUPPORT || errno == EPFNOSUPPORT
|| errno == EAFNOSUPPORT) || errno == EAFNOSUPPORT)
? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
} }
return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME); status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
if (use_malloc)
free (net_buffer);
return status;
} }
@ -141,10 +161,10 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result,
{ {
/* Return entry for network with NAME. */ /* Return entry for network with NAME. */
enum nss_status status; enum nss_status status;
querybuf net_buffer; querybuf *net_buffer;
unsigned int net_bytes[4]; unsigned int net_bytes[4];
char qbuf[MAXDNAME]; char qbuf[MAXDNAME];
int cnt, anslen; int cnt, anslen, use_malloc = 0;
u_int32_t net2; u_int32_t net2;
int olderr = errno; int olderr = errno;
@ -181,20 +201,37 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result,
break; break;
} }
anslen = res_nquery (&_res, qbuf, C_IN, T_PTR, (u_char *) &net_buffer, if (!__libc_use_alloca (MAXPACKET))
sizeof (querybuf)); {
net_buffer = (querybuf *) malloc (sizeof (querybuf));
if (net_buffer == NULL)
{
*errnop = ENOMEM;
return NSS_STATUS_UNAVAIL;
}
use_malloc = 1;
}
else
net_buffer = (querybuf *) alloca (sizeof (querybuf));
anslen = res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer->buf,
sizeof (net_buffer->buf));
if (anslen < 0) if (anslen < 0)
{ {
/* Nothing found. */ /* Nothing found. */
int err = errno; int err = errno;
__set_errno (olderr); __set_errno (olderr);
if (use_malloc)
free (net_buffer);
return (err == ECONNREFUSED return (err == ECONNREFUSED
|| err == EPFNOSUPPORT || err == EPFNOSUPPORT
|| err == EAFNOSUPPORT) || err == EAFNOSUPPORT)
? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
} }
status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR); status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
if (use_malloc)
free (net_buffer);
if (status == NSS_STATUS_SUCCESS) if (status == NSS_STATUS_SUCCESS)
{ {
/* Strip trailing zeros. */ /* Strip trailing zeros. */

View File

@ -108,28 +108,42 @@ res_nquery(res_state statp,
u_char *answer, /* buffer to put answer */ u_char *answer, /* buffer to put answer */
int anslen) /* size of answer buffer */ int anslen) /* size of answer buffer */
{ {
u_char buf[MAXPACKET]; u_char *buf;
HEADER *hp = (HEADER *) answer; HEADER *hp = (HEADER *) answer;
int n; int n, use_malloc = 0;
hp->rcode = NOERROR; /* default */ hp->rcode = NOERROR; /* default */
if (!__libc_use_alloca (MAXPACKET)) {
buf = malloc (MAXPACKET);
if (buf == NULL) {
__set_h_errno (NETDB_INTERNAL);
return -1;
}
use_malloc = 1;
} else
buf = alloca (MAXPACKET);
#ifdef DEBUG #ifdef DEBUG
if (statp->options & RES_DEBUG) if (statp->options & RES_DEBUG)
printf(";; res_query(%s, %d, %d)\n", name, class, type); printf(";; res_query(%s, %d, %d)\n", name, class, type);
#endif #endif
n = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL, n = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL,
buf, sizeof(buf)); buf, MAXPACKET);
if (n <= 0) { if (n <= 0) {
#ifdef DEBUG #ifdef DEBUG
if (statp->options & RES_DEBUG) if (statp->options & RES_DEBUG)
printf(";; res_query: mkquery failed\n"); printf(";; res_query: mkquery failed\n");
#endif #endif
RES_SET_H_ERRNO(statp, NO_RECOVERY); RES_SET_H_ERRNO(statp, NO_RECOVERY);
if (use_malloc)
free (buf);
return (n); return (n);
} }
n = res_nsend(statp, buf, n, answer, anslen); n = res_nsend(statp, buf, n, answer, anslen);
if (use_malloc)
free (buf);
if (n < 0) { if (n < 0) {
#ifdef DEBUG #ifdef DEBUG
if (statp->options & RES_DEBUG) if (statp->options & RES_DEBUG)

View File

@ -49,4 +49,7 @@ libc {
# Needed to provide a pointer to the XPG sigpause function. # Needed to provide a pointer to the XPG sigpause function.
__xpg_sigpause; __xpg_sigpause;
} }
GLIBC_PRIVATE {
__sigtimedwait; __sigwait; __sigwaitinfo;
}
} }

View File

@ -869,7 +869,7 @@ __printf_fp (FILE *fp,
it is possible that we need two more characters in front of all the it is possible that we need two more characters in front of all the
other output. If the amount of memory we have to allocate is too other output. If the amount of memory we have to allocate is too
large use `malloc' instead of `alloca'. */ large use `malloc' instead of `alloca'. */
buffer_malloced = chars_needed > 5000; buffer_malloced = ! __libc_use_alloca (chars_needed * 2 * sizeof (wchar_t));
if (buffer_malloced) if (buffer_malloced)
{ {
wbuffer = (wchar_t *) malloc ((2 + chars_needed) * sizeof (wchar_t)); wbuffer = (wchar_t *) malloc ((2 + chars_needed) * sizeof (wchar_t));

View File

@ -1039,7 +1039,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
\ \
/* Allocate dynamically an array which definitely is long \ /* Allocate dynamically an array which definitely is long \
enough for the wide character version. */ \ enough for the wide character version. */ \
if (len < 8192) \ if (__libc_use_alloca (len * sizeof (wchar_t))) \
string = (CHAR_T *) alloca (len * sizeof (wchar_t)); \ string = (CHAR_T *) alloca (len * sizeof (wchar_t)); \
else if ((string = (CHAR_T *) malloc (len * sizeof (wchar_t))) \ else if ((string = (CHAR_T *) malloc (len * sizeof (wchar_t))) \
== NULL) \ == NULL) \
@ -1201,7 +1201,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
if (prec >= 0) \ if (prec >= 0) \
{ \ { \
/* The string `s2' might not be NUL terminated. */ \ /* The string `s2' might not be NUL terminated. */ \
if (prec < 32768) \ if (__libc_use_alloca (prec)) \
string = (char *) alloca (prec); \ string = (char *) alloca (prec); \
else if ((string = (char *) malloc (prec)) == NULL) \ else if ((string = (char *) malloc (prec)) == NULL) \
{ \ { \
@ -1219,7 +1219,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
{ \ { \
assert (__mbsinit (&mbstate)); \ assert (__mbsinit (&mbstate)); \
s2 = (const wchar_t *) string; \ s2 = (const wchar_t *) string; \
if (len + 1 < 32768) \ if (__libc_use_alloca (len + 1)) \
string = (char *) alloca (len + 1); \ string = (char *) alloca (len + 1); \
else if ((string = (char *) malloc (len + 1)) == NULL) \ else if ((string = (char *) malloc (len + 1)) == NULL) \
{ \ { \
@ -1448,7 +1448,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
{ {
/* We have to use a special buffer. The "32" is just a safe /* We have to use a special buffer. The "32" is just a safe
bet for all the output which is not counted in the width. */ bet for all the output which is not counted in the width. */
if (width < (int) (32768 / sizeof (CHAR_T))) if (__libc_use_alloca ((width + 32) * sizeof (CHAR_T)))
workend = ((CHAR_T *) alloca ((width + 32) * sizeof (CHAR_T)) workend = ((CHAR_T *) alloca ((width + 32) * sizeof (CHAR_T))
+ (width + 32)); + (width + 32));
else else
@ -1473,7 +1473,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
{ {
/* We have to use a special buffer. The "32" is just a safe /* We have to use a special buffer. The "32" is just a safe
bet for all the output which is not counted in the width. */ bet for all the output which is not counted in the width. */
if (width < (int) (32768 / sizeof (CHAR_T))) if (__libc_use_alloca ((width + 32) * sizeof (CHAR_T)))
workend = ((CHAR_T *) alloca ((width + 32) * sizeof (CHAR_T)) workend = ((CHAR_T *) alloca ((width + 32) * sizeof (CHAR_T))
+ (width + 32)); + (width + 32));
else else
@ -1516,8 +1516,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
if (prec > width if (prec > width
&& prec + 32 > (int)(sizeof (work_buffer) / sizeof (work_buffer[0]))) && prec + 32 > (int)(sizeof (work_buffer) / sizeof (work_buffer[0])))
{ {
if (prec < (int) (32768 / sizeof (CHAR_T))) if (__libc_use_alloca ((prec + 32) * sizeof (CHAR_T)))
workend = alloca (prec + 32) + (prec + 32); workend = ((CHAR_T *) alloca ((prec + 32) * sizeof (CHAR_T)))
+ (prec + 32);
else else
{ {
workstart = (CHAR_T *) malloc ((prec + 32) * sizeof (CHAR_T)); workstart = (CHAR_T *) malloc ((prec + 32) * sizeof (CHAR_T));
@ -1832,7 +1833,8 @@ do_positional:
if (MAX (prec, width) + 32 > (int) (sizeof (work_buffer) if (MAX (prec, width) + 32 > (int) (sizeof (work_buffer)
/ sizeof (CHAR_T))) / sizeof (CHAR_T)))
{ {
if (MAX (prec, width) < (int) (32768 / sizeof (CHAR_T))) if (__libc_use_alloca ((MAX (prec, width) + 32)
* sizeof (CHAR_T)))
workend = ((CHAR_T *) alloca ((MAX (prec, width) + 32) workend = ((CHAR_T *) alloca ((MAX (prec, width) + 32)
* sizeof (CHAR_T)) * sizeof (CHAR_T))
+ (MAX (prec, width) + 32)); + (MAX (prec, width) + 32));

View File

@ -155,7 +155,7 @@ STRCOLL (s1, s2, l)
Please note that the localedef programs makes sure that `position' Please note that the localedef programs makes sure that `position'
is not used at the first level. */ is not used at the first level. */
if (s1len + s2len >= 16384) if (! __libc_use_alloca (s1len + s2len))
{ {
idx1arr = (int32_t *) malloc ((s1len + s2len) * (sizeof (int32_t) + 1)); idx1arr = (int32_t *) malloc ((s1len + s2len) * (sizeof (int32_t) + 1));
idx2arr = &idx1arr[s1len]; idx2arr = &idx1arr[s1len];

View File

@ -175,7 +175,7 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l)
values. But since there is no limit on the length of the string values. But since there is no limit on the length of the string
we have to use `malloc' if the string is too long. We should be we have to use `malloc' if the string is too long. We should be
very conservative here. */ very conservative here. */
if (srclen >= 16384) if (! __libc_use_alloca (srclen))
{ {
idxarr = (int32_t *) malloc ((srclen + 1) * (sizeof (int32_t) + 1)); idxarr = (int32_t *) malloc ((srclen + 1) * (sizeof (int32_t) + 1));
rulearr = (unsigned char *) &idxarr[srclen]; rulearr = (unsigned char *) &idxarr[srclen];

View File

@ -0,0 +1,4 @@
extern inline int __libc_use_alloca (size_t size)
{
return size <= __MAX_ALLOCA_CUTOFF;
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. /* Copyright (C) 1991,1995,1996,1997,1998,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -26,7 +26,7 @@
Operates just like `read' (see <unistd.h>) except that data are Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer. */ put in VECTOR instead of a contiguous buffer. */
ssize_t ssize_t
__readv (fd, vector, count) __libc_readv (fd, vector, count)
int fd; int fd;
const struct iovec *vector; const struct iovec *vector;
int count; int count;
@ -34,7 +34,8 @@ __readv (fd, vector, count)
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;
} }
weak_alias (__readv, readv) strong_alias (__libc_readv, __readv)
weak_alias (__libc_readv, readv)
stub_warning (readv) stub_warning (readv)
#include <stub-tag.h> #include <stub-tag.h>

View File

@ -1,5 +1,5 @@
/* Stub version of waitid. /* Stub version of waitid.
Copyright (C) 1997 Free Software Foundation, Inc. Copyright (C) 1997, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -23,7 +23,7 @@
#include <sys/wait.h> #include <sys/wait.h>
int int
waitid (idtype, id, infop, options) __waitid (idtype, id, infop, options)
idtype_t idtype; idtype_t idtype;
id_t id; id_t id;
siginfo_t *infop; siginfo_t *infop;
@ -32,3 +32,4 @@ waitid (idtype, id, infop, options)
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;
} }
weak_alias (__waitid, waitid)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. /* Copyright (C) 1991,1995,1996,1997,1998,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -26,7 +26,7 @@
Operates just like `write' (see <unistd.h>) except that the data Operates just like `write' (see <unistd.h>) except that the data
are taken from VECTOR instead of a contiguous buffer. */ are taken from VECTOR instead of a contiguous buffer. */
ssize_t ssize_t
__writev (fd, vector, count) __libc_writev (fd, vector, count)
int fd; int fd;
const struct iovec *vector; const struct iovec *vector;
int count; int count;
@ -34,7 +34,8 @@ __writev (fd, vector, count)
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;
} }
weak_alias (__writev, writev) strong_alias (__libc_writev, __writev)
weak_alias (__libc_writev, writev)
stub_warning (writev) stub_warning (writev)
#include <stub-tag.h> #include <stub-tag.h>

View File

@ -30,7 +30,7 @@
Operates just like `read' (see <unistd.h>) except that data are Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer. */ put in VECTOR instead of a contiguous buffer. */
ssize_t ssize_t
__readv (int fd, const struct iovec *vector, int count) __libc_readv (int fd, const struct iovec *vector, int count)
{ {
char *buffer; char *buffer;
char *buffer_start; char *buffer_start;
@ -55,8 +55,8 @@ __readv (int fd, const struct iovec *vector, int count)
/* Allocate a temporary buffer to hold the data. We should normally /* Allocate a temporary buffer to hold the data. We should normally
use alloca since it's faster and does not require synchronization use alloca since it's faster and does not require synchronization
with other threads. But we cannot if the amount of memory with other threads. But we cannot if the amount of memory
required is too large. Use 512k as the limit. */ required is too large. */
if (bytes < 512 * 1024) if (__libc_use_alloca (bytes))
buffer = (char *) __alloca (bytes); buffer = (char *) __alloca (bytes);
else else
{ {
@ -94,6 +94,7 @@ __readv (int fd, const struct iovec *vector, int count)
return bytes_read; return bytes_read;
} }
#ifndef __readv #ifndef __libc_readv
weak_alias (__readv, readv) strong_alias (__libc_readv, __readv)
weak_alias (__libc_readv, readv)
#endif #endif

View File

@ -1,5 +1,5 @@
/* Pseudo implementation of waitid. /* Pseudo implementation of waitid.
Copyright (C) 1997, 1998 Free Software Foundation, Inc. Copyright (C) 1997, 1998, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1997. Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1997.
@ -28,7 +28,7 @@
#include <assert.h> #include <assert.h>
int int
waitid (idtype, id, infop, options) __waitid (idtype, id, infop, options)
idtype_t idtype; idtype_t idtype;
id_t id; id_t id;
siginfo_t *infop; siginfo_t *infop;
@ -118,3 +118,4 @@ waitid (idtype, id, infop, options)
return 0; return 0;
} }
weak_alias (__waitid, waitid)

View File

@ -30,7 +30,7 @@
Operates just like `write' (see <unistd.h>) except that the data Operates just like `write' (see <unistd.h>) except that the data
are taken from VECTOR instead of a contiguous buffer. */ are taken from VECTOR instead of a contiguous buffer. */
ssize_t ssize_t
__writev (int fd, const struct iovec *vector, int count) __libc_writev (int fd, const struct iovec *vector, int count)
{ {
char *buffer; char *buffer;
register char *bp; register char *bp;
@ -55,8 +55,8 @@ __writev (int fd, const struct iovec *vector, int count)
/* Allocate a temporary buffer to hold the data. We should normally /* Allocate a temporary buffer to hold the data. We should normally
use alloca since it's faster and does not require synchronization use alloca since it's faster and does not require synchronization
with other threads. But we cannot if the amount of memory with other threads. But we cannot if the amount of memory
required is too large. Use 512k as the limit. */ required is too large. */
if (bytes < 512 * 1024) if (__libc_use_alloca (bytes))
buffer = (char *) __alloca (bytes); buffer = (char *) __alloca (bytes);
else else
{ {
@ -90,6 +90,7 @@ __writev (int fd, const struct iovec *vector, int count)
return bytes_written; return bytes_written;
} }
#ifndef __writev #ifndef __libc_writev
weak_alias (__writev, writev) strong_alias (__libc_writev, __writev)
weak_alias (__libc_writev, writev)
#endif #endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1995-1998, 2000 Free Software Foundation, Inc. /* Copyright (C) 1991, 1995-1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -27,11 +27,12 @@ extern ssize_t kreadv (int fd, const struct iovec *iovp, size_t iovcnt,
Operates just like `read' (see <unistd.h>) except that data are Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer. */ put in VECTOR instead of a contiguous buffer. */
ssize_t ssize_t
__readv (fd, vector, count) __libc_readv (fd, vector, count)
int fd; int fd;
const struct iovec *vector; const struct iovec *vector;
int count; int count;
{ {
return kreadv (fd, vector, count, 0); return kreadv (fd, vector, count, 0);
} }
strong_alias (__readv, readv) strong_alias (__libc_readv, __readv)
weak_alias (__libc_readv, readv)

View File

@ -1,5 +1,5 @@
/* Pseudo implementation of waitid. /* Pseudo implementation of waitid.
Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1997. Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1997.
@ -31,7 +31,7 @@ extern pid_t kwaitpid (int *stat_loc, pid_t pid, int options,
struct rusage *ru_loc, siginfo_t *infop); struct rusage *ru_loc, siginfo_t *infop);
int int
waitid (idtype, id, infop, options) __waitid (idtype, id, infop, options)
idtype_t idtype; idtype_t idtype;
id_t id; id_t id;
siginfo_t *infop; siginfo_t *infop;
@ -80,3 +80,4 @@ waitid (idtype, id, infop, options)
return 0; return 0;
} }
weak_alias (__waitid, waitid)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1995-1998, 2000 Free Software Foundation, Inc. /* Copyright (C) 1991, 1995-1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -27,11 +27,12 @@ extern ssize_t kwritev (int fd, const struct iovec *iovp, size_t iovcnt,
Operates just like `read' (see <unistd.h>) except that data are Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer. */ put in VECTOR instead of a contiguous buffer. */
ssize_t ssize_t
__writev (fd, vector, count) __libc_writev (fd, vector, count)
int fd; int fd;
const struct iovec *vector; const struct iovec *vector;
int count; int count;
{ {
return kwritev (fd, vector, count, 0); return kwritev (fd, vector, count, 0);
} }
strong_alias (__writev, writev) strong_alias (__libc_writev, __writev)
weak_alias (__libc_writev, writev)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1997, 1998, 2000 Free Software Foundation, Inc. /* Copyright (C) 1995, 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@ -36,7 +36,7 @@ struct ipc_kludge
int int
msgrcv (msqid, msgp, msgsz, msgtyp, msgflg) __libc_msgrcv (msqid, msgp, msgsz, msgtyp, msgflg)
int msqid; int msqid;
void *msgp; void *msgp;
size_t msgsz; size_t msgsz;
@ -52,3 +52,4 @@ msgrcv (msqid, msgp, msgsz, msgtyp, msgflg)
return INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg, __ptrvalue (&tmp)); return INLINE_SYSCALL (ipc, 5, IPCOP_msgrcv, msqid, msgsz, msgflg, __ptrvalue (&tmp));
} }
weak_alias (__libc_msgrcv, msgrcv)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. /* Copyright (C) 1995,1997,1998,1999,2000,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, August 1995. Contributed by Ulrich Drepper <drepper@cygnus.com>, August 1995.
@ -27,7 +27,7 @@
#include <bp-checks.h> #include <bp-checks.h>
int int
msgsnd (msqid, msgp, msgsz, msgflg) __libc_msgsnd (msqid, msgp, msgsz, msgflg)
int msqid; int msqid;
const void *msgp; const void *msgp;
size_t msgsz; size_t msgsz;
@ -36,3 +36,4 @@ msgsnd (msqid, msgp, msgsz, msgflg)
return INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz, return INLINE_SYSCALL (ipc, 5, IPCOP_msgsnd, msqid, msgsz,
msgflg, (void *) CHECK_N (msgp, msgsz)); msgflg, (void *) CHECK_N (msgp, msgsz));
} }
weak_alias (__libc_msgsnd, msgsnd)

View File

@ -40,7 +40,7 @@ static ssize_t __atomic_readv_replacement (int, __const struct iovec *,
/* We should deal with kernel which have a smaller UIO_FASTIOV as well /* We should deal with kernel which have a smaller UIO_FASTIOV as well
as a very big count. */ as a very big count. */
ssize_t ssize_t
__readv (fd, vector, count) __libc_readv (fd, vector, count)
int fd; int fd;
const struct iovec *vector; const struct iovec *vector;
int count; int count;
@ -54,7 +54,8 @@ __readv (fd, vector, count)
return __atomic_readv_replacement (fd, vector, count); return __atomic_readv_replacement (fd, vector, count);
} }
weak_alias (__readv, readv) strong_alias (__libc_readv, __readv)
weak_alias (__libc_readv, readv)
#define __readv static internal_function __atomic_readv_replacement #define __libc_readv static internal_function __atomic_readv_replacement
#include <sysdeps/posix/readv.c> #include <sysdeps/posix/readv.c>

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. /* Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -40,6 +40,7 @@ __sigtimedwait (set, info, timeout)
return INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set), return INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set),
CHECK_1 (info), timeout, _NSIG / 8); CHECK_1 (info), timeout, _NSIG / 8);
} }
libc_hidden_def (__sigtimedwait)
weak_alias (__sigtimedwait, sigtimedwait) weak_alias (__sigtimedwait, sigtimedwait)
#else #else
# include <sysdeps/generic/sigtimedwait.c> # include <sysdeps/generic/sigtimedwait.c>

View File

@ -53,6 +53,7 @@ __sigwait (set, sig)
return ret; return ret;
} }
libc_hidden_def (__sigwait)
weak_alias (__sigwait, sigwait) weak_alias (__sigwait, sigwait)
#else #else
# include <sysdeps/posix/sigwait.c> # include <sysdeps/posix/sigwait.c>

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. /* Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -41,6 +41,7 @@ __sigwaitinfo (set, info)
return INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set), return INLINE_SYSCALL (rt_sigtimedwait, 4, CHECK_SIGSET (set),
CHECK_1 (info), NULL, _NSIG / 8); CHECK_1 (info), NULL, _NSIG / 8);
} }
libc_hidden_def (__sigwaitinfo)
weak_alias (__sigwaitinfo, sigwaitinfo) weak_alias (__sigwaitinfo, sigwaitinfo)
#else #else
# include <sysdeps/generic/sigwaitinfo.c> # include <sysdeps/generic/sigwaitinfo.c>

View File

@ -4,6 +4,7 @@ adjtimex adjtime adjtimex i:p __adjtimex adjtimex ntp_adjtime __adjtimex_interna
bdflush EXTRA bdflush i:ii bdflush bdflush EXTRA bdflush i:ii bdflush
capget EXTRA capget i:pp capget capget EXTRA capget i:pp capget
capset EXTRA capset i:pp capset capset EXTRA capset i:pp capset
creat - creat i:si creat
create_module EXTRA create_module 3 create_module create_module EXTRA create_module 3 create_module
delete_module EXTRA delete_module 3 delete_module delete_module EXTRA delete_module 3 delete_module
fdatasync - fdatasync i:i fdatasync fdatasync - fdatasync i:i fdatasync
@ -79,4 +80,3 @@ flistxattr EXTRA flistxattr i:isi flistxattr
removexattr EXTRA removexattr i:ss removexattr removexattr EXTRA removexattr i:ss removexattr
lremovexattr EXTRA lremovexattr i:ss lremovexattr lremovexattr EXTRA lremovexattr i:ss lremovexattr
fremovexattr EXTRA fremovexattr i:is fremovexattr fremovexattr EXTRA fremovexattr i:is fremovexattr

View File

@ -40,7 +40,7 @@ static ssize_t __atomic_writev_replacement (int, const struct iovec *,
/* We should deal with kernel which have a smaller UIO_FASTIOV as well /* We should deal with kernel which have a smaller UIO_FASTIOV as well
as a very big count. */ as a very big count. */
ssize_t ssize_t
__writev (fd, vector, count) __libc_writev (fd, vector, count)
int fd; int fd;
const struct iovec *vector; const struct iovec *vector;
int count; int count;
@ -54,7 +54,8 @@ __writev (fd, vector, count)
return __atomic_writev_replacement (fd, vector, count); return __atomic_writev_replacement (fd, vector, count);
} }
weak_alias (__writev, writev) strong_alias (__libc_writev, __writev)
weak_alias (__libc_writev, writev)
#define __writev static internal_function __atomic_writev_replacement #define __libc_writev static internal_function __atomic_writev_replacement
#include <sysdeps/posix/writev.c> #include <sysdeps/posix/writev.c>

View File

@ -9,4 +9,8 @@ libc {
# s* # s*
semctl; semget; semop; shmat; shmctl; shmdt; shmget; semctl; semget; semop; shmat; shmctl; shmdt; shmget;
} }
GLIBC_2.3.1 {
# Cancellation point entries.
__libc_msgrcv; __libc_msgsnd;
}
} }