Here we must replace getpwuid by getpwuid_r, but as I do not know how for
authorSebastian Wilhelmi <wilhelmi@ira.uka.de>
Thu, 7 Jan 1999 16:17:42 +0000 (16:17 +0000)
committerSebastian Wilhelmi <wilhelmi@src.gnome.org>
Thu, 7 Jan 1999 16:17:42 +0000 (16:17 +0000)
1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>

* gutils.c (g_get_any_init): Here we must replace getpwuid by
getpwuid_r, but as I do not know how for now, I just made a FIXME
note ;-)

* gdate.c (g_date_set_time): localtime --> localtime_r to make it
thread safe.

* configure.in: We do not need to check for broken solaris mutex
intitializer any longer. Provide a macro to show the used thread
implementation. Not nice, but this is needed until thread support
is completed here inside glib.

* gthread/testgthread.c: conditionally compile according to the
G_THREADS_IMPL_??? macros.
(test_private_func): use rand_r instead of rand to make it
thread safe.

15 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
configure.in
gdate.c
glib/gdate.c
glib/gutils.c
gthread/ChangeLog
gthread/testgthread.c
gutils.c

index fdd1e9a..5390090 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Here we must replace getpwuid by
+       getpwuid_r, but as I do not know how for now, I just made a FIXME
+       note ;-)
+
+       * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+       thread safe.
+
+       * configure.in: We do not need to check for broken solaris mutex
+       intitializer any longer. Provide a macro to show the used thread
+       implementation. Not nice, but this is needed until thread support
+       is completed here inside glib.
+
 Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
 
        * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
index fdd1e9a..5390090 100644 (file)
@@ -1,3 +1,17 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Here we must replace getpwuid by
+       getpwuid_r, but as I do not know how for now, I just made a FIXME
+       note ;-)
+
+       * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+       thread safe.
+
+       * configure.in: We do not need to check for broken solaris mutex
+       intitializer any longer. Provide a macro to show the used thread
+       implementation. Not nice, but this is needed until thread support
+       is completed here inside glib.
+
 Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
 
        * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
index fdd1e9a..5390090 100644 (file)
@@ -1,3 +1,17 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Here we must replace getpwuid by
+       getpwuid_r, but as I do not know how for now, I just made a FIXME
+       note ;-)
+
+       * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+       thread safe.
+
+       * configure.in: We do not need to check for broken solaris mutex
+       intitializer any longer. Provide a macro to show the used thread
+       implementation. Not nice, but this is needed until thread support
+       is completed here inside glib.
+
 Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
 
        * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
index fdd1e9a..5390090 100644 (file)
@@ -1,3 +1,17 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Here we must replace getpwuid by
+       getpwuid_r, but as I do not know how for now, I just made a FIXME
+       note ;-)
+
+       * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+       thread safe.
+
+       * configure.in: We do not need to check for broken solaris mutex
+       intitializer any longer. Provide a macro to show the used thread
+       implementation. Not nice, but this is needed until thread support
+       is completed here inside glib.
+
 Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
 
        * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
index fdd1e9a..5390090 100644 (file)
@@ -1,3 +1,17 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Here we must replace getpwuid by
+       getpwuid_r, but as I do not know how for now, I just made a FIXME
+       note ;-)
+
+       * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+       thread safe.
+
+       * configure.in: We do not need to check for broken solaris mutex
+       intitializer any longer. Provide a macro to show the used thread
+       implementation. Not nice, but this is needed until thread support
+       is completed here inside glib.
+
 Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
 
        * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
index fdd1e9a..5390090 100644 (file)
@@ -1,3 +1,17 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Here we must replace getpwuid by
+       getpwuid_r, but as I do not know how for now, I just made a FIXME
+       note ;-)
+
+       * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+       thread safe.
+
+       * configure.in: We do not need to check for broken solaris mutex
+       intitializer any longer. Provide a macro to show the used thread
+       implementation. Not nice, but this is needed until thread support
+       is completed here inside glib.
+
 Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
 
        * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
