1998-06-24  Ulrich Drepper  <drepper@cygnus.com>

	* manager.c (pthread_free): Undo patch from 980430.
	Reported by David Wragg <dpw@doc.ic.ac.uk>.
This commit is contained in:
Ulrich Drepper 1998-06-24 17:43:22 +00:00
parent e951d34052
commit d47aac3999
6 changed files with 42 additions and 26 deletions

View File

@ -563,7 +563,7 @@ _dl_map_object_from_fd (char *name, int fd, char *realname,
/* Read the header directly. */
readbuf = alloca (_dl_pagesize);
readlength = __libc_read (fd, readbuf, _dl_pagesize);
if (readlength < sizeof(*header))
if (readlength < (ssize_t) sizeof(*header))
lose (errno, "cannot read file data");
header = (void *) readbuf;

View File

@ -60,7 +60,7 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start,
end_function endgrent_fct;
setgrent_fct = __nss_lookup_function (nip, "setgrent");
status = (*setgrent_fct) ();
status = _CALL_DL_FCT (setgrent_fct, ());
if (status != NSS_STATUS_SUCCESS)
return status;
@ -71,9 +71,10 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start,
do
{
while ((status =
(*getgrent_fct) (&grpbuf, tmpbuf, buflen, errnop)) ==
NSS_STATUS_TRYAGAIN && *errnop == ERANGE)
while ((status = _CALL_DL_FCT (getgrent_fct,
(&grpbuf, tmpbuf, buflen, errnop)),
status == NSS_STATUS_TRYAGAIN)
&& *errnop == ERANGE)
{
buflen *= 2;
tmpbuf = __alloca (buflen);
@ -114,7 +115,7 @@ compat_call (service_user *nip, const char *user, gid_t group, long int *start,
while (status == NSS_STATUS_SUCCESS);
done:
(*endgrent_fct) ();
_CALL_DL_FCT (endgrent_fct, ());
return NSS_STATUS_SUCCESS;
}
@ -177,8 +178,8 @@ initgroups (user, group)
status = compat_call (nip, user, group, &start, &size, groups,
limit, &errno);
else
status = (*fct) (user, group, &start, &size, groups, limit,
&errno);
status = _CALL_DL_FCT (fct, (user, group, &start, &size, groups, limit,
&errno));
if (nip->next == NULL)
no_more = -1;

View File

@ -1,3 +1,8 @@
1998-06-24 Ulrich Drepper <drepper@cygnus.com>
* manager.c (pthread_free): Undo patch from 980430.
Reported by David Wragg <dpw@doc.ic.ac.uk>.
1998-06-09 15:07 Ulrich Drepper <drepper@cygnus.com>
* manager.c: Define __pthread_manager_adjust_prio and use it to

View File

@ -35,7 +35,11 @@
/* Array of active threads. Entry 0 is reserved for the initial thread. */
struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] =
{ { 0, &__pthread_initial_thread}, /* All NULLs */ };
{ { 0, &__pthread_initial_thread, 0}, /* All NULLs */ };
/* Indicate whether at least one thread has a user-defined stack (if 1),
or if all threads have stacks supplied by LinuxThreads (if 0). */
int __pthread_nonstandard_stacks;
/* Mapping from stack segment to thread descriptor. */
/* Stack segment numbers are also indices into the __pthread_handles array. */
@ -181,6 +185,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
size_t sseg;
int pid;
pthread_descr new_thread;
char * new_thread_bottom;
pthread_t new_thread_id;
void *guardaddr = NULL;
@ -195,6 +200,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
if (attr == NULL || !attr->stackaddr_set)
{
new_thread = thread_segment(sseg);
new_thread_bottom = (char *) new_thread - STACK_SIZE;
/* Allocate space for stack and thread descriptor. */
if (mmap((caddr_t)((char *)(new_thread+1) - INITIAL_STACK_SIZE),
INITIAL_STACK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
@ -219,7 +225,9 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
}
else
{
new_thread = (pthread_descr) attr->stackaddr - 1;
new_thread = (pthread_descr) ((long) attr->stackaddr
& -sizeof(void *)) - 1;
new_thread_bottom = (char *) attr->stackaddr - attr->stacksize;
break;
}
}
@ -258,6 +266,7 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
/* Initialize the thread handle */
__pthread_handles[sseg].h_spinlock = 0; /* should already be 0 */
__pthread_handles[sseg].h_descr = new_thread;
__pthread_handles[sseg].h_bottom = new_thread_bottom;
/* Determine scheduling parameters for the thread */
new_thread->p_start_args.schedpolicy = -1;
if (attr != NULL) {
@ -318,22 +327,12 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr,
static void pthread_free(pthread_descr th)
{
pthread_handle handle;
pthread_descr t;
/* Check that the thread th is still there -- pthread_reap_children
might have deallocated it already */
t = __pthread_main_thread;
do {
if (t == th) break;
t = t->p_nextlive;
} while (t != __pthread_main_thread);
if (t != th) return;
ASSERT(th->p_exited);
/* Make the handle invalid */
handle = thread_handle(th->p_tid);
acquire(&handle->h_spinlock);
handle->h_descr = NULL;
handle->h_bottom = (char *)(-1L);
release(&handle->h_spinlock);
/* If initial thread, nothing to free */
if (th == &__pthread_initial_thread) return;
@ -481,7 +480,7 @@ void __pthread_manager_adjust_prio(int thread_prio)
if (thread_prio <= __pthread_manager_thread.p_priority) return;
param.sched_priority =
thread_prio < __sched_get_priority_max(SCHED_FIFO)
thread_prio < __sched_get_priority_max(SCHED_FIFO)
? thread_prio + 1 : thread_prio;
__sched_setscheduler(__pthread_manager_thread.p_pid, SCHED_FIFO, &param);
__pthread_manager_thread.p_priority = thread_prio;

View File

@ -224,7 +224,16 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer,
/* Be prepared that the set*ent function was not called before. */
if (stream == NULL)
status = internal_setent (0);
{
status = internal_setent (0);
if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
{
fclose (stream);
stream = NULL;
status = NSS_STATUS_UNAVAIL;
}
}
if (status == NSS_STATUS_SUCCESS)
{

View File

@ -246,9 +246,11 @@ extern char *alloca ();
/* Some system header files erroneously define these.
We want our own definitions from <fnmatch.h> to take precedence. */
#undef FNM_PATHNAME
#undef FNM_NOESCAPE
#undef FNM_PERIOD
#ifndef __GNU_LIBRARY__
# undef FNM_PATHNAME
# undef FNM_NOESCAPE
# undef FNM_PERIOD
#endif
#include <fnmatch.h>
/* Some system header files erroneously define these.