OSDN Git Service

* Makefile.in (DLL_OFILES): Remove delqueue.o.
authorcorinna <corinna>
Mon, 13 Aug 2007 17:16:03 +0000 (17:16 +0000)
committercorinna <corinna>
Mon, 13 Aug 2007 17:16:03 +0000 (17:16 +0000)
* delqueue.cc: Delete.
* fhandler.h (fhandler_base::close_fs): Drop declaration.
(fhandler_disk_file::close): Drop declaration.
* fhandler_disk_file.cc (fhandler_base::fstat_fs): Call close instead of
close_fs.
(fhandler_base::fstat_helper): Use open FH_UNIX handle in call to
get_file_attribute.
(fhandler_base::open_fs): Call close instead of get_file_attribute.
(fhandler_disk_file::close): Remove.
(fhandler_base::close_fs): Remove.
* fhandler_socket.cc (fhandler_socket::close): Just call
fhandler_base::close for FH_UNIX sockets.
* shared.cc (user_shared_initialize): Drop call to
user_shared->delqueue.init.
* shared_info.h (CURR_USER_MAGIC): Change according to below change.
(MAX_DELQUEUES_PENDING): Remove.
(class delqueue_list): Remove.
(class user_info): Remove delqueue.
* syscalls.cc (close_all_files): Drop call to
user_shared->delqueue.process_queue.
(unlink): Drop delqueue handling.

winsup/cygwin/ChangeLog
winsup/cygwin/Makefile.in
winsup/cygwin/delqueue.cc [deleted file]
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_disk_file.cc
winsup/cygwin/fhandler_socket.cc
winsup/cygwin/shared.cc
winsup/cygwin/shared_info.h
winsup/cygwin/syscalls.cc

index ac9b4e0..dfba0f7 100644 (file)
@@ -1,5 +1,30 @@
 2007-08-13  Corinna Vinschen  <corinna@vinschen.de>
 
+       * Makefile.in (DLL_OFILES): Remove delqueue.o.
+       * delqueue.cc: Delete.
+       * fhandler.h (fhandler_base::close_fs): Drop declaration.
+       (fhandler_disk_file::close): Drop declaration.
+       * fhandler_disk_file.cc (fhandler_base::fstat_fs): Call close instead of
+       close_fs.
+       (fhandler_base::fstat_helper): Use open FH_UNIX handle in call to
+       get_file_attribute.
+       (fhandler_base::open_fs): Call close instead of get_file_attribute.
+       (fhandler_disk_file::close): Remove.
+       (fhandler_base::close_fs): Remove.
+       * fhandler_socket.cc (fhandler_socket::close): Just call
+       fhandler_base::close for FH_UNIX sockets.
+       * shared.cc (user_shared_initialize): Drop call to
+       user_shared->delqueue.init.
+       * shared_info.h (CURR_USER_MAGIC): Change according to below change.
+       (MAX_DELQUEUES_PENDING): Remove.
+       (class delqueue_list): Remove.
+       (class user_info): Remove delqueue.
+       * syscalls.cc (close_all_files): Drop call to
+       user_shared->delqueue.process_queue.
+       (unlink): Drop delqueue handling.
+
+2007-08-13  Corinna Vinschen  <corinna@vinschen.de>
+
        * devices.in (dev_storage): Use native NT device name for kmsg mailslot.
        * devices.cc: Regenerate.
        * fhandler.cc (fhandler_base::operator =): Use path_conv assignment
index 7d0d78d..82215a5 100644 (file)
@@ -125,7 +125,7 @@ MT_SAFE_OBJECTS:=
 # Please maintain this list in sorted order, with maximum files per 86 col line
 #
 DLL_OFILES:=assert.o autoload.o bsdlib.o ctype.o cxx.o cygheap.o cygthread.o \
-       cygtls.o dcrt0.o debug.o delqueue.o devices.o dir.o dlfcn.o dll_init.o \
+       cygtls.o dcrt0.o debug.o devices.o dir.o dlfcn.o dll_init.o \
        dtable.o environ.o errno.o exceptions.o exec.o external.o fcntl.o \
        fhandler.o fhandler_clipboard.o fhandler_console.o fhandler_disk_file.o \
        fhandler_dsp.o fhandler_fifo.o fhandler_floppy.o fhandler_mailslot.o \
