tst-join7.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /* Verify that TLS access in separate thread in a dlopened library does not
  2. deadlock.
  3. Copyright (C) 2015-2019 Free Software Foundation, Inc.
  4. This file is part of the GNU C Library.
  5. The GNU C Library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public
  7. License as published by the Free Software Foundation; either
  8. version 2.1 of the License, or (at your option) any later version.
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public
  14. License along with the GNU C Library; if not, see
  15. <http://www.gnu.org/licenses/>. */
  16. #include <dlfcn.h>
  17. /* When one dynamically loads a module, which spawns a thread to perform some
  18. activities, it could be possible that TLS storage is accessed for the first
  19. time in that thread. This results in an allocation request within the
  20. thread, which could result in an attempt to take the rtld load_lock. This
  21. is a problem because it would then deadlock with the dlopen (which owns the
  22. lock), if the main thread is waiting for the spawned thread to exit. We can
  23. at least ensure that this problem does not occur due to accesses within
  24. libc.so, by marking TLS variables within libc.so as IE. The problem of an
  25. arbitrary variable being accessed and constructed within such a thread still
  26. exists but this test case does not verify that. */
  27. int
  28. do_test (void)
  29. {
  30. void *f = dlopen ("tst-join7mod.so", RTLD_NOW | RTLD_GLOBAL);
  31. if (f)
  32. dlclose (f);
  33. else
  34. return 1;
  35. return 0;
  36. }
  37. #define TEST_FUNCTION do_test ()
  38. #include "../test-skeleton.c"