From: Heikki Linnakangas Date: Fri, 27 May 2011 08:51:23 +0000 (+0300) Subject: Check the return code of pthread_create(). Otherwise we go into an infinite X-Git-Tag: REL9_1_BETA2~70 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=336db7e3474508b46a0e6bdb013a8bee5aac9adf;p=postgresql Check the return code of pthread_create(). Otherwise we go into an infinite 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.) --- diff --git a/src/test/thread/thread_test.c b/src/test/thread/thread_test.c index 0782e8c66b..6a81829912 100644 --- a/src/test/thread/thread_test.c +++ b/src/test/thread/thread_test.c @@ -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 */