OSDN Git Service

Check the return code of pthread_create(). Otherwise we go into an infinite
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 27 May 2011 08:51:23 +0000 (11:51 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 27 May 2011 09:55:02 +0000 (12:55 +0300)
loop if it fails, which is what what happened on my HP-UX box. (I think
the reason it failed on that box is a misconfiguration on my behalf, but
that's no reason to hang.)

src/test/thread/thread_test.c

index 0782e8c..6a81829 100644 (file)
@@ -150,6 +150,7 @@ main(int argc, char *argv[])
        pthread_t       thread1,
                                thread2;
        int                     fd;
+       int                     rc;
 
 #ifdef WIN32
        WSADATA         wsaData;
@@ -199,8 +200,23 @@ main(int argc, char *argv[])
        /* Hold lock until we are ready for the child threads to exit. */
        pthread_mutex_lock(&init_mutex);
 
-       pthread_create(&thread1, NULL, (void *(*) (void *)) func_call_1, NULL);
-       pthread_create(&thread2, NULL, (void *(*) (void *)) func_call_2, NULL);
+       rc = pthread_create(&thread1, NULL, (void *(*) (void *)) func_call_1, NULL);
+       if (rc != 0)
+       {
+               fprintf(stderr, "Failed to create thread 1: %s **\nexiting\n",
+                               strerror(rc));
+               exit(1);
+       }
+       rc = pthread_create(&thread2, NULL, (void *(*) (void *)) func_call_2, NULL);
+       if (rc != 0)
+       {
+               /*
+                * strerror() might not be thread-safe, and we already spawned thread
+                * 1 that uses it
+                */
+               fprintf(stderr, "Failed to create thread 2 **\nexiting\n");
+               exit(1);
+       }
 
        while (thread1_done == 0 || thread2_done == 0)
                sched_yield();                  /* if this is a portability problem, remove it */