Home | History | Annotate | Download | only in tests
      1 /*
      2  * Reproducer for bug #323905. See also
      3  * http://bugs.kde.org/show_bug.cgi?id=323905.
      4  */
      5 
      6 #include <climits>    /* PTHREAD_STACK_MIN */
      7 #include <cstdio>     /* fprintf() */
      8 #include <fcntl.h>    /* O_RDONLY */
      9 #include <pthread.h>
     10 #include <unistd.h>   /* close() */
     11 
     12 /* Happens with two threads also */
     13 #define THREAD_COUNT 256
     14 
     15 void* thread(void*)
     16 {
     17   int fd;
     18 
     19   /* Happens with any file, not just /dev/null */
     20   fd = open("/dev/null", O_RDONLY);
     21   if (fd >= 0)
     22     close(fd);
     23   else
     24     fprintf(stderr, "Failed to open /dev/null\n");
     25   return 0;
     26 }
     27 
     28 int main()
     29 {
     30   int i, r;
     31   pthread_attr_t attr;
     32   pthread_t threads[THREAD_COUNT];
     33 
     34   pthread_attr_init(&attr);
     35   pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
     36   for (i = 0; i < THREAD_COUNT; ++i) {
     37     r = pthread_create(&threads[i], &attr, thread, 0);
     38     if (r != 0) {
     39       fprintf(stderr, "Failed to create thread %d\n", i);
     40       return 1;
     41     }
     42   }
     43   pthread_attr_destroy(&attr);
     44   for (i = 0; i < THREAD_COUNT; ++i) {
     45     r = pthread_join(threads[i], 0);
     46     if (r != 0) {
     47       fprintf(stderr, "Failed to join thread %d\n", i);
     48       return 1;
     49     }
     50   }
     51   fprintf(stderr, "Done.\n");
     52   return 0;
     53 }
     54