summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2019-05-03 12:05:31 +0200
committerFlorian Weimer <fweimer@redhat.com>2019-05-03 12:05:32 +0200
commit5b0b45c99e831c03554f2477c63ac8e04c865cc7 (patch)
treeb4732698cb1b5be41889408feeb8d959dfa3d21d
parentac3da35de5cf113edfd514c2fc8ccbaed4536aaf (diff)
downloadglibc-fw/twalk_r-sem.tar.gz
sem_close: Use __twalk_rfw/twalk_r-sem
-rw-r--r--ChangeLog6
-rw-r--r--nptl/sem_close.c28
2 files changed, 21 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 3c4dcb31fc..820b70c388 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2019-05-03 Florian Weimer <fweimer@redhat.com>
+ * nptl/sem_close.c (struct walk_closure): Define.
+ (walker): Adjust for __twalk_r.
+ (sem_close): Call __twalk_r.
+
+2019-05-03 Florian Weimer <fweimer@redhat.com>
+
* misc/tst-tsearch.c (walk_tree): Add more error checking.
2019-05-02 Adhemerval Zanella <adhemerval.zanella@linaro.org>
diff --git a/nptl/sem_close.c b/nptl/sem_close.c
index b8828cba06..8941f111f9 100644
--- a/nptl/sem_close.c
+++ b/nptl/sem_close.c
@@ -21,21 +21,20 @@
#include <sys/mman.h>
#include "semaphoreP.h"
-
-/* Global variables to parametrize the walk function. This works
- since we always have to use locks. And we have to use the twalk
- function since the entries are not sorted wrt the mapping
- address. */
-static sem_t *the_sem;
-static struct inuse_sem *rec;
+struct walk_closure
+{
+ sem_t *the_sem;
+ struct inuse_sem *rec;
+};
static void
-walker (const void *inodep, const VISIT which, const int depth)
+walker (const void *inodep, VISIT which, void *closure0)
{
+ struct walk_closure *closure = closure0;
struct inuse_sem *nodep = *(struct inuse_sem **) inodep;
- if (nodep->sem == the_sem)
- rec = nodep;
+ if (nodep->sem == closure->the_sem)
+ closure->rec = nodep;
}
@@ -48,9 +47,12 @@ sem_close (sem_t *sem)
lll_lock (__sem_mappings_lock, LLL_PRIVATE);
/* Locate the entry for the mapping the caller provided. */
- rec = NULL;
- the_sem = sem;
- __twalk (__sem_mappings, walker);
+ struct inuse_sem *rec;
+ {
+ struct walk_closure closure = { .the_sem = sem, .rec = NULL };
+ __twalk_r (__sem_mappings, walker, &closure);
+ rec = closure.rec;
+ }
if (rec != NULL)
{
/* Check the reference counter. If it is going to be zero, free