diff --git a/winsup/cygwin/delqueue.cc b/winsup/cygwin/delqueue.cc
deleted file mode 100644 (file)
index 2cc14d5..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/* delqueue.cc
-
-   Copyright 1996, 1998, 1999, 2000, 2001, 2007 Red Hat, Inc.
-
-This file is part of Cygwin.
-
-This software is a copyrighted work licensed under the terms of the
-Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
-details. */
-
-#include "winsup.h"
-#include "shared_info.h"
-
-/* FIXME: this delqueue module is very flawed and should be rewritten.
-       First, having an array of a fixed size for keeping track of the
-       unlinked but not yet deleted files is bad.  Second, some programs
-       will unlink files and then create a new one in the same location
-       and this behavior is not supported in the current code.  Probably
-       we should find a move/rename function that will work on open files,
-       and move delqueue files to some special location or some such
-       hack... */
-
-void
-delqueue_list::init ()
-{
-  empty = 1;
-  memset (inuse, 0, MAX_DELQUEUES_PENDING);
-}
-
-void
-delqueue_list::queue_file (const char *dosname)
-{
-  char temp[CYG_MAX_PATH], *end;
-  GetFullPathName (dosname, sizeof (temp), temp, &end);
-
-  /* Note about race conditions: The only time we get to this point is
-     when a delete fails because someone's holding the descriptor open.
-     In those cases, other programs will be unable to delete the file
-     also, so any entries referring to that file will not be removed
-     from the queue while we're here. */
-
-  if (!empty)
-  {
-    /* check for duplicates */
-    for (int i=0; i < MAX_DELQUEUES_PENDING; i++)
-      if (inuse[i] && strcmp (name[i], temp) == 0)
-       return;
-  }
-
-  for (int i = 0; i < MAX_DELQUEUES_PENDING; i++)
-    if (!inuse[i])
-      {
-       /* set the name first, in case someone else is running the
-          queue they'll get a valid name */
-       strcpy (name[i], temp);
-       inuse[i] = 1;
-       empty = 0;
-       debug_printf ("adding '%s' to queue %d", temp, i);
-       return;
-      }
-
-  system_printf ("Out of queue slots");
-}
-
-void
-delqueue_list::process_queue ()
-{
-  if (empty)
-    return;
-  /* We set empty to 1 here, rather than later, to avoid a race
-     condition - some other program might queue up a file while we're
-     processing, and it will zero out empty also. */
-  empty = 1; /* but might get set to zero again, below */
-
-  syscall_printf ("Running delqueue");
-
-  for (int i = 0; i < MAX_DELQUEUES_PENDING; i++)
-    if (inuse[i])
-      {
-       if (DeleteFileA (name[i]))
-         {
-           syscall_printf ("Deleted %s", name[i]);
-           inuse[i] = 0;
-         }
-       else
-         {
-           int res = GetLastError ();
-           empty = 0;
-           if (res == ERROR_SHARING_VIOLATION)
-             {
-               /* File still inuse, that's ok */
-               syscall_printf ("Still using %s", name[i]);
-             }
-           else
-             {
-               syscall_printf ("Hmm, don't know what to do with '%s', %E", name[i]);
-               inuse[i] = 0;
-             }
-         }
-      }
-}
index 9a91191..b634ffd 100644 (file)
@@ -264,7 +264,6 @@ class fhandler_base
   virtual int open (int, mode_t = 0);
   int open_fs (int, mode_t = 0);
   virtual int close ();
-  int close_fs ();
   virtual int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2)));
   int __stdcall fstat_fs (struct __stat64 *buf) __attribute__ ((regparm (2)));
   int __stdcall fstat_helper (struct __stat64 *buf,
@@ -677,7 +676,6 @@ class fhandler_disk_file: public fhandler_base
   fhandler_disk_file (path_conv &pc);
 
   int open (int flags, mode_t mode);
-  int close ();
   int lock (int, struct __flock64 *);
   bool isdevice () { return false; }
   int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2)));
index c929cdd..1252419 100644 (file)
@@ -432,12 +432,12 @@ fhandler_base::fstat_fs (struct __stat64 *buf)
     {
       /* We now have a valid handle, regardless of the "nohandle" state.
         Since fhandler_base::open only calls CloseHandle if !nohandle,
-        we have to set it to false before calling close_fs and restore
+        we have to set it to false before calling close and restore
         the state afterwards. */
       res = fstat_by_handle (buf);
       bool no_handle = nohandle ();
       nohandle (false);
-      close_fs ();
+      close ();
       nohandle (no_handle);
       set_io_handle (NULL);
     }
