Improve thread test program to show if non-*_r functions are even called.
authorBruce Momjian
Wed, 21 Apr 2004 20:51:54 +0000 (20:51 +0000)
committerBruce Momjian
Wed, 21 Apr 2004 20:51:54 +0000 (20:51 +0000)
src/tools/thread/thread_test.c

index 57cabd98c318ff4e7c96fd70f43768bb4b7bd9f0..b7aa9b7cfd2132e5924d372d0a3801c957cfcd22 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/tools/thread/thread_test.c,v 1.16 2004/04/06 13:55:17 momjian Exp $
+ * $PostgreSQL: pgsql/src/tools/thread/thread_test.c,v 1.17 2004/04/21 20:51:54 momjian Exp $
  *
  * This program tests to see if your standard libc functions use
  * pthread_setspecific()/pthread_getspecific() to be thread-safe.
@@ -32,6 +32,8 @@
 #include 
 #include 
 
+#include "postgres.h"
+
 void func_call_1(void);
 void func_call_2(void);
 
@@ -52,6 +54,11 @@ struct passwd *passwd_p2;
 struct hostent *hostent_p1;
 struct hostent *hostent_p2;
 
+bool gethostbyname_threadsafe;
+bool getpwuid_threadsafe;
+bool strerror_threadsafe;
+bool platform_is_threadsafe = true;
+
 pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 int main(int argc, char *argv[])
@@ -90,26 +97,93 @@ defines to your template/$port file before compiling this program.\n\n"
    printf("Add this to your template/$port file:\n\n");
 
    if (strerror_p1 != strerror_p2)
+   {
        printf("STRERROR_THREADSAFE=yes\n");
+       strerror_threadsafe = true;
+   }
    else
+   {
        printf("STRERROR_THREADSAFE=no\n");
+       strerror_threadsafe = false;
+   }
 
    if (passwd_p1 != passwd_p2)
+   {
        printf("GETPWUID_THREADSAFE=yes\n");
+       getpwuid_threadsafe = true;
+   }
    else
+   {
        printf("GETPWUID_THREADSAFE=no\n");
+       getpwuid_threadsafe = false;
+   }
 
    if (hostent_p1 != hostent_p2)
+   {
        printf("GETHOSTBYNAME_THREADSAFE=yes\n");
+       gethostbyname_threadsafe = true;
+   }
    else
+   {
        printf("GETHOSTBYNAME_THREADSAFE=no\n");
+       gethostbyname_threadsafe = false;
+   }
 
    pthread_mutex_unlock(&init_mutex);  /* let children exit  */
    
    pthread_join(thread1, NULL);    /* clean up children */
    pthread_join(thread2, NULL);
 
-   return 0;
+   printf("\n");
+
+#ifdef HAVE_STRERROR_R
+   printf("Your system has sterror_r(), so it doesn't use strerror().\n");
+#else
+   printf("Your system uses strerror().\n");
+   if (!strerror_threadsafe)
+   {
+       platform_is_threadsafe = false;
+       printf("That function is not thread-safe\n");
+   }
+#endif
+
+#ifdef HAVE_GETPWUID_R
+   printf("Your system has getpwuid_r(), so it doesn't use getpwuid().\n");
+#else
+   printf("Your system uses getpwuid().\n");
+   if (!getpwuid_threadsafe)
+   {
+       platform_is_threadsafe = false;
+       printf("That function is not thread-safe\n");
+   }
+#endif
+
+#ifdef HAVE_GETADDRINFO
+   printf("Your system has getaddrinfo(), so it doesn't use gethostbyname()\n"
+           "or gethostbyname_r().\n");
+#else
+#ifdef HAVE_GETHOSTBYNAME_R
+   printf("Your system has gethostbyname_r(), so it doesn't use gethostbyname().\n");
+#else
+   printf("Your system uses gethostbyname().\n");
+   if (!gethostbyname_threadsafe)
+   {
+       platform_is_threadsafe = false;
+       printf("That function is not thread-safe\n");
+   }
+#endif
+#endif
+
+   if (!platform_is_threadsafe)
+   {
+       printf("\n** YOUR PLATFORM IS NOT THREADSAFE **\n");
+       return 1;
+   }
+   else
+   {
+       printf("\nYOUR PLATFORM IS THREADSAFE\n");
+       return 0;
+   }
 }
 
 void func_call_1(void) {