iconv: Use __twalk_r in __gconv_release_shlib
Commit Message
2019-05-02 Florian Weimer <fweimer@redhat.com>
* iconv/gconv_dl.c (release_handle): Remove file-level definition.
(do_release_shlib): Adjust for __twalk_r.
(__gconv_release_shlib): Call __twalk_r.
Comments
* Florian Weimer:
> 2019-05-02 Florian Weimer <fweimer@redhat.com>
>
> * iconv/gconv_dl.c (release_handle): Remove file-level definition.
> (do_release_shlib): Adjust for __twalk_r.
> (__gconv_release_shlib): Call __twalk_r.
>
> diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
> index cf7023a9aa..8379a488ed 100644
> --- a/iconv/gconv_dl.c
> +++ b/iconv/gconv_dl.c
> @@ -149,15 +149,11 @@ __gconv_find_shlib (const char *name)
> return found;
> }
>
> -
> -/* This is very ugly but the tsearch functions provide no way to pass
> - information to the walker function. So we use a global variable.
> - It is MT safe since we use a lock. */
> -static struct __gconv_loaded_object *release_handle;
> -
> static void
> -do_release_shlib (void *nodep, VISIT value, int level)
> +do_release_shlib (const void *nodep, VISIT value, void *closure)
> {
> +
> + struct __gconv_loaded_object *release_handle = closure;
> struct __gconv_loaded_object *obj = *(struct __gconv_loaded_object **) nodep;
>
> if (value != preorder && value != leaf)
> @@ -184,13 +180,10 @@ do_release_shlib (void *nodep, VISIT value, int level)
> void
> __gconv_release_shlib (struct __gconv_loaded_object *handle)
> {
> - /* Urgh, this is ugly but we have no other possibility. */
> - release_handle = handle;
> -
> /* Process all entries. Please note that we also visit entries
> with release counts <= 0. This way we can finally unload them
> if necessary. */
> - __twalk (loaded, (__action_fn_t) do_release_shlib);
> + __twalk_r (loaded, do_release_shlib, handle);
> }
Ping? This gets rid of “very ugly” code (their words, not mine).
Thanks,
Florian
On Mai 02 2019, Florian Weimer <fweimer@redhat.com> wrote:
> * iconv/gconv_dl.c (release_handle): Remove file-level definition.
> (do_release_shlib): Adjust for __twalk_r.
> (__gconv_release_shlib): Call __twalk_r.
Ok.
> diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
> index cf7023a9aa..8379a488ed 100644
> --- a/iconv/gconv_dl.c
> +++ b/iconv/gconv_dl.c
> @@ -149,15 +149,11 @@ __gconv_find_shlib (const char *name)
> return found;
> }
>
> -
> -/* This is very ugly but the tsearch functions provide no way to pass
> - information to the walker function. So we use a global variable.
> - It is MT safe since we use a lock. */
> -static struct __gconv_loaded_object *release_handle;
> -
> static void
> -do_release_shlib (void *nodep, VISIT value, int level)
> +do_release_shlib (const void *nodep, VISIT value, void *closure)
> {
> +
> + struct __gconv_loaded_object *release_handle = closure;
Extra empty line.
Andreas.
* Andreas Schwab:
> On Mai 02 2019, Florian Weimer <fweimer@redhat.com> wrote:
>
>> * iconv/gconv_dl.c (release_handle): Remove file-level definition.
>> (do_release_shlib): Adjust for __twalk_r.
>> (__gconv_release_shlib): Call __twalk_r.
>
> Ok.
>
>> diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
>> index cf7023a9aa..8379a488ed 100644
>> --- a/iconv/gconv_dl.c
>> +++ b/iconv/gconv_dl.c
>> @@ -149,15 +149,11 @@ __gconv_find_shlib (const char *name)
>> return found;
>> }
>>
>> -
>> -/* This is very ugly but the tsearch functions provide no way to pass
>> - information to the walker function. So we use a global variable.
>> - It is MT safe since we use a lock. */
>> -static struct __gconv_loaded_object *release_handle;
>> -
>> static void
>> -do_release_shlib (void *nodep, VISIT value, int level)
>> +do_release_shlib (const void *nodep, VISIT value, void *closure)
>> {
>> +
>> + struct __gconv_loaded_object *release_handle = closure;
>
> Extra empty line.
Thanks, pushed with that change.
Florian
@@ -149,15 +149,11 @@ __gconv_find_shlib (const char *name)
return found;
}
-
-/* This is very ugly but the tsearch functions provide no way to pass
- information to the walker function. So we use a global variable.
- It is MT safe since we use a lock. */
-static struct __gconv_loaded_object *release_handle;
-
static void
-do_release_shlib (void *nodep, VISIT value, int level)
+do_release_shlib (const void *nodep, VISIT value, void *closure)
{
+
+ struct __gconv_loaded_object *release_handle = closure;
struct __gconv_loaded_object *obj = *(struct __gconv_loaded_object **) nodep;
if (value != preorder && value != leaf)
@@ -184,13 +180,10 @@ do_release_shlib (void *nodep, VISIT value, int level)
void
__gconv_release_shlib (struct __gconv_loaded_object *handle)
{
- /* Urgh, this is ugly but we have no other possibility. */
- release_handle = handle;
-
/* Process all entries. Please note that we also visit entries
with release counts <= 0. This way we can finally unload them
if necessary. */
- __twalk (loaded, (__action_fn_t) do_release_shlib);
+ __twalk_r (loaded, do_release_shlib, handle);
}