names.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* This testcase is part of GDB, the GNU debugger.
  2. Copyright 2015-2022 Free Software Foundation, Inc.
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  13. #define _GNU_SOURCE
  14. #include <unistd.h>
  15. #include <stdlib.h>
  16. #include <pthread.h>
  17. #include <assert.h>
  18. #define NUM_THREADS 3
  19. struct thread_data
  20. {
  21. const char *name;
  22. pthread_barrier_t *barrier;
  23. };
  24. static void *
  25. thread_func (void *varg)
  26. {
  27. struct thread_data *arg = (struct thread_data *) varg;
  28. int res;
  29. res = pthread_setname_np (pthread_self (), arg->name);
  30. assert (res == 0);
  31. pthread_barrier_wait (arg->barrier);
  32. pthread_barrier_wait (arg->barrier);
  33. return NULL;
  34. }
  35. static void
  36. all_threads_ready (void)
  37. {
  38. }
  39. int
  40. main (int argc, char **argv)
  41. {
  42. pthread_t threads[NUM_THREADS];
  43. struct thread_data args[NUM_THREADS];
  44. pthread_barrier_t barrier;
  45. int i, res;
  46. const char *names[] = { "carrot", "potato", "celery" };
  47. alarm (20);
  48. /* Make sure that NAMES contains NUM_THREADS elements. */
  49. assert (sizeof (names) / sizeof (names[0]) == NUM_THREADS);
  50. res = pthread_barrier_init (&barrier, NULL, NUM_THREADS + 1);
  51. assert (res == 0);;
  52. res = pthread_setname_np (pthread_self (), "main");
  53. assert (res == 0);
  54. for (i = 0; i < NUM_THREADS; i++)
  55. {
  56. struct thread_data *arg = &args[i];
  57. arg->name = names[i];
  58. arg->barrier = &barrier;
  59. res = pthread_create (&threads[i], NULL, thread_func, arg);
  60. assert (res == 0);
  61. }
  62. pthread_barrier_wait (&barrier);
  63. all_threads_ready ();
  64. pthread_barrier_wait (&barrier);
  65. for (i = 0; i < NUM_THREADS; i++)
  66. {
  67. res = pthread_join (threads[i], NULL);
  68. assert (res == 0);
  69. }
  70. return 0;
  71. }