@@ -528,7 +528,8 @@ fhandler_base::fstat_helper (struct __stat64 *buf,
   else if (pc.issocket ())
     buf->st_mode = S_IFSOCK;
 
-  if (!get_file_attribute (is_fs_special () ? NULL: get_handle (), pc,
+  if (!get_file_attribute (is_fs_special () && !pc.issocket ()
+                          ? NULL : get_handle (), pc,
                           &buf->st_mode, &buf->st_uid, &buf->st_gid))
     {
       /* If read-only attribute is set, modify ntsec return value */
@@ -1256,7 +1257,7 @@ fhandler_base::open_fs (int flags, mode_t mode)
   if (pc.has_buggy_open () && !pc.exists ())
     {
       debug_printf ("Buggy open detected.");
-      close_fs ();
+      close ();
       set_errno (ENOENT);
       return 0;
     }
@@ -1269,21 +1270,6 @@ out:
   return res;
 }
 
-int
-fhandler_disk_file::close ()
-{
-  return close_fs ();
-}
-
-int
-fhandler_base::close_fs ()
-{
-  int res = fhandler_base::close ();
-  if (!res)
-    user_shared->delqueue.process_queue ();
-  return res;
-}
-
 ssize_t __stdcall
 fhandler_disk_file::pread (void *buf, size_t count, _off64_t offset)
 {
index 03eadd3..1827690 100644 (file)
@@ -1391,6 +1391,9 @@ fhandler_socket::close ()
 {
   int res = 0;
 
+  if (get_device () == FH_UNIX)
+    return fhandler_base::close ();
+
   /* HACK to allow a graceful shutdown even if shutdown() hasn't been
      called by the application. Note that this isn't the ultimate
      solution but it helps in many cases. */
index fd9b87e..f6ec4df 100644 (file)
@@ -198,7 +198,6 @@ user_shared_initialize (bool reinit)
     {
       debug_printf ("initializing user shared");
       user_shared->mountinfo.init ();  /* Initialize the mount table.  */
-      user_shared->delqueue.init (); /* Initialize the queue of deleted files.  */
       user_shared->cb =  sizeof (*user_shared);
     }
   else
index 54b506e..fc5bc86 100644 (file)
@@ -44,7 +44,7 @@ class mount_item
 
 #define USER_VERSION   1       // increment when mount table changes and
 #define USER_VERSION_MAGIC CYGWIN_VERSION_MAGIC (USER_MAGIC, USER_VERSION)
-#define CURR_USER_MAGIC 0x38edd704U
+#define CURR_USER_MAGIC 0xb2232e71U
 
 class reg_key;
 struct device;
@@ -106,35 +106,11 @@ class mount_info
   void read_cygdrive_info_from_registry ();
 };
 
-/******** Close-on-delete queue ********/
-
-/* First pass at a file deletion queue structure.
-
-   We can't keep this list in the per-process info, since
-   one process may open a file, and outlive a process which
-   wanted to unlink the file - and the data would go away.
-*/
-
-#define MAX_DELQUEUES_PENDING 100
-
-class delqueue_list
-{
-  char name[MAX_DELQUEUES_PENDING][CYG_MAX_PATH];
-  char inuse[MAX_DELQUEUES_PENDING];
-  int empty;
-
-public:
-  void init ();
-  void queue_file (const char *dosname);
-  void process_queue ();
-};
-
 class user_info
 {
 public:
   DWORD version;
   DWORD cb;
-  delqueue_list delqueue;
   bool warned_msdos;
   mount_info mountinfo;
 };
index 342e51e..5df131e 100644 (file)
@@ -124,7 +124,6 @@ close_all_files (bool norelease)
     cygheap->close_ctty ();
 
   cygheap->fdtab.unlock ();
-  user_shared->delqueue.process_queue ();
 }
 
 int
@@ -558,18 +557,7 @@ unlink (const char *ourname)
   if (NT_SUCCESS (status))
     res = 0;
   else
-    {
-      /* FIXME: Can we get rid of the delqueue now? */
-      if (status == STATUS_SHARING_VIOLATION)
-       {
-         /* Add file to the "to be deleted" queue. */
-         syscall_printf ("Sharing violation, couldn't delete file");
-         user_shared->delqueue.queue_file (win32_name);
-         res = 0;
-       }
-      else
-       __seterrno_from_nt_status (status);
-    }
+    __seterrno_from_nt_status (status);
 
  done:
   syscall_printf ("%d = unlink (%s)", res, ourname);