From 4aee85f96b881c1cb80a1fff752b8e2130a9a4d9 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Fri, 10 May 2019 14:17:26 +0200 Subject: [PATCH] sem_close: Use __twalk_r --- ChangeLog | 6 ++++++ nptl/sem_close.c | 28 +++++++++++++++------------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8f6b8c8..1857303 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2019-05-10 Florian Weimer + + * nptl/sem_close.c (struct walk_closure): Define. + (walker): Adjust for __twalk_r. + (sem_close): Call __twalk_r. + 2019-05-09 Adhemerval Zanella * support/timespec.c (test_timespec_before_impl, diff --git a/nptl/sem_close.c b/nptl/sem_close.c index b8828cb..8941f11 100644 --- a/nptl/sem_close.c +++ b/nptl/sem_close.c @@ -21,21 +21,20 @@ #include #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 -- 2.7.4