diff options
author | Ulrich Drepper <drepper@redhat.com> | 2006-08-03 08:17:20 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2006-08-03 08:17:20 +0000 |
commit | f1762c0c4b3ba91073f82da02a16d8ee29ed7444 (patch) | |
tree | dd3ed0e40f1cb6a2560dfba1fd300cfe98be28ba | |
parent | NPTL specific definitions for async name lookup. (diff) | |
download | glibc-f1762c0c4b3ba91073f82da02a16d8ee29ed7444.tar.gz glibc-f1762c0c4b3ba91073f82da02a16d8ee29ed7444.tar.bz2 glibc-f1762c0c4b3ba91073f82da02a16d8ee29ed7444.zip |
[BZ #2978]
2006-08-03 Ulrich Drepper <drepper@redhat.com>
* rt/Makefile (tests): Add tst-clock2.
* rt/tst-clock2.c: New file.
[BZ #2978]
* resolv/gai_notify.c (__gai_notify_only): Copy memory for thread
function and its parameters and pass it to new thread.
(__gai_notify): Add support for alternative waiting for completion.
* resolv/gai_suspend.c (gai_suspend): Add support for alternative
waiting for completion.
* resolv/getaddrinfo_a.c: Likewise.
* resolv/gai_misc.h (struct waitlist): Don't add cond if alternative
waiting for completion is used.
* resolv/gai_misc.c: Allow overwriting code to start helper thread.
* resolv/gai_cancel.c: Include <gai_misc.h> not "gai_misc.h".
* resolv/gai_error.c: Likewise.
* resolv/gai_sigqueue.c: Likewise.
* hurd/getdport.c (__detdport): Don't return EBADF; instead set
errno to EBADF and return MACH_PORT_NULL.
* posix/Makefile (CFLAGS-waitid.c): Add -fasynchronous-unwind-tables.
-rw-r--r-- | ChangeLog | 26 | ||||
-rw-r--r-- | localedata/ChangeLog | 7 | ||||
-rw-r--r-- | localedata/SUPPORTED | 1 | ||||
-rw-r--r-- | localedata/locales/csb_PL | 210 | ||||
-rw-r--r-- | nptl/ChangeLog | 4 | ||||
-rw-r--r-- | resolv/gai_cancel.c | 4 | ||||
-rw-r--r-- | resolv/gai_error.c | 4 | ||||
-rw-r--r-- | resolv/gai_misc.c | 32 | ||||
-rw-r--r-- | resolv/gai_misc.h | 4 | ||||
-rw-r--r-- | resolv/gai_notify.c | 53 | ||||
-rw-r--r-- | resolv/gai_sigqueue.c | 4 | ||||
-rw-r--r-- | resolv/gai_suspend.c | 18 | ||||
-rw-r--r-- | resolv/getaddrinfo_a.c | 21 | ||||
-rw-r--r-- | rt/Makefile | 3 | ||||
-rw-r--r-- | rt/tst-clock2.c | 43 |
15 files changed, 397 insertions, 37 deletions
@@ -1,13 +1,31 @@ +2006-08-03 Ulrich Drepper <drepper@redhat.com> + + * rt/Makefile (tests): Add tst-clock2. + * rt/tst-clock2.c: New file. + + [BZ #2978] + * resolv/gai_notify.c (__gai_notify_only): Copy memory for thread + function and its parameters and pass it to new thread. + (__gai_notify): Add support for alternative waiting for completion. + * resolv/gai_suspend.c (gai_suspend): Add support for alternative + waiting for completion. + * resolv/getaddrinfo_a.c: Likewise. + * resolv/gai_misc.h (struct waitlist): Don't add cond if alternative + waiting for completion is used. + * resolv/gai_misc.c: Allow overwriting code to start helper thread. + * resolv/gai_cancel.c: Include <gai_misc.h> not "gai_misc.h". + * resolv/gai_error.c: Likewise. + * resolv/gai_sigqueue.c: Likewise. + 2006-08-02 Thomas Schwinge <tschwinge@gnu.org> - * hurd/getdport.c (__detdport): Don't return EBADF; instead set - errno to EBADF and return MACH_PORT_NULL. + * hurd/getdport.c (__detdport): Don't return EBADF; instead set + errno to EBADF and return MACH_PORT_NULL. 2006-06-23 Joseph Myers <joseph@codesourcery.com> [BZ #2980] - * posix/Makefile (CFLAGS-waitid.c): Add - -fasynchronous-unwind-tables. + * posix/Makefile (CFLAGS-waitid.c): Add -fasynchronous-unwind-tables. 2006-08-02 Ulrich Drepper <drepper@redhat.com> diff --git a/localedata/ChangeLog b/localedata/ChangeLog index b58c0c09f9..da0662c144 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,10 @@ +2006-08-03 Ulrich Drepper <drepper@redhat.com> + + * SUPPORTED (SUPPORTED-LOCALES): Add csb_PL.UTF-8. + + [BZ #2961] + * locales/csb_PL: New file. + 2006-08-01 Ulrich Drepper <drepper@redhat.com> * locales/es_NI: Define real t_fmt_ampm and am_pm. diff --git a/localedata/SUPPORTED b/localedata/SUPPORTED index 83a23ffeb5..55e950e637 100644 --- a/localedata/SUPPORTED +++ b/localedata/SUPPORTED @@ -72,6 +72,7 @@ ca_IT.UTF-8/UTF-8 \ ca_IT/ISO-8859-15 \ cs_CZ.UTF-8/UTF-8 \ cs_CZ/ISO-8859-2 \ +csb_PL/UTF-8 \ cy_GB.UTF-8/UTF-8 \ cy_GB/ISO-8859-14 \ da_DK.UTF-8/UTF-8 \ diff --git a/localedata/locales/csb_PL b/localedata/locales/csb_PL new file mode 100644 index 0000000000..663fd6cf8d --- /dev/null +++ b/localedata/locales/csb_PL @@ -0,0 +1,210 @@ +comment_char % +escape_char / +% +% Kashubian Language Locale for Poland +% Source: csb_PL locale +% Contact: Michal Ostrowski +% Email: ostrowski.michal@gmail.com +% Tel: +48586717262 +% Fax: none +% Language: csb +% Territory: PL +% Revision: 1.0 +% Date: 2006-07-25 +% Application: general +% Users: general +% Charset: UTF-8 +% Distribution and use is free, also +% for commercial purposes. + +LC_IDENTIFICATION +title "Kashubian locale for Poland" +source "csb_PL locale" +address "" +contact "Michal Ostrowski" +email "bug-glibc-locales@gnu.org" +tel "" +fax "" +language "Kashubian" +territory "Poland" +revision "1.0" +date "2006-07-25" +audience "general" +application "GNU locale" +abbreviation "" +% +category "csb_PL:2000";LC_IDENTIFICATION +category "csb_PL:2000";LC_CTYPE +category "csb_PL:2000";LC_COLLATE +category "csb_PL:2000";LC_TIME +category "csb_PL:2000";LC_NUMERIC +category "csb_PL:2000";LC_MONETARY +category "csb_PL:2000";LC_MESSAGES +category "csb_PL:2000";LC_PAPER +category "csb_PL:2000";LC_NAME +category "csb_PL:2000";LC_ADDRESS +category "csb_PL:2000";LC_TELEPHONE + +END LC_IDENTIFICATION + +LC_CTYPE +copy "pl_PL" +END LC_CTYPE + +LC_COLLATE +copy "iso14651_t1" + +collating-symbol <aogonek> +collating-symbol <atilde> +collating-symbol <eacute> +collating-symbol <ediaeresis> +collating-symbol <lstroke> +collating-symbol <nacute> +collating-symbol <ograve> +collating-symbol <oacute> +collating-symbol <ocircumflex> +collating-symbol <ugrave> +collating-symbol <zdot> + +reorder-after <a> +<aogonek> +<atilde> + +reorder-after <e> +<eacute> +<ediaeresis> + +reorder-after <l> +<lstroke> + +reorder-after <n> +<nacute> + +reorder-after <o> +<ograve> +<oacute> +<ocircumflex> + +reorder-after <u> +<ugrave> + +reorder-after <z> +<zdot> + +reorder-after <U0061> +<U0105> <aogonek>;<BAS>;<MIN>;IGNORE +<U0104> <aogonek>;<BAS>;<CAP>;IGNORE +<U00E3> <atilde>;<BAS>;<MIN>;IGNORE +<U00C3> <atilde>;<BAS>;<CAP>;IGNORE + +reorder-after <U0065> +<U00E9> <eacute>;<BAS>;<MIN>;IGNORE +<U00C9> <eacute>;<BAS>;<CAP>;IGNORE +<U00EB> <ediaeresis>;<BAS>;<MIN>;IGNORE +<U00CB> <ediaeresis>;<BAS>;<CAP>;IGNORE + +reorder-after <U006C> +<U0142> <lstroke>;<BAS>;<MIN>;IGNORE +<U0141> <lstroke>;<BAS>;<CAP>;IGNORE + +reorder-after <U006E> +<U0144> <nacute>;<BAS>;<MIN>;IGNORE +<U0143> <nacute>;<BAS>;<CAP>;IGNORE + +reorder-after <U006F> +<U00F2> <ograve>;<BAS>;<MIN>;IGNORE +<U00D2> <ograve>;<BAS>;<CAP>;IGNORE +<U00F3> <oacute>;<BAS>;<MIN>;IGNORE +<U00D3> <oacute>;<BAS>;<CAP>;IGNORE +<U00F4> <ocircumflex>;<BAS>;<MIN>;IGNORE +<U00D4> <ocircumflex>;<BAS>;<CAP>;IGNORE + +reorder-after <U0075> +<U00F9> <ugrave>;<BAS>;<MIN>;IGNORE +<U00D9> <ugrave>;<BAS>;<CAP>;IGNORE + +reorder-after <U007A> +<U017C> <zdot>;<BAS>;<MIN>;IGNORE +<U017B> <zdot>;<BAS>;<CAP>;IGNORE + +reorder-end + +END LC_COLLATE + +LC_MESSAGES +yesexpr "<U005E><U005B><U004A><U006A><U0054><U0074><U0059><U0079><U005D><U002E><U002A>" +noexpr "<U005E><U005B><U006E><U004E><U005D><U002E><U002A>" + +END LC_MESSAGES + +LC_MONETARY +copy "pl_PL" +END LC_MONETARY + +LC_NUMERIC +copy "pl_PL" +END LC_NUMERIC + +LC_TIME +abday "<U006E><U0069><U0065>"; "<U0070><U00F2><U006E>";/ + "<U0077><U0074><U00F3>"; "<U0073><U0074><U0072>";/ + "<U0063><U007A><U0077>"; "<U0070><U0069><U0105>";/ + "<U0073><U006F><U0062>" + +day "<U006E><U0069><U0065><U0064><U007A><U0065><U006C><U0061>";/ + "<U0070><U00F2><U006E><U0069><U0065><U0064><U007A><U00F4><U0142><U006B>";/ + "<U0077><U0074><U00F3><U0072><U006B>";/ + "<U0073><U0074><U0072><U007A><U006F><U0064><U0061>";/ + "<U0063><U007A><U0077><U0069><U00F4><U0072><U0074><U006B>";/ + "<U0070><U0069><U0105><U0074><U006B>";/ + "<U0073><U006F><U0062><U00F2><U0074><U0061>" +abmon "<U0073><U0074><U00EB>"; "<U0067><U0072><U006F>";/ + "<U0073><U0074><U006D>"; "<U0142><U017C><U00EB>";/ + "<U006D><U00F4><U006A>"; "<U0063><U007A><U0065>";/ + "<U006C><U00EB><U0070>"; "<U007A><U00E9><U006C>";/ + "<U0073><U00E9><U0077>"; "<U0072><U0075><U006A>";/ + "<U006C><U00EB><U0073>"; "<U0067><U00F2><U0064>" +mon "<U0073><U0074><U00EB><U0063><U007A><U006E><U0069><U006B>";/ + "<U0067><U0072><U006F><U006D><U0069><U0063><U007A><U006E><U0069><U006B>";/ + "<U0073><U0074><U0072><U0075><U006D><U0069><U0061><U006E><U006E><U0069><U006B>";/ + "<U0142><U017C><U00EB><U006B><U0077><U0069><U00F4><U0074>";/ + "<U006D><U00F4><U006A>";/ + "<U0063><U007A><U0065><U0072><U0077><U0069><U0144><U0063>";/ + "<U006C><U00EB><U0070><U0069><U006E><U0063>";/ + "<U007A><U00E9><U006C><U006E><U0069><U006B>";/ + "<U0073><U00E9><U0077><U006E><U0069><U006B>";/ + "<U0072><U0075><U006A><U0061><U006E>";/ + "<U006C><U00EB><U0073><U0074><U006F><U0070><U0061><U0064><U006E><U0069><U006B>";/ + "<U0067><U00F2><U0064><U006E><U0069><U006B>" +d_t_fmt "<U0025><U0061><U0020><U0025><U0064><U0020><U0025><U0062><U0020><U0025><U0059><U0020><U0025><U0054><U0020><U0025><U005A>" +d_fmt "<U0025><U0059><U002D><U0025><U006D><U002D><U0025><U0064>" +t_fmt "<U0025><U0054>" +am_pm "";"" +t_fmt_ampm "" +date_fmt "<U0025><U0061><U0020><U0025><U0062><U0020><U0025><U0065>/ +<U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U0020>/ +<U0025><U005A><U0020><U0025><U0059>" +week 7;19971201;4 +first_weekday 2 +first_workday 2 +END LC_TIME + +LC_PAPER +copy "pl_PL" +END LC_PAPER + +LC_TELEPHONE +copy "pl_PL" +END LC_TELEPHONE + +LC_MEASUREMENT +copy "pl_PL" +END LC_MEASUREMENT + +LC_NAME +copy "pl_PL" +END LC_NAME + +LC_ADDRESS +copy "pl_PL" +END LC_ADDRESS diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 3e4008b3dc..fc40640a33 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,7 @@ +2006-08-03 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/pthread/gai_misc.h: New file. + 2006-08-01 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/i386/smp.h: New file. Old Linux-specific diff --git a/resolv/gai_cancel.c b/resolv/gai_cancel.c index 45432065c4..19a0a9bb87 100644 --- a/resolv/gai_cancel.c +++ b/resolv/gai_cancel.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -20,7 +20,7 @@ #include <netdb.h> #include <pthread.h> -#include "gai_misc.h" +#include <gai_misc.h> int diff --git a/resolv/gai_error.c b/resolv/gai_error.c index 0620b04b9d..4c91628a62 100644 --- a/resolv/gai_error.c +++ b/resolv/gai_error.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -19,7 +19,7 @@ #include <netdb.h> -#include "gai_misc.h" +#include <gai_misc.h> int gai_error (struct gaicb *req) diff --git a/resolv/gai_misc.c b/resolv/gai_misc.c index b3334f38ef..2eec0f529d 100644 --- a/resolv/gai_misc.c +++ b/resolv/gai_misc.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -23,10 +23,31 @@ #include <stdlib.h> #include <sys/time.h> -#include "gai_misc.h" +#include <gai_misc.h> +#ifndef gai_create_helper_thread +# define gai_create_helper_thread __gai_create_helper_thread + +extern inline int +__gai_create_helper_thread (pthread_t *threadp, void *(*tf) (void *), + void *arg) +{ + pthread_attr_t attr; + + /* Make sure the thread is created detached. */ + pthread_attr_init (&attr); + pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); + + int ret = pthread_create (threadp, &attr, tf, arg); + + (void) pthread_attr_destroy (&attr); + return ret; +} +#endif + + /* Pool of request list entries. */ static struct requestlist **pool; @@ -229,16 +250,11 @@ __gai_enqueue_request (struct gaicb *gaicbp) if (nthreads < optim.gai_threads && idle_thread_count == 0) { pthread_t thid; - pthread_attr_t attr; newp->running = 1; - /* Make sure the thread is created detached. */ - pthread_attr_init (&attr); - pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); - /* Now try to start a thread. */ - if (pthread_create (&thid, &attr, handle_requests, newp) == 0) + if (gai_create_helper_thread (&thid, handle_requests, newp) == 0) /* We managed to enqueue the request. All errors which can happen now can be recognized by calls to `gai_error'. */ ++nthreads; diff --git a/resolv/gai_misc.h b/resolv/gai_misc.h index 48a93977ae..94005de02c 100644 --- a/resolv/gai_misc.h +++ b/resolv/gai_misc.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -29,7 +29,9 @@ struct waitlist { struct waitlist *next; +#ifndef DONT_NEED_GAI_MISC_COND pthread_cond_t *cond; +#endif volatile int *counterp; /* The next field is used in asynchronous `lio_listio' operations. */ struct sigevent *sigevp; diff --git a/resolv/gai_notify.c b/resolv/gai_notify.c index 987a64c0e2..c3ce0afb45 100644 --- a/resolv/gai_notify.c +++ b/resolv/gai_notify.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -20,15 +20,24 @@ #include <netdb.h> #include <pthread.h> #include <stdlib.h> +#include <gai_misc.h> -#include "gai_misc.h" +struct notify_func + { + void (*func) (sigval_t); + sigval_t value; + }; static void * notify_func_wrapper (void *arg) { - struct sigevent *sigev = arg; - sigev->sigev_notify_function (sigev->sigev_value); + gai_start_notify_thread (); + struct notify_func *const n = arg; + void (*func) (sigval_t) = n->func; + sigval_t value = n->value; + free (n); + (*func) (value); return NULL; } @@ -54,8 +63,26 @@ __gai_notify_only (struct sigevent *sigev, pid_t caller_pid) pattr = &attr; } - if (pthread_create (&tid, pattr, notify_func_wrapper, sigev) < 0) + /* SIGEV may be freed as soon as we return, so we cannot let the + notification thread use that pointer. Even though a sigval_t is + only one word and the same size as a void *, we cannot just pass + the value through pthread_create as the argument and have the new + thread run the user's function directly, because on some machines + the calling convention for a union like sigval_t is different from + that for a pointer type like void *. */ + struct notify_func *nf = malloc (sizeof *nf); + if (nf == NULL) result = -1; + else + { + nf->func = sigev->sigev_notify_function; + nf->value = sigev->sigev_value; + if (pthread_create (&tid, pattr, notify_func_wrapper, nf) < 0) + { + free (nf); + result = -1; + } + } } else if (sigev->sigev_notify == SIGEV_SIGNAL) /* We have to send a signal. */ @@ -79,15 +106,21 @@ __gai_notify (struct requestlist *req) { struct waitlist *next = waitlist->next; - /* Decrement the counter. This is used in both cases. */ - --*waitlist->counterp; - if (waitlist->sigevp == NULL) - pthread_cond_signal (waitlist->cond); + { +#ifdef DONT_NEED_GAI_MISC_COND + GAI_MISC_NOTIFY (waitlist); +#else + /* Decrement the counter. */ + --*waitlist->counterp; + + pthread_cond_signal (waitlist->cond); +#endif + } else /* This is part of a asynchronous `getaddrinfo_a' operation. If this request is the last one, send the signal. */ - if (*waitlist->counterp == 0) + if (--*waitlist->counterp == 0) { __gai_notify_only (waitlist->sigevp, waitlist->caller_pid); /* This is tricky. See getaddrinfo_a.c for the reason why diff --git a/resolv/gai_sigqueue.c b/resolv/gai_sigqueue.c index 2c91df6ddc..278a1d8026 100644 --- a/resolv/gai_sigqueue.c +++ b/resolv/gai_sigqueue.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006 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 @@ -20,7 +20,7 @@ #include <errno.h> #include <signal.h> -#include "gai_misc.h" +#include <gai_misc.h> int __gai_sigqueue (sig, val, caller_pid) diff --git a/resolv/gai_suspend.c b/resolv/gai_suspend.c index bb3c9c3402..c2095124b7 100644 --- a/resolv/gai_suspend.c +++ b/resolv/gai_suspend.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -23,7 +23,7 @@ #include <stdlib.h> #include <sys/time.h> -#include "gai_misc.h" +#include <gai_misc.h> int @@ -32,9 +32,11 @@ gai_suspend (const struct gaicb *const list[], int ent, { struct waitlist waitlist[ent]; struct requestlist *requestlist[ent]; +#ifndef DONT_NEED_GAI_MISC_COND pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +#endif int cnt; - int dummy; + int cntr = 1; int none = 1; int result; @@ -50,9 +52,11 @@ gai_suspend (const struct gaicb *const list[], int ent, if (requestlist[cnt] != NULL) { +#ifndef DONT_NEED_GAI_MISC_COND waitlist[cnt].cond = &cond; +#endif waitlist[cnt].next = requestlist[cnt]->waiting; - waitlist[cnt].counterp = &dummy; + waitlist[cnt].counterp = &cntr; waitlist[cnt].sigevp = NULL; waitlist[cnt].caller_pid = 0; /* Not needed. */ requestlist[cnt]->waiting = &waitlist[cnt]; @@ -78,6 +82,9 @@ gai_suspend (const struct gaicb *const list[], int ent, which we must remove. So defer cancelation for now. */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate); +#ifdef DONT_NEED_GAI_MISC_COND + GAI_MISC_WAIT (result, cntr, timeout, 1); +#else if (timeout == NULL) result = pthread_cond_wait (&cond, &__gai_requests_mutex); else @@ -99,6 +106,7 @@ gai_suspend (const struct gaicb *const list[], int ent, result = pthread_cond_timedwait (&cond, &__gai_requests_mutex, &abstime); } +#endif /* Now remove the entry in the waiting list for all requests which didn't terminate. */ @@ -121,10 +129,12 @@ gai_suspend (const struct gaicb *const list[], int ent, /* Now it's time to restore the cancelation state. */ pthread_setcancelstate (oldstate, NULL); +#ifndef DONT_NEED_GAI_MISC_COND /* Release the conditional variable. */ if (pthread_cond_destroy (&cond) != 0) /* This must never happen. */ abort (); +#endif if (result != 0) { diff --git a/resolv/getaddrinfo_a.c b/resolv/getaddrinfo_a.c index abac27d361..f6af3aa45a 100644 --- a/resolv/getaddrinfo_a.c +++ b/resolv/getaddrinfo_a.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. @@ -23,7 +23,7 @@ #include <stdlib.h> #include <unistd.h> -#include "gai_misc.h" +#include <gai_misc.h> /* We need this special structure to handle asynchronous I/O. */ @@ -96,7 +96,9 @@ getaddrinfo_a (int mode, struct gaicb *list[], int ent, struct sigevent *sig) } else if (mode == GAI_WAIT) { +#ifndef DONT_NEED_GAI_MISC_COND pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +#endif struct waitlist waitlist[ent]; int oldstate; @@ -104,7 +106,9 @@ getaddrinfo_a (int mode, struct gaicb *list[], int ent, struct sigevent *sig) for (cnt = 0; cnt < ent; ++cnt) if (requests[cnt] != NULL) { +#ifndef DONT_NEED_GAI_MISC_COND waitlist[cnt].cond = &cond; +#endif waitlist[cnt].next = requests[cnt]->waiting; waitlist[cnt].counterp = &total; waitlist[cnt].sigevp = NULL; @@ -119,15 +123,24 @@ getaddrinfo_a (int mode, struct gaicb *list[], int ent, struct sigevent *sig) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate); while (total > 0) - pthread_cond_wait (&cond, &__gai_requests_mutex); + { +#ifdef DONT_NEED_GAI_MISC_COND + int result; + GAI_MISC_WAIT (result, total, NULL, 1); +#else + pthread_cond_wait (&cond, &__gai_requests_mutex); +#endif + } /* Now it's time to restore the cancelation state. */ pthread_setcancelstate (oldstate, NULL); +#ifndef DONT_NEED_GAI_MISC_COND /* Release the conditional variable. */ if (pthread_cond_destroy (&cond) != 0) /* This must never happen. */ abort (); +#endif } else { @@ -147,7 +160,9 @@ getaddrinfo_a (int mode, struct gaicb *list[], int ent, struct sigevent *sig) for (cnt = 0; cnt < ent; ++cnt) if (requests[cnt] != NULL) { +#ifndef DONT_NEED_GAI_MISC_COND waitlist->list[cnt].cond = NULL; +#endif waitlist->list[cnt].next = requests[cnt]->waiting; waitlist->list[cnt].counterp = &waitlist->counter; waitlist->list[cnt].sigevp = &waitlist->sigev; diff --git a/rt/Makefile b/rt/Makefile index f8487975dd..148ded996e 100644 --- a/rt/Makefile +++ b/rt/Makefile @@ -48,7 +48,8 @@ tests := tst-shm tst-clock tst-clock_nanosleep tst-timer tst-timer2 \ tst-mqueue5 tst-mqueue6 tst-mqueue7 tst-mqueue8 tst-mqueue9 \ tst-timer3 tst-timer4 tst-timer5 \ tst-cpuclock1 tst-cpuclock2 \ - tst-cputimer1 tst-cputimer2 tst-cputimer3 + tst-cputimer1 tst-cputimer2 tst-cputimer3 \ + tst-clock2 extra-libs := librt extra-libs-others := $(extra-libs) diff --git a/rt/tst-clock2.c b/rt/tst-clock2.c new file mode 100644 index 0000000000..4c8fb9f247 --- /dev/null +++ b/rt/tst-clock2.c @@ -0,0 +1,43 @@ +/* Test setting the monotonic clock. */ + +#include <time.h> +#include <unistd.h> + +#if defined CLOCK_MONOTONIC && defined _POSIX_MONOTONIC_CLOCK + +# include <errno.h> +# include <stdio.h> + +static int +do_test (void) +{ + if (sysconf (_SC_MONOTONIC_CLOCK) <= 0) + return 0; + + struct timespec ts; + if (clock_gettime (CLOCK_MONOTONIC, &ts) != 0) + { + puts ("clock_gettime(CLOCK_MONOTONIC) failed"); + return 1; + } + + /* Setting the monotonic clock must fail. */ + if (clock_settime (CLOCK_MONOTONIC, &ts) != -1) + { + puts ("clock_settime(CLOCK_MONOTONIC) did not fail"); + return 1; + } + if (errno != EINVAL) + { + printf ("clock_settime(CLOCK_MONOTONIC) set errno to %d, expected %d\n", + errno, EINVAL); + return 1; + } + return 0; +} +# define TEST_FUNCTION do_test () + +#else +# define TEST_FUNCTION 0 +#endif +#include "../test-skeleton.c" |