mirror of git://sourceware.org/git/glibc.git
Updated to fedora-glibc-20080612T1619
This commit is contained in:
parent
8ba7d5cebb
commit
72d4ac2366
56
ChangeLog
56
ChangeLog
|
|
@ -1,3 +1,53 @@
|
||||||
|
2008-06-12 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* nscd/grpcache.c (cache_addgr): Correctly compute size of
|
||||||
|
fixed-size portion of the record.
|
||||||
|
* nscd/servicescache.c (cache_addserv): Likewise.
|
||||||
|
* nscd/pwdcache.c (cache_addpw): Likewise.
|
||||||
|
* nscd/initgrcache.c (addinitgroupsX): Likewise.
|
||||||
|
|
||||||
|
2008-06-11 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* nscd/mem.c (gc): Initialize obstack earlier so that if we jump
|
||||||
|
out we don't use uninitialized memory.
|
||||||
|
|
||||||
|
* nscd/hstcache.c (cache_addhst): Send correct number of bytes to
|
||||||
|
the client.
|
||||||
|
|
||||||
|
2008-06-10 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* resolv/nss_dns/dns-host.c (gaih_getanswer_slice): Also log and
|
||||||
|
ignore T_DNAME messages.
|
||||||
|
* resolv/arpa/nameser_compat.h (T_DNAME): Define.
|
||||||
|
|
||||||
|
2008-06-05 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* misc/regexp.h (compile): Use __REPB_PREFIX macro.
|
||||||
|
Avoid segfault if first GETC returns eof/'\0'/'\n'.
|
||||||
|
|
||||||
|
2008-06-03 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* nscd/nscd_getserv_r.c (__nscd_getservbyport_r): Pass cp
|
||||||
|
instead of portstr to nscd_getserv_r. Patch by
|
||||||
|
Roman Kagan <rkagan@mail.ru>.
|
||||||
|
|
||||||
|
2008-05-26 Jim Meyering <meyering@redhat.com>
|
||||||
|
|
||||||
|
Remove more useless "if" tests before "free".
|
||||||
|
* include/inline-hashtab.h (htab_delete): Likewise.
|
||||||
|
* libio/freopen.c (freopen): Likewise.
|
||||||
|
* libio/freopen64.c (freopen64): Likewise.
|
||||||
|
* locale/programs/ld-collate.c (collate_read): Likewise.
|
||||||
|
* misc/fstab.c (libc_freeres_fn): Likewise.
|
||||||
|
* posix/glob.c (globfree): Likewise.
|
||||||
|
|
||||||
|
2008-05-24 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* string/Makefile (strop-tests): Add memmem.
|
||||||
|
* string/test-memmem.c: New file.
|
||||||
|
* string/test-string.h (BUF1PAGES): Define to 1 if undefined.
|
||||||
|
(test_init): Size buf1 according to BUF1PAGES.
|
||||||
|
|
||||||
2008-05-24 Jakub Jelinek <jakub@redhat.com>
|
2008-05-24 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* libio/stdio.h (vscanf): Fix -std=c99 redirect.
|
* libio/stdio.h (vscanf): Fix -std=c99 redirect.
|
||||||
|
|
@ -5,8 +55,8 @@
|
||||||
(CFLAGS-scanf17.c): New.
|
(CFLAGS-scanf17.c): New.
|
||||||
* stdio-common/scanf14.c (main): Add fscanf and scanf tests.
|
* stdio-common/scanf14.c (main): Add fscanf and scanf tests.
|
||||||
* stdio-common/scanf15.c (main): Likewise.
|
* stdio-common/scanf15.c (main): Likewise.
|
||||||
* stdio-common/scanf16.c: New test.
|
* stdio-common/scanf16.c: New file.
|
||||||
* stdio-common/scanf17.c: New test.
|
* stdio-common/scanf17.c: New file.
|
||||||
|
|
||||||
2008-05-24 Ulrich Drepper <drepper@redhat.com>
|
2008-05-24 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
|
@ -52,7 +102,7 @@
|
||||||
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
|
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
|
||||||
(__SYSCALL_CLOBBERS): Likewise.
|
(__SYSCALL_CLOBBERS): Likewise.
|
||||||
* scripts/data/localplt-sparc-linux-gnu.data: New file.
|
* scripts/data/localplt-sparc-linux-gnu.data: New file.
|
||||||
* scripts/data/localplt-sparc64-linux-gnu.data: Likewise.
|
* scripts/data/localplt-sparc64-linux-gnu.data: New file.
|
||||||
|
|
||||||
2008-05-21 Jakub Jelinek <jakub@redhat.com>
|
2008-05-21 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,5 +3,5 @@ glibc-branch := fedora
|
||||||
glibc-base := HEAD
|
glibc-base := HEAD
|
||||||
DIST_BRANCH := devel
|
DIST_BRANCH := devel
|
||||||
COLLECTION := dist-f8
|
COLLECTION := dist-f8
|
||||||
fedora-sync-date := 2008-05-24 22:18 UTC
|
fedora-sync-date := 2008-06-12 16:19 UTC
|
||||||
fedora-sync-tag := fedora-glibc-20080524T2218
|
fedora-sync-tag := fedora-glibc-20080612T1619
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
Summary: The GNU libc libraries
|
Summary: The GNU libc libraries
|
||||||
Name: glibc
|
Name: glibc
|
||||||
Version: @glibcversion@
|
Version: @glibcversion@
|
||||||
Release: 5
|
Release: 6
|
||||||
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
|
# GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries.
|
||||||
# Things that are linked directly into dynamically linked programs
|
# Things that are linked directly into dynamically linked programs
|
||||||
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
|
# and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional
|
||||||
|
|
@ -976,6 +976,13 @@ rm -f *.filelist*
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jun 12 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-6
|
||||||
|
- update from trunk
|
||||||
|
- nscd fixes (#450704)
|
||||||
|
- fix getservbyport (#449358)
|
||||||
|
- fix regexp.h (#446406)
|
||||||
|
- avoid crashing on T_DNAME in DNS responses (#450766)
|
||||||
|
|
||||||
* Sun May 25 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-5
|
* Sun May 25 2008 Jakub Jelinek <jakub@redhat.com> 2.8.90-5
|
||||||
- update from trunk
|
- update from trunk
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -142,8 +142,7 @@ htab_delete (struct hashtab *htab)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = htab->size - 1; i >= 0; i--)
|
for (i = htab->size - 1; i >= 0; i--)
|
||||||
if (htab->entries[i])
|
free (htab->entries[i]);
|
||||||
free (htab->entries[i]);
|
|
||||||
|
|
||||||
if (htab->free)
|
if (htab->free)
|
||||||
htab->free (htab->entries);
|
htab->free (htab->entries);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1993,95,96,97,98,2000,2001,2002,2003
|
/* Copyright (C) 1993,95,96,97,98,2000,2001,2002,2003,2008
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
|
@ -80,8 +80,7 @@ freopen (filename, mode, fp)
|
||||||
if (fd != -1)
|
if (fd != -1)
|
||||||
{
|
{
|
||||||
__close (fd);
|
__close (fd);
|
||||||
if (filename != NULL)
|
free ((char *) filename);
|
||||||
free ((char *) filename);
|
|
||||||
}
|
}
|
||||||
_IO_release_lock (fp);
|
_IO_release_lock (fp);
|
||||||
return result;
|
return result;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1993,1995,1996,1997,1998,2000,2001,2002, 2003
|
/* Copyright (C) 1993,1995,1996,1997,1998,2000,2001,2002, 2003, 2008
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
|
@ -64,8 +64,7 @@ freopen64 (filename, mode, fp)
|
||||||
if (fd != -1)
|
if (fd != -1)
|
||||||
{
|
{
|
||||||
__close (fd);
|
__close (fd);
|
||||||
if (filename != NULL)
|
free ((char *) filename);
|
||||||
free ((char *) filename);
|
|
||||||
}
|
}
|
||||||
_IO_release_lock (fp);
|
_IO_release_lock (fp);
|
||||||
return result;
|
return result;
|
||||||
|
|
|
||||||
|
|
@ -2961,8 +2961,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
col_elem_free:
|
col_elem_free:
|
||||||
if (symbol != NULL)
|
free ((char *) symbol);
|
||||||
free ((char *) symbol);
|
|
||||||
free (arg->val.str.startmb);
|
free (arg->val.str.startmb);
|
||||||
free (arg->val.str.startwc);
|
free (arg->val.str.startwc);
|
||||||
}
|
}
|
||||||
|
|
@ -3142,8 +3141,7 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
|
||||||
arg = lr_token (ldfile, charmap, result, repertoire, verbose);
|
arg = lr_token (ldfile, charmap, result, repertoire, verbose);
|
||||||
if (arg->tok != tok_bsymbol)
|
if (arg->tok != tok_bsymbol)
|
||||||
{
|
{
|
||||||
if (newname != NULL)
|
free ((char *) newname);
|
||||||
free ((char *) newname);
|
|
||||||
goto err_label;
|
goto err_label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3157,10 +3155,8 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
|
||||||
"LC_COLLATE");
|
"LC_COLLATE");
|
||||||
|
|
||||||
sym_equiv_free:
|
sym_equiv_free:
|
||||||
if (newname != NULL)
|
free ((char *) newname);
|
||||||
free ((char *) newname);
|
free ((char *) symname);
|
||||||
if (symname != NULL)
|
|
||||||
free ((char *) symname);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (symname == NULL)
|
if (symname == NULL)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
/* Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
|
/* Copyright (C) 1995, 1996, 1997, 1998, 2000, 2008
|
||||||
|
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
|
||||||
|
|
@ -185,6 +186,5 @@ libc_freeres_fn (fstab_free)
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
|
||||||
buffer = fstab_state.fs_buffer;
|
buffer = fstab_state.fs_buffer;
|
||||||
if (buffer != NULL)
|
free ((void *) buffer);
|
||||||
free ((void *) buffer);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
/* Copyright (C) 1996, 1997, 1998, 1999, 2004 Free Software Foundation, Inc.
|
/* Copyright (C) 1996, 1997, 1998, 1999, 2004, 2008
|
||||||
|
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>, 1996.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
|
|
@ -129,8 +130,9 @@ compile (char *__restrict instring, char *__restrict expbuf,
|
||||||
__expr_ptr = (regex_t *) expbuf;
|
__expr_ptr = (regex_t *) expbuf;
|
||||||
/* The remaining space in the buffer can be used for the compiled
|
/* The remaining space in the buffer can be used for the compiled
|
||||||
pattern. */
|
pattern. */
|
||||||
__expr_ptr->buffer = expbuf + sizeof (regex_t);
|
__expr_ptr->__REPB_PREFIX (buffer) = expbuf + sizeof (regex_t);
|
||||||
__expr_ptr->allocated = endbuf - (char *) __expr_ptr->buffer;
|
__expr_ptr->__REPB_PREFIX (allocated)
|
||||||
|
= endbuf - (char *) __expr_ptr->__REPB_PREFIX (buffer);
|
||||||
|
|
||||||
while ((__ch = (GETC ())) != eof)
|
while ((__ch = (GETC ())) != eof)
|
||||||
{
|
{
|
||||||
|
|
@ -162,7 +164,10 @@ compile (char *__restrict instring, char *__restrict expbuf,
|
||||||
}
|
}
|
||||||
__input_buffer[__current_size++] = __ch;
|
__input_buffer[__current_size++] = __ch;
|
||||||
}
|
}
|
||||||
__input_buffer[__current_size++] = '\0';
|
if (__current_size)
|
||||||
|
__input_buffer[__current_size++] = '\0';
|
||||||
|
else
|
||||||
|
__input_buffer = "";
|
||||||
|
|
||||||
/* Now compile the pattern. */
|
/* Now compile the pattern. */
|
||||||
__error = regcomp (__expr_ptr, __input_buffer, REG_NEWLINE);
|
__error = regcomp (__expr_ptr, __input_buffer, REG_NEWLINE);
|
||||||
|
|
@ -198,7 +203,8 @@ compile (char *__restrict instring, char *__restrict expbuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Everything is ok. */
|
/* Everything is ok. */
|
||||||
RETURN ((char *) (__expr_ptr->buffer + __expr_ptr->used));
|
RETURN ((char *) (__expr_ptr->__REPB_PREFIX (buffer)
|
||||||
|
+ __expr_ptr->__REPB_PREFIX (used)));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,45 @@
|
||||||
|
2008-06-12 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/pthread/pthread.h: Remove inadvertant checkin.
|
||||||
|
|
||||||
|
2008-05-17 Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||||
|
|
||||||
|
* sysdeps/pthread/pthread.h: Fix typo in comment.
|
||||||
|
|
||||||
|
2008-05-28 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/pthread/createthread.c (do_clone): Pass accurate length
|
||||||
|
of CPU set to the kernel.
|
||||||
|
|
||||||
|
2008-05-23 Paul Pluzhnikov <ppluzhnikov@google.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Add
|
||||||
|
cfi directives.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_broadcast.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_signal.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_rdlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_unlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_wrlock.S: Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Likewise.
|
||||||
|
|
||||||
|
2008-05-22 Paul Pluzhnikov <ppluzhnikov@google.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedrdlock.S: Add
|
||||||
|
cfi directives.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/i486/pthread_rwlock_timedwrlock.S:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedrdlock.S:
|
||||||
|
Likewise.
|
||||||
|
* sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timedwrlock.S:
|
||||||
|
Likewise.
|
||||||
|
|
||||||
|
2008-05-26 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* tst-typesizes.c: Explicitly check __SIZEOF_PTHREAD_* constants.
|
||||||
|
|
||||||
2008-05-20 Jakub Jelinek <jakub@redhat.com>
|
2008-05-20 Jakub Jelinek <jakub@redhat.com>
|
||||||
David S. Miller <davem@davemloft.net>
|
|
||||||
|
David S. Miller <davem@davemloft.net>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file.
|
* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: New file.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -210,9 +210,9 @@ tests = tst-typesizes \
|
||||||
tst-robust6 tst-robust7 tst-robust8 tst-robust9 \
|
tst-robust6 tst-robust7 tst-robust8 tst-robust9 \
|
||||||
tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \
|
tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 tst-robustpi5 \
|
||||||
tst-robustpi6 tst-robustpi7 tst-robustpi8 tst-robustpi9 \
|
tst-robustpi6 tst-robustpi7 tst-robustpi8 tst-robustpi9 \
|
||||||
tst-rwlock1 tst-rwlock2 tst-rwlock3 tst-rwlock4 tst-rwlock5 \
|
tst-rwlock1 tst-rwlock2 tst-rwlock2a tst-rwlock3 tst-rwlock4 \
|
||||||
tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 tst-rwlock10 \
|
tst-rwlock5 tst-rwlock6 tst-rwlock7 tst-rwlock8 tst-rwlock9 \
|
||||||
tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \
|
tst-rwlock10 tst-rwlock11 tst-rwlock12 tst-rwlock13 tst-rwlock14 \
|
||||||
tst-once1 tst-once2 tst-once3 tst-once4 \
|
tst-once1 tst-once2 tst-once3 tst-once4 \
|
||||||
tst-key1 tst-key2 tst-key3 tst-key4 \
|
tst-key1 tst-key2 tst-key3 tst-key4 \
|
||||||
tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
|
tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2002-2007, 2008 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@redhat.com>, 2002.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||||
|
|
||||||
|
|
@ -98,7 +98,7 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
|
||||||
if (attr->cpuset != NULL)
|
if (attr->cpuset != NULL)
|
||||||
{
|
{
|
||||||
res = INTERNAL_SYSCALL (sched_setaffinity, err, 3, pd->tid,
|
res = INTERNAL_SYSCALL (sched_setaffinity, err, 3, pd->tid,
|
||||||
sizeof (cpu_set_t), attr->cpuset);
|
attr->cpusetsize, attr->cpuset);
|
||||||
|
|
||||||
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
|
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
|
/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
|
@ -127,7 +127,7 @@ enum
|
||||||
# if __WORDSIZE == 64
|
# if __WORDSIZE == 64
|
||||||
# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
|
# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
|
||||||
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
|
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
|
||||||
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }
|
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }
|
||||||
# else
|
# else
|
||||||
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
# if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
|
# define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \
|
||||||
|
|
@ -399,7 +399,7 @@ extern int pthread_attr_getaffinity_np (__const pthread_attr_t *__attr,
|
||||||
|
|
||||||
|
|
||||||
/* Initialize thread attribute *ATTR with attributes corresponding to the
|
/* Initialize thread attribute *ATTR with attributes corresponding to the
|
||||||
already running thread TH. It shall be called on unitialized ATTR
|
already running thread TH. It shall be called on uninitialized ATTR
|
||||||
and destroyed with pthread_attr_destroy when no longer needed. */
|
and destroyed with pthread_attr_destroy when no longer needed. */
|
||||||
extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr)
|
extern int pthread_getattr_np (pthread_t __th, pthread_attr_t *__attr)
|
||||||
__THROW __nonnull ((2));
|
__THROW __nonnull ((2));
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,10 @@
|
||||||
.type pthread_barrier_wait,@function
|
.type pthread_barrier_wait,@function
|
||||||
.align 16
|
.align 16
|
||||||
pthread_barrier_wait:
|
pthread_barrier_wait:
|
||||||
|
cfi_startproc
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
|
||||||
movl 8(%esp), %ebx
|
movl 8(%esp), %ebx
|
||||||
|
|
||||||
|
|
@ -45,6 +48,8 @@ pthread_barrier_wait:
|
||||||
|
|
||||||
/* There are more threads to come. */
|
/* There are more threads to come. */
|
||||||
pushl %esi
|
pushl %esi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%esi, -12)
|
||||||
|
|
||||||
#if CURR_EVENT == 0
|
#if CURR_EVENT == 0
|
||||||
movl (%ebx), %edx
|
movl (%ebx), %edx
|
||||||
|
|
@ -101,9 +106,16 @@ pthread_barrier_wait:
|
||||||
10: movl %esi, %eax /* != PTHREAD_BARRIER_SERIAL_THREAD */
|
10: movl %esi, %eax /* != PTHREAD_BARRIER_SERIAL_THREAD */
|
||||||
|
|
||||||
popl %esi
|
popl %esi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%esi)
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
|
||||||
/* The necessary number of threads arrived. */
|
/* The necessary number of threads arrived. */
|
||||||
3:
|
3:
|
||||||
#if CURR_EVENT == 0
|
#if CURR_EVENT == 0
|
||||||
|
|
@ -140,8 +152,12 @@ pthread_barrier_wait:
|
||||||
5: orl $-1, %eax /* == PTHREAD_BARRIER_SERIAL_THREAD */
|
5: orl $-1, %eax /* == PTHREAD_BARRIER_SERIAL_THREAD */
|
||||||
|
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
1: movl PRIVATE(%ebx), %ecx
|
1: movl PRIVATE(%ebx), %ecx
|
||||||
leal MUTEX(%ebx), %edx
|
leal MUTEX(%ebx), %edx
|
||||||
xorl $LLL_SHARED, %ecx
|
xorl $LLL_SHARED, %ecx
|
||||||
|
|
@ -154,6 +170,8 @@ pthread_barrier_wait:
|
||||||
call __lll_unlock_wake
|
call __lll_unlock_wake
|
||||||
jmp 5b
|
jmp 5b
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%esi, -12)
|
||||||
6: movl PRIVATE(%ebx), %ecx
|
6: movl PRIVATE(%ebx), %ecx
|
||||||
leal MUTEX(%ebx), %eax
|
leal MUTEX(%ebx), %eax
|
||||||
xorl $LLL_SHARED, %ecx
|
xorl $LLL_SHARED, %ecx
|
||||||
|
|
@ -165,4 +183,5 @@ pthread_barrier_wait:
|
||||||
xorl $LLL_SHARED, %ecx
|
xorl $LLL_SHARED, %ecx
|
||||||
call __lll_unlock_wake
|
call __lll_unlock_wake
|
||||||
jmp 10b
|
jmp 10b
|
||||||
|
cfi_endproc
|
||||||
.size pthread_barrier_wait,.-pthread_barrier_wait
|
.size pthread_barrier_wait,.-pthread_barrier_wait
|
||||||
|
|
|
||||||
|
|
@ -32,11 +32,19 @@
|
||||||
.type __pthread_cond_broadcast, @function
|
.type __pthread_cond_broadcast, @function
|
||||||
.align 16
|
.align 16
|
||||||
__pthread_cond_broadcast:
|
__pthread_cond_broadcast:
|
||||||
|
cfi_startproc
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %esi
|
pushl %esi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %edi
|
pushl %edi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
cfi_offset(%esi, -12)
|
||||||
|
cfi_offset(%edi, -16)
|
||||||
|
cfi_offset(%ebp, -20)
|
||||||
|
|
||||||
movl 20(%esp), %ebx
|
movl 20(%esp), %ebx
|
||||||
|
|
||||||
|
|
@ -114,11 +122,24 @@ __pthread_cond_broadcast:
|
||||||
|
|
||||||
10: xorl %eax, %eax
|
10: xorl %eax, %eax
|
||||||
popl %ebp
|
popl %ebp
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebp)
|
||||||
popl %edi
|
popl %edi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%edi)
|
||||||
popl %esi
|
popl %esi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%esi)
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(16)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
cfi_offset(%esi, -12)
|
||||||
|
cfi_offset(%edi, -16)
|
||||||
|
cfi_offset(%ebp, -20)
|
||||||
.align 16
|
.align 16
|
||||||
/* Unlock. */
|
/* Unlock. */
|
||||||
4: LOCK
|
4: LOCK
|
||||||
|
|
@ -127,11 +148,24 @@ __pthread_cond_broadcast:
|
||||||
|
|
||||||
6: xorl %eax, %eax
|
6: xorl %eax, %eax
|
||||||
popl %ebp
|
popl %ebp
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebp)
|
||||||
popl %edi
|
popl %edi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%edi)
|
||||||
popl %esi
|
popl %esi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%esi)
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(16)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
cfi_offset(%esi, -12)
|
||||||
|
cfi_offset(%edi, -16)
|
||||||
|
cfi_offset(%ebp, -20)
|
||||||
/* Initial locking failed. */
|
/* Initial locking failed. */
|
||||||
1:
|
1:
|
||||||
#if cond_lock == 0
|
#if cond_lock == 0
|
||||||
|
|
@ -199,6 +233,7 @@ __pthread_cond_broadcast:
|
||||||
movl $SYS_futex, %eax
|
movl $SYS_futex, %eax
|
||||||
ENTER_KERNEL
|
ENTER_KERNEL
|
||||||
jmp 10b
|
jmp 10b
|
||||||
|
cfi_endproc
|
||||||
.size __pthread_cond_broadcast, .-__pthread_cond_broadcast
|
.size __pthread_cond_broadcast, .-__pthread_cond_broadcast
|
||||||
versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
|
versioned_symbol (libpthread, __pthread_cond_broadcast, pthread_cond_broadcast,
|
||||||
GLIBC_2_3_2)
|
GLIBC_2_3_2)
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,13 @@
|
||||||
.align 16
|
.align 16
|
||||||
__pthread_cond_signal:
|
__pthread_cond_signal:
|
||||||
|
|
||||||
|
cfi_startproc
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %edi
|
pushl %edi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
cfi_offset(%edi, -12)
|
||||||
|
|
||||||
movl 12(%esp), %edi
|
movl 12(%esp), %edi
|
||||||
|
|
||||||
|
|
@ -69,7 +74,12 @@ __pthread_cond_signal:
|
||||||
|
|
||||||
/* Wake up one thread. */
|
/* Wake up one thread. */
|
||||||
pushl %esi
|
pushl %esi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%esi, -16)
|
||||||
|
cfi_offset(%ebp, -20)
|
||||||
|
|
||||||
#if FUTEX_PRIVATE_FLAG > 255
|
#if FUTEX_PRIVATE_FLAG > 255
|
||||||
xorl %ecx, %ecx
|
xorl %ecx, %ecx
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -91,7 +101,11 @@ __pthread_cond_signal:
|
||||||
ENTER_KERNEL */
|
ENTER_KERNEL */
|
||||||
int $0x80
|
int $0x80
|
||||||
popl %ebp
|
popl %ebp
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebp)
|
||||||
popl %esi
|
popl %esi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%esi)
|
||||||
|
|
||||||
/* For any kind of error, we try again with WAKE.
|
/* For any kind of error, we try again with WAKE.
|
||||||
The general test also covers running on old kernels. */
|
The general test also covers running on old kernels. */
|
||||||
|
|
@ -100,9 +114,17 @@ __pthread_cond_signal:
|
||||||
|
|
||||||
6: xorl %eax, %eax
|
6: xorl %eax, %eax
|
||||||
popl %edi
|
popl %edi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%edi)
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
cfi_offset(%edi, -12)
|
||||||
|
|
||||||
7: /* %ecx should be either FUTEX_WAKE_OP or
|
7: /* %ecx should be either FUTEX_WAKE_OP or
|
||||||
FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG from the previous syscall. */
|
FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG from the previous syscall. */
|
||||||
xorl $(FUTEX_WAKE ^ FUTEX_WAKE_OP), %ecx
|
xorl $(FUTEX_WAKE ^ FUTEX_WAKE_OP), %ecx
|
||||||
|
|
@ -152,6 +174,7 @@ __pthread_cond_signal:
|
||||||
call __lll_lock_wait
|
call __lll_lock_wait
|
||||||
jmp 2b
|
jmp 2b
|
||||||
|
|
||||||
|
cfi_endproc
|
||||||
.size __pthread_cond_signal, .-__pthread_cond_signal
|
.size __pthread_cond_signal, .-__pthread_cond_signal
|
||||||
versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal,
|
versioned_symbol (libpthread, __pthread_cond_signal, pthread_cond_signal,
|
||||||
GLIBC_2_3_2)
|
GLIBC_2_3_2)
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,13 @@
|
||||||
.type __pthread_rwlock_rdlock,@function
|
.type __pthread_rwlock_rdlock,@function
|
||||||
.align 16
|
.align 16
|
||||||
__pthread_rwlock_rdlock:
|
__pthread_rwlock_rdlock:
|
||||||
|
cfi_startproc
|
||||||
pushl %esi
|
pushl %esi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%esi, -8)
|
||||||
|
cfi_offset(%ebx, -12)
|
||||||
|
|
||||||
xorl %esi, %esi
|
xorl %esi, %esi
|
||||||
movl 12(%esp), %ebx
|
movl 12(%esp), %ebx
|
||||||
|
|
@ -113,9 +118,16 @@ __pthread_rwlock_rdlock:
|
||||||
|
|
||||||
movl %edx, %eax
|
movl %edx, %eax
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
popl %esi
|
popl %esi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%esi)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
|
cfi_offset(%esi, -8)
|
||||||
|
cfi_offset(%ebx, -12)
|
||||||
1:
|
1:
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
movl %ebx, %edx
|
movl %ebx, %edx
|
||||||
|
|
@ -171,6 +183,7 @@ __pthread_rwlock_rdlock:
|
||||||
movzbl PSHARED(%ebx), %ecx
|
movzbl PSHARED(%ebx), %ecx
|
||||||
call __lll_lock_wait
|
call __lll_lock_wait
|
||||||
jmp 13b
|
jmp 13b
|
||||||
|
cfi_endproc
|
||||||
.size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
|
.size __pthread_rwlock_rdlock,.-__pthread_rwlock_rdlock
|
||||||
|
|
||||||
.globl pthread_rwlock_rdlock
|
.globl pthread_rwlock_rdlock
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,21 @@
|
||||||
.type pthread_rwlock_timedrdlock,@function
|
.type pthread_rwlock_timedrdlock,@function
|
||||||
.align 16
|
.align 16
|
||||||
pthread_rwlock_timedrdlock:
|
pthread_rwlock_timedrdlock:
|
||||||
|
cfi_startproc
|
||||||
pushl %esi
|
pushl %esi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %edi
|
pushl %edi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%esi, -8)
|
||||||
|
cfi_offset(%edi, -12)
|
||||||
|
cfi_offset(%ebx, -16)
|
||||||
|
cfi_offset(%ebp, -20)
|
||||||
subl $8, %esp
|
subl $8, %esp
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
|
|
||||||
movl 28(%esp), %ebp
|
movl 28(%esp), %ebp
|
||||||
movl 32(%esp), %edi
|
movl 32(%esp), %edi
|
||||||
|
|
@ -150,12 +160,26 @@ pthread_rwlock_timedrdlock:
|
||||||
7: movl %edx, %eax
|
7: movl %edx, %eax
|
||||||
|
|
||||||
addl $8, %esp
|
addl $8, %esp
|
||||||
|
cfi_adjust_cfa_offset(-8)
|
||||||
popl %ebp
|
popl %ebp
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebp)
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
popl %edi
|
popl %edi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%edi)
|
||||||
popl %esi
|
popl %esi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%esi)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(24)
|
||||||
|
cfi_offset(%esi, -8)
|
||||||
|
cfi_offset(%edi, -12)
|
||||||
|
cfi_offset(%ebx, -16)
|
||||||
|
cfi_offset(%ebp, -20)
|
||||||
1:
|
1:
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
movl %ebp, %edx
|
movl %ebp, %edx
|
||||||
|
|
@ -216,4 +240,5 @@ pthread_rwlock_timedrdlock:
|
||||||
|
|
||||||
19: movl $EINVAL, %edx
|
19: movl $EINVAL, %edx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
cfi_endproc
|
||||||
.size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
|
.size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,21 @@
|
||||||
.type pthread_rwlock_timedwrlock,@function
|
.type pthread_rwlock_timedwrlock,@function
|
||||||
.align 16
|
.align 16
|
||||||
pthread_rwlock_timedwrlock:
|
pthread_rwlock_timedwrlock:
|
||||||
|
cfi_startproc
|
||||||
pushl %esi
|
pushl %esi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %edi
|
pushl %edi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %ebp
|
pushl %ebp
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%esi, -8)
|
||||||
|
cfi_offset(%edi, -12)
|
||||||
|
cfi_offset(%ebx, -16)
|
||||||
|
cfi_offset(%ebp, -20)
|
||||||
subl $8, %esp
|
subl $8, %esp
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
|
|
||||||
movl 28(%esp), %ebp
|
movl 28(%esp), %ebp
|
||||||
movl 32(%esp), %edi
|
movl 32(%esp), %edi
|
||||||
|
|
@ -148,12 +158,26 @@ pthread_rwlock_timedwrlock:
|
||||||
7: movl %edx, %eax
|
7: movl %edx, %eax
|
||||||
|
|
||||||
addl $8, %esp
|
addl $8, %esp
|
||||||
|
cfi_adjust_cfa_offset(-8)
|
||||||
popl %ebp
|
popl %ebp
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebp)
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
popl %edi
|
popl %edi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%edi)
|
||||||
popl %esi
|
popl %esi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%esi)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(24)
|
||||||
|
cfi_offset(%esi, -8)
|
||||||
|
cfi_offset(%edi, -12)
|
||||||
|
cfi_offset(%ebx, -16)
|
||||||
|
cfi_offset(%ebp, -20)
|
||||||
1:
|
1:
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
movl %ebp, %edx
|
movl %ebp, %edx
|
||||||
|
|
@ -209,4 +233,5 @@ pthread_rwlock_timedwrlock:
|
||||||
|
|
||||||
19: movl $EINVAL, %edx
|
19: movl $EINVAL, %edx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
cfi_endproc
|
||||||
.size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
|
.size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,13 @@
|
||||||
.type __pthread_rwlock_unlock,@function
|
.type __pthread_rwlock_unlock,@function
|
||||||
.align 16
|
.align 16
|
||||||
__pthread_rwlock_unlock:
|
__pthread_rwlock_unlock:
|
||||||
|
cfi_startproc
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %edi
|
pushl %edi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
cfi_offset(%edi, -12)
|
||||||
|
|
||||||
movl 12(%esp), %edi
|
movl 12(%esp), %edi
|
||||||
|
|
||||||
|
|
@ -87,9 +92,16 @@ __pthread_rwlock_unlock:
|
||||||
|
|
||||||
xorl %eax, %eax
|
xorl %eax, %eax
|
||||||
popl %edi
|
popl %edi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%edi)
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
cfi_offset(%edi, -12)
|
||||||
.align 16
|
.align 16
|
||||||
6: LOCK
|
6: LOCK
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
|
|
@ -133,7 +145,7 @@ __pthread_rwlock_unlock:
|
||||||
movzbl PSHARED(%edi), %ecx
|
movzbl PSHARED(%edi), %ecx
|
||||||
call __lll_unlock_wake
|
call __lll_unlock_wake
|
||||||
jmp 8b
|
jmp 8b
|
||||||
|
cfi_endproc
|
||||||
.size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
|
.size __pthread_rwlock_unlock,.-__pthread_rwlock_unlock
|
||||||
|
|
||||||
.globl pthread_rwlock_unlock
|
.globl pthread_rwlock_unlock
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,13 @@
|
||||||
.type __pthread_rwlock_wrlock,@function
|
.type __pthread_rwlock_wrlock,@function
|
||||||
.align 16
|
.align 16
|
||||||
__pthread_rwlock_wrlock:
|
__pthread_rwlock_wrlock:
|
||||||
|
cfi_startproc
|
||||||
pushl %esi
|
pushl %esi
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%esi, -8)
|
||||||
|
cfi_offset(%ebx, -12)
|
||||||
|
|
||||||
xorl %esi, %esi
|
xorl %esi, %esi
|
||||||
movl 12(%esp), %ebx
|
movl 12(%esp), %ebx
|
||||||
|
|
@ -111,9 +116,16 @@ __pthread_rwlock_wrlock:
|
||||||
|
|
||||||
movl %edx, %eax
|
movl %edx, %eax
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
popl %esi
|
popl %esi
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%esi)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
|
cfi_offset(%esi, -8)
|
||||||
|
cfi_offset(%ebx, -12)
|
||||||
1:
|
1:
|
||||||
#if MUTEX == 0
|
#if MUTEX == 0
|
||||||
movl %ebx, %edx
|
movl %ebx, %edx
|
||||||
|
|
@ -162,6 +174,7 @@ __pthread_rwlock_wrlock:
|
||||||
movzbl PSHARED(%ebx), %ecx
|
movzbl PSHARED(%ebx), %ecx
|
||||||
call __lll_lock_wait
|
call __lll_lock_wait
|
||||||
jmp 13b
|
jmp 13b
|
||||||
|
cfi_endproc
|
||||||
.size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock
|
.size __pthread_rwlock_wrlock,.-__pthread_rwlock_wrlock
|
||||||
|
|
||||||
.globl pthread_rwlock_wrlock
|
.globl pthread_rwlock_wrlock
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,10 @@
|
||||||
.type __new_sem_post,@function
|
.type __new_sem_post,@function
|
||||||
.align 16
|
.align 16
|
||||||
__new_sem_post:
|
__new_sem_post:
|
||||||
|
cfi_startproc
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
|
||||||
movl 8(%esp), %ebx
|
movl 8(%esp), %ebx
|
||||||
|
|
||||||
|
|
@ -64,8 +67,12 @@ __new_sem_post:
|
||||||
|
|
||||||
2: xorl %eax, %eax
|
2: xorl %eax, %eax
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
1:
|
1:
|
||||||
#ifdef PIC
|
#ifdef PIC
|
||||||
call __i686.get_pc_thunk.bx
|
call __i686.get_pc_thunk.bx
|
||||||
|
|
@ -116,14 +123,20 @@ __new_sem_post:
|
||||||
|
|
||||||
orl $-1, %eax
|
orl $-1, %eax
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
cfi_endproc
|
||||||
.size __new_sem_post,.-__new_sem_post
|
.size __new_sem_post,.-__new_sem_post
|
||||||
versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)
|
versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)
|
||||||
#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
|
#if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1)
|
||||||
.global __old_sem_post
|
.global __old_sem_post
|
||||||
.type __old_sem_post,@function
|
.type __old_sem_post,@function
|
||||||
__old_sem_post:
|
__old_sem_post:
|
||||||
|
cfi_startproc
|
||||||
pushl %ebx
|
pushl %ebx
|
||||||
|
cfi_adjust_cfa_offset(4)
|
||||||
|
cfi_offset(%ebx, -8)
|
||||||
|
|
||||||
movl 8(%esp), %ebx
|
movl 8(%esp), %ebx
|
||||||
LOCK
|
LOCK
|
||||||
|
|
@ -139,7 +152,10 @@ __old_sem_post:
|
||||||
|
|
||||||
xorl %eax, %eax
|
xorl %eax, %eax
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
cfi_adjust_cfa_offset(-4)
|
||||||
|
cfi_restore(%ebx)
|
||||||
ret
|
ret
|
||||||
|
cfi_endproc
|
||||||
.size __old_sem_post,.-__old_sem_post
|
.size __old_sem_post,.-__old_sem_post
|
||||||
compat_symbol(libpthread, __old_sem_post, sem_post, GLIBC_2_0)
|
compat_symbol(libpthread, __old_sem_post, sem_post, GLIBC_2_0)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -33,10 +33,19 @@
|
||||||
.type pthread_rwlock_timedrdlock,@function
|
.type pthread_rwlock_timedrdlock,@function
|
||||||
.align 16
|
.align 16
|
||||||
pthread_rwlock_timedrdlock:
|
pthread_rwlock_timedrdlock:
|
||||||
|
cfi_startproc
|
||||||
pushq %r12
|
pushq %r12
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
pushq %r13
|
pushq %r13
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
pushq %r14
|
pushq %r14
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
|
cfi_offset(%r12, -16)
|
||||||
|
cfi_offset(%r13, -24)
|
||||||
|
cfi_offset(%r14, -32)
|
||||||
|
|
||||||
subq $16, %rsp
|
subq $16, %rsp
|
||||||
|
cfi_adjust_cfa_offset(16)
|
||||||
|
|
||||||
movq %rdi, %r12
|
movq %rdi, %r12
|
||||||
movq %rsi, %r13
|
movq %rsi, %r13
|
||||||
|
|
@ -155,11 +164,22 @@ pthread_rwlock_timedrdlock:
|
||||||
7: movq %rdx, %rax
|
7: movq %rdx, %rax
|
||||||
|
|
||||||
addq $16, %rsp
|
addq $16, %rsp
|
||||||
|
cfi_adjust_cfa_offset(-16)
|
||||||
popq %r14
|
popq %r14
|
||||||
|
cfi_adjust_cfa_offset(-8)
|
||||||
|
cfi_restore(%r14)
|
||||||
popq %r13
|
popq %r13
|
||||||
|
cfi_adjust_cfa_offset(-8)
|
||||||
|
cfi_restore(%r13)
|
||||||
popq %r12
|
popq %r12
|
||||||
|
cfi_adjust_cfa_offset(-8)
|
||||||
|
cfi_restore(%r12)
|
||||||
retq
|
retq
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(40)
|
||||||
|
cfi_offset(%r12, -16)
|
||||||
|
cfi_offset(%r13, -24)
|
||||||
|
cfi_offset(%r14, -32)
|
||||||
1: movl PSHARED(%rdi), %esi
|
1: movl PSHARED(%rdi), %esi
|
||||||
#if MUTEX != 0
|
#if MUTEX != 0
|
||||||
addq $MUTEX, %rdi
|
addq $MUTEX, %rdi
|
||||||
|
|
@ -214,4 +234,5 @@ pthread_rwlock_timedrdlock:
|
||||||
|
|
||||||
19: movl $EINVAL, %edx
|
19: movl $EINVAL, %edx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
cfi_endproc
|
||||||
.size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
|
.size pthread_rwlock_timedrdlock,.-pthread_rwlock_timedrdlock
|
||||||
|
|
|
||||||
|
|
@ -33,10 +33,19 @@
|
||||||
.type pthread_rwlock_timedwrlock,@function
|
.type pthread_rwlock_timedwrlock,@function
|
||||||
.align 16
|
.align 16
|
||||||
pthread_rwlock_timedwrlock:
|
pthread_rwlock_timedwrlock:
|
||||||
|
cfi_startproc
|
||||||
pushq %r12
|
pushq %r12
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
pushq %r13
|
pushq %r13
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
pushq %r14
|
pushq %r14
|
||||||
|
cfi_adjust_cfa_offset(8)
|
||||||
|
cfi_offset(%r12, -16)
|
||||||
|
cfi_offset(%r13, -24)
|
||||||
|
cfi_offset(%r14, -32)
|
||||||
|
|
||||||
subq $16, %rsp
|
subq $16, %rsp
|
||||||
|
cfi_adjust_cfa_offset(16)
|
||||||
|
|
||||||
movq %rdi, %r12
|
movq %rdi, %r12
|
||||||
movq %rsi, %r13
|
movq %rsi, %r13
|
||||||
|
|
@ -152,11 +161,22 @@ pthread_rwlock_timedwrlock:
|
||||||
7: movq %rdx, %rax
|
7: movq %rdx, %rax
|
||||||
|
|
||||||
addq $16, %rsp
|
addq $16, %rsp
|
||||||
|
cfi_adjust_cfa_offset(-16)
|
||||||
popq %r14
|
popq %r14
|
||||||
|
cfi_adjust_cfa_offset(-8)
|
||||||
|
cfi_restore(%r14)
|
||||||
popq %r13
|
popq %r13
|
||||||
|
cfi_adjust_cfa_offset(-8)
|
||||||
|
cfi_restore(%r13)
|
||||||
popq %r12
|
popq %r12
|
||||||
|
cfi_adjust_cfa_offset(-8)
|
||||||
|
cfi_restore(%r12)
|
||||||
retq
|
retq
|
||||||
|
|
||||||
|
cfi_adjust_cfa_offset(40)
|
||||||
|
cfi_offset(%r12, -16)
|
||||||
|
cfi_offset(%r13, -24)
|
||||||
|
cfi_offset(%r14, -32)
|
||||||
1: movl PSHARED(%rdi), %esi
|
1: movl PSHARED(%rdi), %esi
|
||||||
#if MUTEX != 0
|
#if MUTEX != 0
|
||||||
addq $MUTEX, %rdi
|
addq $MUTEX, %rdi
|
||||||
|
|
@ -206,4 +226,5 @@ pthread_rwlock_timedwrlock:
|
||||||
|
|
||||||
19: movl $EINVAL, %edx
|
19: movl $EINVAL, %edx
|
||||||
jmp 9b
|
jmp 9b
|
||||||
|
cfi_endproc
|
||||||
.size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
|
.size pthread_rwlock_timedwrlock,.-pthread_rwlock_timedwrlock
|
||||||
|
|
|
||||||
|
|
@ -26,15 +26,41 @@ static int
|
||||||
do_test (void)
|
do_test (void)
|
||||||
{
|
{
|
||||||
pthread_rwlock_t r;
|
pthread_rwlock_t r;
|
||||||
|
pthread_rwlockattr_t at;
|
||||||
int e;
|
int e;
|
||||||
|
|
||||||
if (pthread_rwlock_init (&r, NULL) != 0)
|
if (pthread_rwlockattr_init (&at) != 0)
|
||||||
|
{
|
||||||
|
puts ("rwlockattr_init failed");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
puts ("rwlockattr_init succeeded");
|
||||||
|
|
||||||
|
#ifndef TYPE
|
||||||
|
# define TYPE PTHREAD_RWLOCK_PREFER_READER_NP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (pthread_rwlockattr_setkind_np (&at, TYPE) != 0)
|
||||||
|
{
|
||||||
|
puts ("rwlockattr_setkind failed");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
puts ("rwlockattr_setkind succeeded");
|
||||||
|
|
||||||
|
if (pthread_rwlock_init (&r, &at) != 0)
|
||||||
{
|
{
|
||||||
puts ("rwlock_init failed");
|
puts ("rwlock_init failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
puts ("rwlock_init succeeded");
|
puts ("rwlock_init succeeded");
|
||||||
|
|
||||||
|
if (pthread_rwlockattr_destroy (&at) != 0)
|
||||||
|
{
|
||||||
|
puts ("rwlockattr_destroy failed");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
puts ("rwlockattr_destroy succeeded");
|
||||||
|
|
||||||
if (pthread_rwlock_wrlock (&r) != 0)
|
if (pthread_rwlock_wrlock (&r) != 0)
|
||||||
{
|
{
|
||||||
puts ("1st rwlock_wrlock failed");
|
puts ("1st rwlock_wrlock failed");
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
#define TYPE PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
|
||||||
|
#include "tst-rwlock2.c"
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2005, 2007 Free Software Foundation, Inc.
|
/* Copyright (C) 2005, 2007, 2008 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@redhat.com>, 2005.
|
Contributed by Ulrich Drepper <drepper@redhat.com>, 2005.
|
||||||
|
|
||||||
|
|
@ -21,6 +21,25 @@
|
||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
#include <semaphore.h>
|
#include <semaphore.h>
|
||||||
|
|
||||||
|
static const struct
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
size_t expected;
|
||||||
|
size_t is;
|
||||||
|
} types[] =
|
||||||
|
{
|
||||||
|
#define T(t, c) \
|
||||||
|
{ #t, c, sizeof (t) }
|
||||||
|
T (pthread_attr_t, __SIZEOF_PTHREAD_ATTR_T),
|
||||||
|
T (pthread_mutex_t, __SIZEOF_PTHREAD_MUTEX_T),
|
||||||
|
T (pthread_mutexattr_t, __SIZEOF_PTHREAD_MUTEXATTR_T),
|
||||||
|
T (pthread_cond_t, __SIZEOF_PTHREAD_COND_T),
|
||||||
|
T (pthread_condattr_t, __SIZEOF_PTHREAD_CONDATTR_T),
|
||||||
|
T (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T),
|
||||||
|
T (pthread_rwlockattr_t, __SIZEOF_PTHREAD_RWLOCKATTR_T),
|
||||||
|
T (pthread_barrier_t, __SIZEOF_PTHREAD_BARRIER_T),
|
||||||
|
T (pthread_barrierattr_t, __SIZEOF_PTHREAD_BARRIERATTR_T)
|
||||||
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_test (void)
|
do_test (void)
|
||||||
|
|
@ -62,6 +81,14 @@ do_test (void)
|
||||||
TEST_TYPE2 (sem_t, struct new_sem);
|
TEST_TYPE2 (sem_t, struct new_sem);
|
||||||
TEST_TYPE2 (sem_t, struct old_sem);
|
TEST_TYPE2 (sem_t, struct old_sem);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sizeof (types) / sizeof (types[0]); ++i)
|
||||||
|
if (types[i].expected != types[i].is)
|
||||||
|
{
|
||||||
|
printf ("%s: expected %zu, is %zu\n",
|
||||||
|
types[i].name, types[i].expected, types[i].is);
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -190,7 +190,7 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
|
||||||
gr_mem_len_total += gr_mem_len[gr_mem_cnt];
|
gr_mem_len_total += gr_mem_len[gr_mem_cnt];
|
||||||
}
|
}
|
||||||
|
|
||||||
written = total = (sizeof (struct dataset)
|
written = total = (offsetof (struct dataset, strdata)
|
||||||
+ gr_mem_cnt * sizeof (uint32_t)
|
+ gr_mem_cnt * sizeof (uint32_t)
|
||||||
+ gr_name_len + gr_passwd_len + gr_mem_len_total);
|
+ gr_name_len + gr_passwd_len + gr_mem_len_total);
|
||||||
|
|
||||||
|
|
@ -252,6 +252,9 @@ cache_addgr (struct database_dyn *db, int fd, request_header *req,
|
||||||
char *key_copy = cp + key_offset;
|
char *key_copy = cp + key_offset;
|
||||||
assert (key_copy == (char *) rawmemchr (cp, '\0') + 1);
|
assert (key_copy == (char *) rawmemchr (cp, '\0') + 1);
|
||||||
|
|
||||||
|
assert (cp == dataset->strdata + total - offsetof (struct dataset,
|
||||||
|
strdata));
|
||||||
|
|
||||||
/* Now we can determine whether on refill we have to create a new
|
/* Now we can determine whether on refill we have to create a new
|
||||||
record or not. */
|
record or not. */
|
||||||
if (he != NULL)
|
if (he != NULL)
|
||||||
|
|
|
||||||
|
|
@ -83,8 +83,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|
||||||
struct hashentry *he, struct datahead *dh, int errval,
|
struct hashentry *he, struct datahead *dh, int errval,
|
||||||
int32_t ttl)
|
int32_t ttl)
|
||||||
{
|
{
|
||||||
ssize_t total;
|
bool all_written = true;
|
||||||
ssize_t written;
|
|
||||||
time_t t = time (NULL);
|
time_t t = time (NULL);
|
||||||
|
|
||||||
/* We allocate all data in one memory block: the iov vector,
|
/* We allocate all data in one memory block: the iov vector,
|
||||||
|
|
@ -108,18 +107,17 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|
||||||
if (reload_count != UINT_MAX)
|
if (reload_count != UINT_MAX)
|
||||||
/* Do not reset the value if we never not reload the record. */
|
/* Do not reset the value if we never not reload the record. */
|
||||||
dh->nreloads = reload_count - 1;
|
dh->nreloads = reload_count - 1;
|
||||||
|
|
||||||
written = total = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We have no data. This means we send the standard reply for this
|
/* We have no data. This means we send the standard reply for this
|
||||||
case. */
|
case. */
|
||||||
written = total = sizeof (notfound);
|
ssize_t total = sizeof (notfound);
|
||||||
|
|
||||||
if (fd != -1)
|
if (fd != -1 &&
|
||||||
written = TEMP_FAILURE_RETRY (send (fd, ¬found, total,
|
TEMP_FAILURE_RETRY (send (fd, ¬found, total,
|
||||||
MSG_NOSIGNAL));
|
MSG_NOSIGNAL)) != total)
|
||||||
|
all_written = false;
|
||||||
|
|
||||||
dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len,
|
dataset = mempool_alloc (db, sizeof (struct dataset) + req->key_len,
|
||||||
IDX_result_data);
|
IDX_result_data);
|
||||||
|
|
@ -181,6 +179,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|
||||||
char *key_copy = NULL;
|
char *key_copy = NULL;
|
||||||
char *cp;
|
char *cp;
|
||||||
size_t cnt;
|
size_t cnt;
|
||||||
|
ssize_t total;
|
||||||
|
|
||||||
/* Determine the number of aliases. */
|
/* Determine the number of aliases. */
|
||||||
h_aliases_cnt = 0;
|
h_aliases_cnt = 0;
|
||||||
|
|
@ -208,7 +207,6 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|
||||||
+ h_name_len
|
+ h_name_len
|
||||||
+ h_aliases_cnt * sizeof (uint32_t)
|
+ h_aliases_cnt * sizeof (uint32_t)
|
||||||
+ h_addr_list_cnt * hst->h_length);
|
+ h_addr_list_cnt * hst->h_length);
|
||||||
written = total;
|
|
||||||
|
|
||||||
/* If we refill the cache, first assume the reconrd did not
|
/* If we refill the cache, first assume the reconrd did not
|
||||||
change. Allocate memory on the cache since it is likely
|
change. Allocate memory on the cache since it is likely
|
||||||
|
|
@ -260,6 +258,9 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|
||||||
dataset->resp.h_addr_list_cnt = h_addr_list_cnt;
|
dataset->resp.h_addr_list_cnt = h_addr_list_cnt;
|
||||||
dataset->resp.error = NETDB_SUCCESS;
|
dataset->resp.error = NETDB_SUCCESS;
|
||||||
|
|
||||||
|
/* Make sure there is no gap. */
|
||||||
|
assert ((char *) (&dataset->resp.error + 1) == dataset->strdata);
|
||||||
|
|
||||||
cp = dataset->strdata;
|
cp = dataset->strdata;
|
||||||
|
|
||||||
cp = mempcpy (cp, hst->h_name, h_name_len);
|
cp = mempcpy (cp, hst->h_name, h_name_len);
|
||||||
|
|
@ -286,6 +287,8 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|
||||||
we explicitly add the name here. */
|
we explicitly add the name here. */
|
||||||
key_copy = memcpy (cp, key, req->key_len);
|
key_copy = memcpy (cp, key, req->key_len);
|
||||||
|
|
||||||
|
assert ((char *) &dataset->resp + dataset->head.recsize == cp);
|
||||||
|
|
||||||
/* Now we can determine whether on refill we have to create a new
|
/* Now we can determine whether on refill we have to create a new
|
||||||
record or not. */
|
record or not. */
|
||||||
if (he != NULL)
|
if (he != NULL)
|
||||||
|
|
@ -351,20 +354,27 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|
||||||
<= (sizeof (struct database_pers_head)
|
<= (sizeof (struct database_pers_head)
|
||||||
+ db->head->module * sizeof (ref_t)
|
+ db->head->module * sizeof (ref_t)
|
||||||
+ db->head->data_size));
|
+ db->head->data_size));
|
||||||
written = sendfileall (fd, db->wr_fd,
|
ssize_t written = sendfileall (fd, db->wr_fd,
|
||||||
(char *) &dataset->resp
|
(char *) &dataset->resp
|
||||||
- (char *) db->head, total);
|
- (char *) db->head,
|
||||||
|
dataset->head.recsize);
|
||||||
|
if (written != dataset->head.recsize)
|
||||||
|
{
|
||||||
# ifndef __ASSUME_SENDFILE
|
# ifndef __ASSUME_SENDFILE
|
||||||
if (written == -1 && errno == ENOSYS)
|
if (written == -1 && errno == ENOSYS)
|
||||||
goto use_write;
|
goto use_write;
|
||||||
# endif
|
# endif
|
||||||
|
all_written = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
# ifndef __ASSUME_SENDFILE
|
# ifndef __ASSUME_SENDFILE
|
||||||
use_write:
|
use_write:
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
written = writeall (fd, &dataset->resp, total);
|
if (writeall (fd, &dataset->resp, dataset->head.recsize)
|
||||||
|
!= dataset->head.recsize)
|
||||||
|
all_written = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add the record to the database. But only if it has not been
|
/* Add the record to the database. But only if it has not been
|
||||||
|
|
@ -414,7 +424,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (__builtin_expect (written != total, 0) && debug_level > 0)
|
if (__builtin_expect (!all_written, 0) && debug_level > 0)
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
dbg_log (_("short write in %s: %s"), __FUNCTION__,
|
dbg_log (_("short write in %s: %s"), __FUNCTION__,
|
||||||
|
|
|
||||||
|
|
@ -246,7 +246,8 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
written = total = sizeof (struct dataset) + start * sizeof (int32_t);
|
written = total = (offsetof (struct dataset, strdata)
|
||||||
|
+ start * sizeof (int32_t));
|
||||||
|
|
||||||
/* If we refill the cache, first assume the reconrd did not
|
/* If we refill the cache, first assume the reconrd did not
|
||||||
change. Allocate memory on the cache since it is likely
|
change. Allocate memory on the cache since it is likely
|
||||||
|
|
@ -307,6 +308,9 @@ addinitgroupsX (struct database_dyn *db, int fd, request_header *req,
|
||||||
/* Finally the user name. */
|
/* Finally the user name. */
|
||||||
memcpy (cp, key, req->key_len);
|
memcpy (cp, key, req->key_len);
|
||||||
|
|
||||||
|
assert (cp == dataset->strdata + total - offsetof (struct dataset,
|
||||||
|
strdata));
|
||||||
|
|
||||||
/* Now we can determine whether on refill we have to create a new
|
/* Now we can determine whether on refill we have to create a new
|
||||||
record or not. */
|
record or not. */
|
||||||
if (he != NULL)
|
if (he != NULL)
|
||||||
|
|
|
||||||
|
|
@ -235,6 +235,11 @@ gc (struct database_dyn *db)
|
||||||
/* Sort the entries by their address. */
|
/* Sort the entries by their address. */
|
||||||
qsort (he, cnt, sizeof (struct hashentry *), sort_he);
|
qsort (he, cnt, sizeof (struct hashentry *), sort_he);
|
||||||
|
|
||||||
|
#define obstack_chunk_alloc xmalloc
|
||||||
|
#define obstack_chunk_free free
|
||||||
|
struct obstack ob;
|
||||||
|
obstack_init (&ob);
|
||||||
|
|
||||||
/* Determine the highest used address. */
|
/* Determine the highest used address. */
|
||||||
size_t high = nmark;
|
size_t high = nmark;
|
||||||
while (high > 0 && mark[high - 1] == 0)
|
while (high > 0 && mark[high - 1] == 0)
|
||||||
|
|
@ -307,10 +312,6 @@ gc (struct database_dyn *db)
|
||||||
size_t size;
|
size_t size;
|
||||||
struct moveinfo *next;
|
struct moveinfo *next;
|
||||||
} *moves = NULL;
|
} *moves = NULL;
|
||||||
#define obstack_chunk_alloc xmalloc
|
|
||||||
#define obstack_chunk_free free
|
|
||||||
struct obstack ob;
|
|
||||||
obstack_init (&ob);
|
|
||||||
|
|
||||||
while (byte < high)
|
while (byte < high)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ __nscd_getservbyport_r (int port, const char *proto,
|
||||||
portstr[sizeof (portstr) - 1] = '\0';
|
portstr[sizeof (portstr) - 1] = '\0';
|
||||||
char *cp = _itoa_word (port, portstr + sizeof (portstr) - 1, 10, 0);
|
char *cp = _itoa_word (port, portstr + sizeof (portstr) - 1, 10, 0);
|
||||||
|
|
||||||
return nscd_getserv_r (portstr, portstr + sizeof (portstr) - cp, proto,
|
return nscd_getserv_r (cp, portstr + sizeof (portstr) - cp, proto,
|
||||||
GETSERVBYPORT, result_buf, buf, buflen, result);
|
GETSERVBYPORT, result_buf, buf, buflen, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,8 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
|
||||||
n = snprintf (buf, buf_len, "%d%c%n%s", pwd->pw_uid, '\0',
|
n = snprintf (buf, buf_len, "%d%c%n%s", pwd->pw_uid, '\0',
|
||||||
&key_offset, (char *) key) + 1;
|
&key_offset, (char *) key) + 1;
|
||||||
|
|
||||||
written = total = (sizeof (struct dataset) + pw_name_len + pw_passwd_len
|
written = total = (offsetof (struct dataset, strdata)
|
||||||
|
+ pw_name_len + pw_passwd_len
|
||||||
+ pw_gecos_len + pw_dir_len + pw_shell_len);
|
+ pw_gecos_len + pw_dir_len + pw_shell_len);
|
||||||
|
|
||||||
/* If we refill the cache, first assume the reconrd did not
|
/* If we refill the cache, first assume the reconrd did not
|
||||||
|
|
@ -247,16 +248,28 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
|
||||||
char *key_copy = cp + key_offset;
|
char *key_copy = cp + key_offset;
|
||||||
assert (key_copy == (char *) rawmemchr (cp, '\0') + 1);
|
assert (key_copy == (char *) rawmemchr (cp, '\0') + 1);
|
||||||
|
|
||||||
|
assert (cp == dataset->strdata + total - offsetof (struct dataset,
|
||||||
|
strdata));
|
||||||
|
|
||||||
/* Now we can determine whether on refill we have to create a new
|
/* Now we can determine whether on refill we have to create a new
|
||||||
record or not. */
|
record or not. */
|
||||||
if (he != NULL)
|
if (he != NULL)
|
||||||
{
|
{
|
||||||
assert (fd == -1);
|
assert (fd == -1);
|
||||||
|
|
||||||
if (total + n == dh->allocsize
|
#if 0
|
||||||
&& total - offsetof (struct dataset, resp) == dh->recsize
|
if (dataset->head.datasize == dh->allocsize
|
||||||
|
&& dataset->head.recsize == dh->recsize
|
||||||
&& memcmp (&dataset->resp, dh->data,
|
&& memcmp (&dataset->resp, dh->data,
|
||||||
dh->allocsize - offsetof (struct dataset, resp)) == 0)
|
dh->allocsize - offsetof (struct dataset, resp)) == 0)
|
||||||
|
#else
|
||||||
|
if (dataset->head.allocsize != dh->allocsize)
|
||||||
|
goto nnn;
|
||||||
|
if (dataset->head.recsize != dh->recsize)
|
||||||
|
goto nnn;
|
||||||
|
if(memcmp (&dataset->resp, dh->data,
|
||||||
|
dh->allocsize - offsetof (struct dataset, resp)) == 0)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
/* The data has not changed. We will just bump the
|
/* The data has not changed. We will just bump the
|
||||||
timeout value. Note that the new record has been
|
timeout value. Note that the new record has been
|
||||||
|
|
@ -266,6 +279,7 @@ cache_addpw (struct database_dyn *db, int fd, request_header *req,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
nnn:;
|
||||||
/* We have to create a new record. Just allocate
|
/* We have to create a new record. Just allocate
|
||||||
appropriate memory and copy it. */
|
appropriate memory and copy it. */
|
||||||
struct dataset *newp
|
struct dataset *newp
|
||||||
|
|
|
||||||
|
|
@ -173,7 +173,7 @@ cache_addserv (struct database_dyn *db, int fd, request_header *req,
|
||||||
total += s_aliases_len[cnt];
|
total += s_aliases_len[cnt];
|
||||||
}
|
}
|
||||||
|
|
||||||
total += (sizeof (struct dataset)
|
total += (offsetof (struct dataset, strdata)
|
||||||
+ s_name_len
|
+ s_name_len
|
||||||
+ s_proto_len
|
+ s_proto_len
|
||||||
+ s_aliases_cnt * sizeof (uint32_t));
|
+ s_aliases_cnt * sizeof (uint32_t));
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007
|
/* Copyright (C) 1991-2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
|
@ -1075,8 +1075,7 @@ globfree (pglob)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; i < pglob->gl_pathc; ++i)
|
for (i = 0; i < pglob->gl_pathc; ++i)
|
||||||
if (pglob->gl_pathv[pglob->gl_offs + i] != NULL)
|
free (pglob->gl_pathv[pglob->gl_offs + i]);
|
||||||
free (pglob->gl_pathv[pglob->gl_offs + i]);
|
|
||||||
free (pglob->gl_pathv);
|
free (pglob->gl_pathv);
|
||||||
pglob->gl_pathv = NULL;
|
pglob->gl_pathv = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/* Copyright (c) 1983, 1989
|
/* Copyright (c) 1983, 1989
|
||||||
* The Regents of the University of California. All rights reserved.
|
* The Regents of the University of California. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
* are met:
|
* are met:
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
* may be used to endorse or promote products derived from this software
|
* may be used to endorse or promote products derived from this software
|
||||||
* without specific prior written permission.
|
* without specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
|
@ -161,6 +161,7 @@ typedef struct {
|
||||||
#define T_SRV ns_t_srv
|
#define T_SRV ns_t_srv
|
||||||
#define T_ATMA ns_t_atma
|
#define T_ATMA ns_t_atma
|
||||||
#define T_NAPTR ns_t_naptr
|
#define T_NAPTR ns_t_naptr
|
||||||
|
#define T_DNAME ns_t_dname
|
||||||
#define T_TSIG ns_t_tsig
|
#define T_TSIG ns_t_tsig
|
||||||
#define T_IXFR ns_t_ixfr
|
#define T_IXFR ns_t_ixfr
|
||||||
#define T_AXFR ns_t_axfr
|
#define T_AXFR ns_t_axfr
|
||||||
|
|
|
||||||
|
|
@ -1072,12 +1072,13 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname,
|
||||||
if (__builtin_expect (type == T_SIG, 0)
|
if (__builtin_expect (type == T_SIG, 0)
|
||||||
|| __builtin_expect (type == T_KEY, 0)
|
|| __builtin_expect (type == T_KEY, 0)
|
||||||
|| __builtin_expect (type == T_NXT, 0)
|
|| __builtin_expect (type == T_NXT, 0)
|
||||||
|| __builtin_expect (type == T_PTR, 0))
|
|| __builtin_expect (type == T_PTR, 0)
|
||||||
|
|| __builtin_expect (type == T_DNAME, 0))
|
||||||
{
|
{
|
||||||
/* We don't support DNSSEC yet. For now, ignore the record
|
/* We don't support DNSSEC yet. For now, ignore the record
|
||||||
and send a low priority message to syslog.
|
and send a low priority message to syslog.
|
||||||
|
|
||||||
We also don't expect T_PTR messages. */
|
We also don't expect T_PTR or T_DNAME messages. */
|
||||||
syslog (LOG_DEBUG | LOG_AUTH,
|
syslog (LOG_DEBUG | LOG_AUTH,
|
||||||
"getaddrinfo*.gaih_getanswer: got type \"%s\"",
|
"getaddrinfo*.gaih_getanswer: got type \"%s\"",
|
||||||
p_type (type));
|
p_type (type));
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ o-objects.ob := memcpy.o memset.o memchr.o
|
||||||
|
|
||||||
strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \
|
strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \
|
||||||
stpcpy stpncpy strcat strchr strcmp strcpy strcspn \
|
stpcpy stpncpy strcat strchr strcmp strcpy strcspn \
|
||||||
strlen strncmp strncpy strpbrk strrchr strspn
|
strlen strncmp strncpy strpbrk strrchr strspn memmem
|
||||||
tests := tester inl-tester noinl-tester testcopy test-ffs \
|
tests := tester inl-tester noinl-tester testcopy test-ffs \
|
||||||
tst-strlen stratcliff tst-svc tst-inlcall \
|
tst-strlen stratcliff tst-svc tst-inlcall \
|
||||||
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
|
bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,185 @@
|
||||||
|
/* Test and measure memmem functions.
|
||||||
|
Copyright (C) 2008 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Written by Ulrich Drepper <drepper@redhat.com>, 2008.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with the GNU C Library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||||
|
02111-1307 USA. */
|
||||||
|
|
||||||
|
#define TEST_MAIN
|
||||||
|
#define BUF1PAGES 20
|
||||||
|
#define ITERATIONS 500
|
||||||
|
#include "test-string.h"
|
||||||
|
|
||||||
|
typedef char *(*proto_t) (const void *, size_t, const void *, size_t);
|
||||||
|
void *simple_memmem (const void *, size_t, const void *, size_t);
|
||||||
|
|
||||||
|
IMPL (simple_memmem, 0)
|
||||||
|
IMPL (memmem, 1)
|
||||||
|
|
||||||
|
void *
|
||||||
|
simple_memmem (const void *haystack, size_t haystack_len, const void *needle,
|
||||||
|
size_t needle_len)
|
||||||
|
{
|
||||||
|
const char *begin;
|
||||||
|
const char *const last_possible
|
||||||
|
= (const char *) haystack + haystack_len - needle_len;
|
||||||
|
|
||||||
|
if (needle_len == 0)
|
||||||
|
/* The first occurrence of the empty string is deemed to occur at
|
||||||
|
the beginning of the string. */
|
||||||
|
return (void *) haystack;
|
||||||
|
|
||||||
|
/* Sanity check, otherwise the loop might search through the whole
|
||||||
|
memory. */
|
||||||
|
if (__builtin_expect (haystack_len < needle_len, 0))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (begin = (const char *) haystack; begin <= last_possible; ++begin)
|
||||||
|
if (begin[0] == ((const char *) needle)[0] &&
|
||||||
|
!memcmp ((const void *) &begin[1],
|
||||||
|
(const void *) ((const char *) needle + 1),
|
||||||
|
needle_len - 1))
|
||||||
|
return (void *) begin;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_one_test (impl_t *impl, const void *haystack, size_t haystack_len,
|
||||||
|
const void *needle, size_t needle_len, const void *expected)
|
||||||
|
{
|
||||||
|
void *res;
|
||||||
|
|
||||||
|
res = CALL (impl, haystack, haystack_len, needle, needle_len);
|
||||||
|
if (res != expected)
|
||||||
|
{
|
||||||
|
error (0, 0, "Wrong result in function %s %p %p", impl->name,
|
||||||
|
res, expected);
|
||||||
|
ret = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
{
|
||||||
|
hp_timing_t start __attribute ((unused));
|
||||||
|
hp_timing_t stop __attribute ((unused));
|
||||||
|
hp_timing_t best_time = ~ (hp_timing_t) 0;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < 32; ++i)
|
||||||
|
{
|
||||||
|
HP_TIMING_NOW (start);
|
||||||
|
CALL (impl, haystack, haystack_len, needle, needle_len);
|
||||||
|
HP_TIMING_NOW (stop);
|
||||||
|
HP_TIMING_BEST (best_time, start, stop);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("\t%zd", (size_t) best_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_test (const char *str, size_t len, size_t idx)
|
||||||
|
{
|
||||||
|
char tmpbuf[len];
|
||||||
|
|
||||||
|
memcpy (tmpbuf, buf1 + idx, len);
|
||||||
|
memcpy (buf1 + idx, str, len);
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
printf ("String %s, offset %zd:", str, idx);
|
||||||
|
|
||||||
|
FOR_EACH_IMPL (impl, 0)
|
||||||
|
do_one_test (impl, buf1, BUF1PAGES * page_size, str, len, buf1 + idx);
|
||||||
|
|
||||||
|
memcpy (buf1 + idx, tmpbuf, len);
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
putchar ('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_random_tests (void)
|
||||||
|
{
|
||||||
|
for (size_t n = 0; n < ITERATIONS; ++n)
|
||||||
|
{
|
||||||
|
char tmpbuf[32];
|
||||||
|
|
||||||
|
size_t shift = random () % 11;
|
||||||
|
size_t rel = random () % ((2 << (shift + 1)) * 64);
|
||||||
|
size_t idx = MIN ((2 << shift) * 64 + rel, BUF1PAGES * page_size - 2);
|
||||||
|
size_t len = random () % (sizeof (tmpbuf) - 1) + 1;
|
||||||
|
len = MIN (len, BUF1PAGES * page_size - idx - 1);
|
||||||
|
memcpy (tmpbuf, buf1 + idx, len);
|
||||||
|
for (size_t i = random () % len / 2 + 1; i > 0; --i)
|
||||||
|
{
|
||||||
|
size_t off = random () % len;
|
||||||
|
char ch = '0' + random () % 10;
|
||||||
|
|
||||||
|
buf1[idx + off] = ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
printf ("String %.*s, offset %zd:", (int) len, buf1 + idx, idx);
|
||||||
|
|
||||||
|
FOR_EACH_IMPL (impl, 0)
|
||||||
|
do_one_test (impl, buf1, BUF1PAGES * page_size, buf1 + idx, len,
|
||||||
|
buf1 + idx);
|
||||||
|
|
||||||
|
if (HP_TIMING_AVAIL)
|
||||||
|
putchar ('\n');
|
||||||
|
|
||||||
|
memcpy (buf1 + idx, tmpbuf, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const char *const strs[] =
|
||||||
|
{
|
||||||
|
"00000", "00112233", "0123456789", "0000111100001111",
|
||||||
|
"00000111110000022222", "012345678901234567890",
|
||||||
|
"abc0", "aaaa0", "abcabc0"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
test_main (void)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
test_init ();
|
||||||
|
|
||||||
|
printf ("%23s", "");
|
||||||
|
FOR_EACH_IMPL (impl, 0)
|
||||||
|
printf ("\t%s", impl->name);
|
||||||
|
putchar ('\n');
|
||||||
|
|
||||||
|
for (i = 0; i < BUF1PAGES * page_size; ++i)
|
||||||
|
buf1[i] = 60 + random () % 32;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof (strs) / sizeof (strs[0]); ++i)
|
||||||
|
for (size_t j = 0; j < 120; j += 7)
|
||||||
|
{
|
||||||
|
size_t len = strlen (strs[i]);
|
||||||
|
|
||||||
|
do_test (strs[i], len, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
do_random_tests ();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "../test-skeleton.c"
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* Test and measure string and memory functions.
|
/* Test and measure string and memory functions.
|
||||||
Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
|
Copyright (C) 1999, 2002, 2004, 2008 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
|
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
|
||||||
|
|
||||||
|
|
@ -118,6 +118,10 @@ size_t iterations = 100000;
|
||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
|
#ifndef BUF1PAGES
|
||||||
|
# define BUF1PAGES 1
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_init (void)
|
test_init (void)
|
||||||
{
|
{
|
||||||
|
|
@ -126,11 +130,11 @@ test_init (void)
|
||||||
if (page_size < MIN_PAGE_SIZE)
|
if (page_size < MIN_PAGE_SIZE)
|
||||||
page_size = MIN_PAGE_SIZE;
|
page_size = MIN_PAGE_SIZE;
|
||||||
#endif
|
#endif
|
||||||
buf1 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
|
buf1 = mmap (0, (BUF1PAGES + 1) * page_size, PROT_READ | PROT_WRITE,
|
||||||
MAP_PRIVATE | MAP_ANON, -1, 0);
|
MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
if (buf1 == MAP_FAILED)
|
if (buf1 == MAP_FAILED)
|
||||||
error (EXIT_FAILURE, errno, "mmap failed");
|
error (EXIT_FAILURE, errno, "mmap failed");
|
||||||
if (mprotect (buf1 + page_size, page_size, PROT_NONE))
|
if (mprotect (buf1 + BUF1PAGES * page_size, page_size, PROT_NONE))
|
||||||
error (EXIT_FAILURE, errno, "mprotect failed");
|
error (EXIT_FAILURE, errno, "mprotect failed");
|
||||||
buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
|
buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
|
||||||
MAP_PRIVATE | MAP_ANON, -1, 0);
|
MAP_PRIVATE | MAP_ANON, -1, 0);
|
||||||
|
|
@ -145,7 +149,7 @@ test_init (void)
|
||||||
srandom (seed);
|
srandom (seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
memset (buf1, 0xa5, page_size);
|
memset (buf1, 0xa5, BUF1PAGES * page_size);
|
||||||
memset (buf2, 0x5a, page_size);
|
memset (buf2, 0x5a, page_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue