help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-smalltalk] GNU Smalltalk 2.95e always copy gst.im


From: Paolo Bonzini
Subject: Re: [Help-smalltalk] GNU Smalltalk 2.95e always copy gst.im
Date: Sun, 11 Nov 2007 11:28:20 +0100
User-agent: Thunderbird 2.0.0.6 (Macintosh/20070728)

I am not sure if it is the same bug, but the unexplainable behavior in your message disappeared if I changed the timestamp comparisons to also look at the nanosecond field. It might be just a race condition that is more frequent with the system libsigsegv (possibly because there is less time between the installation of kernel files and the image?? I don't know).

You can try this patch, which I tested on ppc-apple-darwin and i686-linux (Debian, both with/without system libsigsegv).

Paolo
2007-11-11  Paolo Bonzini  <address@hidden>

        * libgst/files.c: Use _gst_file_is_newer.
        * libgst/sysdep.c: Remove _gst__gst_get_file_modify_time, add
        _gst_file_is_newer.
        * libgst/sysdep.h: Likewise.


--- orig/configure.ac
+++ mod/configure.ac
@@ -195,6 +195,9 @@ AC_CHECK_HEADERS_ONCE(stdint.h inttypes.
        sys/timeb.h termios.h sys/mman.h sys/file.h execinfo.h utime.h \
        sys/wait.h fcntl.h, [], [], [AC_INCLUDES_DEFAULT])
 
+AC_CHECK_MEMBERS([struct stat.st_mtim.tv_nsec, struct stat.st_mtimensec,
+                 struct stat.st_mtimespec.tv_nsec])
+
 AC_TYPE_INT8_T
 AC_TYPE_INT16_T
 AC_TYPE_INT32_T


--- orig/libgst/files.c
+++ mod/libgst/files.c
@@ -528,29 +528,27 @@ _gst_initialize (const char *kernel_dir,
 mst_Boolean
 ok_to_load_binary (void)
 {
-  time_t imageFileTime;
   const char *fileName;
 
-  imageFileTime = _gst_get_file_modify_time (_gst_binary_image_name);
-
-  if (imageFileTime == 0)      /* not found */
+  if (!_gst_file_is_readable (_gst_binary_image_name))
     return (false);
 
   for (fileName = standard_files; *fileName; fileName += strlen (fileName) + 1)
     {
       char *fullFileName = _gst_find_file (fileName, GST_DIR_KERNEL);
-      mst_Boolean ok = (imageFileTime > _gst_get_file_modify_time 
(fullFileName));
+      mst_Boolean ok = _gst_file_is_newer (_gst_binary_image_name,
+                                          fullFileName);
       xfree (fullFileName);
       if (!ok)
         return (false);
     }
 
   if (site_pre_image_file
-      && imageFileTime <= _gst_get_file_modify_time (site_pre_image_file))
+      && !_gst_file_is_newer (_gst_binary_image_name, site_pre_image_file))
     return (false);
 
   if (user_pre_image_file
-      && imageFileTime <= _gst_get_file_modify_time (user_pre_image_file))
+      && !_gst_file_is_newer (_gst_binary_image_name, user_pre_image_file))
     return (false);
 
   return (true);
@@ -602,11 +600,7 @@ _gst_find_file (const char *fileName,
                dir == GST_DIR_BASE ? "" : LOCAL_KERNEL_DIR_NAME "/",
                fileName);
 
-      if (_gst_file_is_readable (localFileName)
-          /* If the system file is newer, use the system file instead.  */
-          && (!_gst_file_is_readable (fullFileName) ||
-             _gst_get_file_modify_time (localFileName) >=
-             _gst_get_file_modify_time (fullFileName)))
+      if (_gst_file_is_newer (localFileName, fullFileName))
        {
          xfree (fullFileName);
          return localFileName;


--- orig/libgst/sysdep.c
+++ mod/libgst/sysdep.c
@@ -943,16 +943,44 @@ error:
 
 
 
-time_t
-_gst_get_file_modify_time (const char *fileName)
+mst_Boolean
+_gst_file_is_newer (const char *file1, const char *file2)
 {
-  struct stat st;
+  static char *prev_file1;
+  static struct stat st1;
+  struct stat st2;
 
-  if (stat (fileName, &st) < 0)
-    return (0);
+  if (!prev_file1 || strcmp (file1, prev_file1))
+    {
+      if (prev_file1)
+       xfree (prev_file1);
+      prev_file1 = xstrdup (file1);
 
-  else
-    return (_gst_adjust_time_zone (st.st_mtime));
+      if (!_gst_file_is_readable (file1))
+        return false;
+      if (stat (file1, &st1) < 0)
+       return false;
+    }
+
+  if (!_gst_file_is_readable (file2))
+    return true;
+  if (stat (file2, &st2) < 0)
+    return true;
+
+  if (st1.st_mtime != st2.st_mtime)
+    return st1.st_mtime > st2.st_mtime;
+
+  /* 15 years have passed and nothing seems to have changed.  */
+#if defined HAVE_STRUCT_STAT_ST_MTIMENSEC
+  return st1.st_mtimensec >= st2.st_mtimensec;
+#elif defined HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
+  return st1.st_mtim.tv_nsec >= st2.st_mtim.tv_nsec;
+#elif defined HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC
+  return st1.st_mtimespec.tv_nsec >= st2.st_mtimespec.tv_nsec;
+#else
+  /* Say that the image file is newer.  */
+  return true;
+#endif
 }
 
 


--- orig/libgst/sysdep.h
+++ mod/libgst/sysdep.h
@@ -130,12 +130,10 @@ extern unsigned _gst_get_milli_time (voi
 extern time_t _gst_get_time (void)
   ATTRIBUTE_HIDDEN;
 
-/* Returns the time the file FILENAME was last modified.  On UNIX
-   machines, this is the number of seconds since midnight Jan 1 1970
-   GMT.  On other platforms/environments, it's probably not important
-   exactly what it returns as long as it's unites consistent with
-   other accesses that client code may do to the file system.  */
-extern time_t _gst_get_file_modify_time (const char *fileName)
+/* Returns whether FILE1 is newer (or last modified at the same time as)
+   FILE2.  Returns true if FILE2 is not readable, false if FILE1 is not
+   readable.  */
+extern mst_Boolean _gst_file_is_newer (const char *file1, const char *file2)
   ATTRIBUTE_HIDDEN;
 
 /* Sets the time when FILENAME was last modified.  The times are in




reply via email to

[Prev in Thread] Current Thread [Next in Thread]