summaryrefslogtreecommitdiff
path: root/ChangeLog
diff options
context:
space:
mode:
authorArjun Shankar <arjun@redhat.com>2018-10-17 17:47:29 +0200
committerArjun Shankar <arjun@redhat.com>2018-10-17 17:47:29 +0200
commitc5288d378ad258d2e8e8cb174be3b9f233a312eb (patch)
treea987e28461c55a9d7011f046f382beaaa48cc93a /ChangeLog
parent729f34028a7f494b599a29889df825cf826b6de0 (diff)
downloadglibc-c5288d378ad258d2e8e8cb174be3b9f233a312eb.tar.gz
Remove unnecessary locking when reading iconv configuration [BZ #22062]
In iconv/gconv_conf.c, __gconv_get_path unnecessarily obtains a lock when populating the array pointed to by __gconv_path_elem. The locking is not necessary because all calls to __gconv_read_conf (which in turn calls __gconv_get_path) are serialized using __libc_once. This patch: - removes all locking in __gconv_get_path; - replaces all explicitly serialized __gconv_read_conf calls with calls to __gconv_load_conf, a new wrapper that is serialized internally; - adds a new test, iconv/tst-iconv_mt.c, to exercise iconv initialization, usage, and cleanup in a multi-threaded program; - indents __gconv_get_path correctly, removing tab characters (which makes the patch look a little bigger than it really is). After removing the unnecessary locking, it was confirmed that the test case fails if the relevant __libc_once is removed. Additionally, four localedata and iconvdata tests also fail. This gives confidence that the testsuite sufficiently guards against some regressions relating to multi-threading with iconv. Tested on x86_64 and i686.
Diffstat (limited to 'ChangeLog')
-rw-r--r--ChangeLog16
1 files changed, 16 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 0f3a846ad3..19466c18db 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2018-10-17 Arjun Shankar <arjun@redhat.com>
+
+ [BZ #22062]
+ * iconv/gconv_conf.c (__gconv_get_path): Remove locking and fix
+ indentation.
+ * (__gconv_read_conf): Mark function static.
+ * (once): New static variable.
+ * (__gconv_load_conf): New function.
+ * iconv/gconv_int.h (__gconv_load_conf): Likewise.
+ * iconv/gconv_db.c (once): Remove static variable.
+ * (__gconv_compare_alias): Use __gconv_load_conf instead of
+ __gconv_read_conf.
+ * (__gconv_find_transform): Likewise.
+ * iconv/tst-iconv-mt.c: New test.
+ * iconv/Makefile: Add tst-iconv_mt.
+
2018-10-17 Joseph Myers <joseph@codesourcery.com>
* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add