index fdd1e9a..5390090 100644 (file)
@@ -1,3 +1,17 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Here we must replace getpwuid by
+       getpwuid_r, but as I do not know how for now, I just made a FIXME
+       note ;-)
+
+       * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+       thread safe.
+
+       * configure.in: We do not need to check for broken solaris mutex
+       intitializer any longer. Provide a macro to show the used thread
+       implementation. Not nice, but this is needed until thread support
+       is completed here inside glib.
+
 Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
 
        * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
index fdd1e9a..5390090 100644 (file)
@@ -1,3 +1,17 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * gutils.c (g_get_any_init): Here we must replace getpwuid by
+       getpwuid_r, but as I do not know how for now, I just made a FIXME
+       note ;-)
+
+       * gdate.c (g_date_set_time): localtime --> localtime_r to make it
+       thread safe.
+
+       * configure.in: We do not need to check for broken solaris mutex
+       intitializer any longer. Provide a macro to show the used thread
+       implementation. Not nice, but this is needed until thread support
+       is completed here inside glib.
+
 Tue Jan  5 12:23:52 PST 1999 Manish Singh <yosh@gimp.org>
 
        * configure.in: ditch whitespace before GLIB_SYSDEFS #includes,
index 901bb5c..b6b0ba1 100644 (file)
@@ -628,35 +628,27 @@ case $have_threads in
                 mutex_default_type='pthread_mutex_t'
                 mutex_default_init='PTHREAD_MUTEX_INITIALIZER'
                 mutex_header_file='pthread.h'
+               g_threads_impl="POSIX"
                 ;;
         solaris)
                G_THREAD_LIBS=error
                 AC_CHECK_LIB(thread, cond_init, G_THREAD_LIBS="-lthread")
-               # solaris has a broken initializer for mutexes, if we find it,
-               # we will replace it.
-               AC_MSG_CHECKING(for broken solaris mutex initialization)
-               AC_EGREP_CPP([ *begin *{ *0 *, *0 *, *0 *, *0 *, *0 *, *0 *, *0 *, *0 *, *0 *, *0 *, *0 *, *0 *, *0 *, *0 *} *end *],
-                            [#include <thread.h>
-                            begin DEFAULTMUTEX end],
-                            [solaris_mutex_init_broken=yes],
-                            [solaris_mutex_init_broken=no])
-               AC_MSG_RESULT($solaris_mutex_init_broken)
                 mutex_has_default=yes
                 mutex_default_type='mutex_t'
-                if test x$solaris_mutex_init_broken = xyes; then
-                  mutex_default_init="{ { { 0, 0, 0, 0 }, USYNC_THREAD }, { { { 0, 0, 0, 0, 0, 0, 0, 0 } } }, 0}"
-                else
-                  mutex_default_init="DEFAULTMUTEX"
-                fi
+               mutex_default_init="DEFAULTMUTEX"
                 mutex_header_file='thread.h'
+               g_threads_impl="SOLARIS"
                 ;;
        nspr)
                AC_CHECK_LIB(nspr21, PRP_NewNakedCondVar,
                             G_THREAD_LIBS="-lnspr21")
+               g_threads_impl="NSPR"
                ;;
         none)
+               g_threads_impl="NONE"
                 ;;
         *)
+               g_threads_impl="NONE"
                G_THREAD_LIBS=error
                 ;;
 esac
@@ -718,7 +710,6 @@ AC_SUBST(G_THREAD_LIBS)
 
 CFLAGS="$CFLAGS $G_THREAD_CFLAGS"
 
-
 dnl **********************************************
 dnl *** GDefaultMutex setup and initialization ***
 dnl **********************************************
@@ -890,6 +881,7 @@ _______EOF
        if test x$g_mutex_has_default = xyes; then
                cat >>$outfile <<_______EOF
 $g_enable_threads_def G_THREADS_ENABLED
