From f1762c0c4b3ba91073f82da02a16d8ee29ed7444 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 3 Aug 2006 08:17:20 +0000 Subject: [PATCH] [BZ #2978] 2006-08-03 Ulrich Drepper * 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 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. --- ChangeLog | 26 ++++- localedata/ChangeLog | 7 ++ localedata/SUPPORTED | 1 + localedata/locales/csb_PL | 210 ++++++++++++++++++++++++++++++++++++++ nptl/ChangeLog | 4 + resolv/gai_cancel.c | 4 +- resolv/gai_error.c | 4 +- resolv/gai_misc.c | 32 ++++-- resolv/gai_misc.h | 4 +- resolv/gai_notify.c | 53 ++++++++-- resolv/gai_sigqueue.c | 4 +- resolv/gai_suspend.c | 18 +++- resolv/getaddrinfo_a.c | 21 +++- rt/Makefile | 3 +- rt/tst-clock2.c | 43 ++++++++ 15 files changed, 397 insertions(+), 37 deletions(-) create mode 100644 localedata/locales/csb_PL create mode 100644 rt/tst-clock2.c diff --git a/ChangeLog b/ChangeLog index 22c6665980..57c7ab8e8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,31 @@ +2006-08-03 Ulrich Drepper + + * 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 not "gai_misc.h". + * resolv/gai_error.c: Likewise. + * resolv/gai_sigqueue.c: Likewise. + 2006-08-02 Thomas Schwinge - * 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 [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 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 + + * SUPPORTED (SUPPORTED-LOCALES): Add csb_PL.UTF-8. + + [BZ #2961] + * locales/csb_PL: New file. + 2006-08-01 Ulrich Drepper * 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 +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +reorder-after + + + +reorder-after + + + +reorder-after + + +reorder-after + + +reorder-after + + + + +reorder-after + + +reorder-after + + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-after + ;;;IGNORE + ;;;IGNORE + +reorder-end + +END LC_COLLATE + +LC_MESSAGES +yesexpr "" +noexpr "" + +END LC_MESSAGES + +LC_MONETARY +copy "pl_PL" +END LC_MONETARY + +LC_NUMERIC +copy "pl_PL" +END LC_NUMERIC + +LC_TIME +abday ""; "";/ + ""; "";/ + ""; "";/ + "" + +day "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +abmon ""; "";/ + ""; "";/ + ""; "";/ + ""; "";/ + ""; "";/ + ""; "" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "" +d_t_fmt "" +d_fmt "" +t_fmt "" +am_pm "";"" +t_fmt_ampm "" +date_fmt "/ +/ +" +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 + + * sysdeps/pthread/gai_misc.h: New file. + 2006-08-01 Ulrich Drepper * 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 , 2001. @@ -20,7 +20,7 @@ #include #include -#include "gai_misc.h" +#include 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 , 2001. @@ -19,7 +19,7 @@ #include -#include "gai_misc.h" +#include 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 , 2001. @@ -23,10 +23,31 @@ #include #include -#include "gai_misc.h" +#include +#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 , 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 , 2001. @@ -20,15 +20,24 @@ #include #include #include +#include -#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 #include -#include "gai_misc.h" +#include 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 , 2001. @@ -23,7 +23,7 @@ #include #include -#include "gai_misc.h" +#include 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 , 2001. @@ -23,7 +23,7 @@ #include #include -#include "gai_misc.h" +#include /* 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 +#include + +#if defined CLOCK_MONOTONIC && defined _POSIX_MONOTONIC_CLOCK + +# include +# include + +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"