aboutsummaryrefslogtreecommitdiff
path: root/resolv/gai_notify.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-12-22 20:10:10 +0000
committerUlrich Drepper <drepper@redhat.com>2004-12-22 20:10:10 +0000
commita334319f6530564d22e775935d9c91663623a1b4 (patch)
treeb5877475619e4c938e98757d518bb1e9cbead751 /resolv/gai_notify.c
parent0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (diff)
downloadglibc-a334319f6530564d22e775935d9c91663623a1b4.zip
glibc-a334319f6530564d22e775935d9c91663623a1b4.tar.gz
glibc-a334319f6530564d22e775935d9c91663623a1b4.tar.bz2
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
Diffstat (limited to 'resolv/gai_notify.c')
-rw-r--r--resolv/gai_notify.c53
1 files changed, 10 insertions, 43 deletions
diff --git a/resolv/gai_notify.c b/resolv/gai_notify.c
index c3ce0af..987a64c 100644
--- a/resolv/gai_notify.c
+++ b/resolv/gai_notify.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
@@ -20,24 +20,15 @@
#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)
{
- 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);
+ struct sigevent *sigev = arg;
+ sigev->sigev_notify_function (sigev->sigev_value);
return NULL;
}
@@ -63,26 +54,8 @@ __gai_notify_only (struct sigevent *sigev, pid_t caller_pid)
pattr = &attr;
}
- /* 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)
+ if (pthread_create (&tid, pattr, notify_func_wrapper, sigev) < 0)
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. */
@@ -106,21 +79,15 @@ __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)
- {
-#ifdef DONT_NEED_GAI_MISC_COND
- GAI_MISC_NOTIFY (waitlist);
-#else
- /* Decrement the counter. */
- --*waitlist->counterp;
-
- pthread_cond_signal (waitlist->cond);
-#endif
- }
+ pthread_cond_signal (waitlist->cond);
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