+#define G_THREADS_IMPL_$g_threads_impl_def
 typedef struct _GStaticMutex GStaticMutex;
 struct _GStaticMutex
 {
@@ -909,6 +901,7 @@ _______EOF
        else
                cat >>$outfile <<_______EOF
 $g_enable_threads_def G_THREADS_ENABLED
+#define $g_threads_impl_def
 typedef struct _GMutex* GStaticMutex;
 #define G_STATIC_MUTEX_INIT NULL
 #define g_static_mutex_get_mutex(mutex) (g_static_mutex_get_mutex_impl (&(mutex)))
@@ -1182,6 +1175,8 @@ xyes)     g_enable_threads_def="#define";;
 *)     g_enable_threads_def="#undef ";;
 esac
 
+g_threads_impl_def=$g_threads_impl
+
 g_mutex_has_default="$mutex_has_default"
 g_mutex_sizeof="$glib_cv_sizeof_gmutex"
 g_mutex_contents="$glib_cv_byte_contents_gmutex"
diff --git a/gdate.c b/gdate.c
index 471aaad..08b3b0b 100644 (file)
--- a/gdate.c
+++ b/gdate.c
@@ -790,28 +790,21 @@ g_date_set_time (GDate *d,
                 GTime  time)
 {
   time_t t = time;
-  struct tm *tm;
+  struct tm tm;
   
   g_return_if_fail (d != NULL);
   
-  tm = localtime (&t);
+  localtime_r (&t, &tm);
   
-  if (tm) 
-    {
-      d->julian = FALSE;
-      
-      d->month = tm->tm_mon + 1;
-      d->day   = tm->tm_mday;
-      d->year  = tm->tm_year + 1900;
-      
-      g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year));
-      
-      d->dmy    = TRUE;
-    }
-  else 
-    {
-      g_date_clear (d, 1);
-    }
+  d->julian = FALSE;
+  
+  d->month = tm.tm_mon + 1;
+  d->day   = tm.tm_mday;
+  d->year  = tm.tm_year + 1900;
+  
+  g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year));
+  
+  d->dmy    = TRUE;
 }
 
 void         
index 471aaad..08b3b0b 100644 (file)
@@ -790,28 +790,21 @@ g_date_set_time (GDate *d,
                 GTime  time)
 {
   time_t t = time;
-  struct tm *tm;
+  struct tm tm;
   
   g_return_if_fail (d != NULL);
   
-  tm = localtime (&t);
+  localtime_r (&t, &tm);
   
-  if (tm) 
-    {
-      d->julian = FALSE;
-      
-      d->month = tm->tm_mon + 1;
-      d->day   = tm->tm_mday;
-      d->year  = tm->tm_year + 1900;
-      
-      g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year));
-      
-      d->dmy    = TRUE;
-    }
-  else 
-    {
-      g_date_clear (d, 1);
-    }
+  d->julian = FALSE;
+  
+  d->month = tm.tm_mon + 1;
+  d->day   = tm.tm_mday;
+  d->year  = tm.tm_year + 1900;
+  
+  g_return_if_fail (g_date_valid_dmy (d->day, d->month, d->year));
+  
+  d->dmy    = TRUE;
 }
 
 void         
index c6958f1..e235d29 100644 (file)
@@ -416,6 +416,19 @@ g_get_any_init (void)
       g_home_dir = g_strdup (g_getenv ("HOME"));
       
 #ifdef HAVE_PWD_H
+      /* FIXME: we must actually use the getpwuid_r function here, as
+        getpwuid is not MT-safe, but the prototype doesn't seem to be
+        agreed upon on the different systems, i.e. it is
+
+        struct passwd *getpwuid_r(uid_t uid, struct passwd * pwd, 
+                                  char *buffer, int buflen); 
+
+         on solaris, but 
+        
+        int getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, 
+                       size_t bufsize  struct passwd **result); 
+         on posix. weird. */
       setpwent ();
       pw = getpwuid (getuid ());
       endpwent ();
index 0a20f08..939ae56 100644 (file)
@@ -1,3 +1,10 @@
+1999-01-07  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
+
+       * testgthread.c: conditionally compile according to the
+       G_THREADS_IMPL_??? macros.
+       (test_private_func): use rand_r instead of rand to make it
+       thread safe.
+
 1998-12-18  Sebastian Wilhelmi  <wilhelmi@ira.uka.de>
 
        * testgthread.c (new_thread): As a joinable thread seems to be the
index c2149d4..8fabc5a 100644 (file)
@@ -40,12 +40,11 @@ test_mutexes (void)
     }
 }
 
-#if defined(NSPR)              /* we are using nspr threads */
-/* this option must be specified by hand during compile of
-   testgthread. also note, that you have to link with whatever library
-   nspr is building upon, it might otherwise (as on solaris) lead to
-   run time failure, as the mutex functions are defined in libc, but
-   as noops, that will make some nspr assertions fail. */
+#if defined(G_THREADS_IMPL_NSPR)       
+#warning "note, that you have to link with whatever library"
+#warning "nspr is building upon, it might otherwise (as on solaris) lead to"
+#warning "run time failure, as the mutex functions are defined in libc, but"
+#warning "as noops, that will make some nspr assertions fail."
 #include <prthread.h>
 
 gpointer
@@ -59,7 +58,8 @@ new_thread (GHookFunc func, gpointer data)
 #define join_thread(thread) PR_JoinThread (thread)
 #define self_thread() PR_GetCurrentThread ()
 
-#elif defined(DEFAULTMUTEX)    /* we are using solaris threads */
+#elif defined(G_THREADS_IMPL_SOLARIS)  
+#include <thread.h>
 
 gpointer
 new_thread (GHookFunc func, gpointer data)
@@ -72,7 +72,9 @@ new_thread (GHookFunc func, gpointer data)
   thr_join ((thread_t)GPOINTER_TO_UINT (thread), NULL, NULL)
 #define self_thread()  GUINT_TO_POINTER (thr_self ())
 
-#elif defined(PTHREAD_MUTEX_INITIALIZER) /* we are using posix threads */
+#elif defined(G_THREADS_IMPL_POSIX)
+#include <pthread.h>
+
 gpointer
 new_thread(GHookFunc func, gpointer data)
 {
@@ -151,10 +153,17 @@ void
 test_private_func (void *data)
 {
   guint i = 0;
+  static unsigned int seed = 0;
+  if (!seed)
+    {
+      GTimeVal now;
+      g_get_current_time (&now);
+      seed = now.tv_usec;
+    }
   wait_thread (1);
   while (i < TEST_PRIVATE_ROUNDS)
     {
-      guint random_value = rand () % 10000;
+      guint random_value = rand_r (&seed) % 10000;
       guint *data = g_static_private_get (&private_key);
       if (!data)
        {
index c6958f1..e235d29 100644 (file)
--- a/gutils.c
+++ b/gutils.c
@@ -416,6 +416,19 @@ g_get_any_init (void)
       g_home_dir = g_strdup (g_getenv ("HOME"));
       
 #ifdef HAVE_PWD_H
+      /* FIXME: we must actually use the getpwuid_r function here, as
+        getpwuid is not MT-safe, but the prototype doesn't seem to be
+        agreed upon on the different systems, i.e. it is
+
+        struct passwd *getpwuid_r(uid_t uid, struct passwd * pwd, 
+                                  char *buffer, int buflen); 
+
+         on solaris, but 
+        
+        int getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, 
+                       size_t bufsize  struct passwd **result); 
+         on posix. weird. */
       setpwent ();
       pw = getpwuid (getuid ());
       endpwent ();