[PATCH] Set FILE_ATTRIBUTE_TEMPORARY on files opened by mkstemp() on WinNT

Vaclav Haisman V.Haisman@sh.cvut.cz
Thu Jul 21 23:32:00 GMT 2005


Hi,
the attached patch sets FILE_ATTRIBUTE_TEMPORARY on files opened by mkstemp()
on WinNT class systems. Theoretically the OS should then be less eager to write
such files onto the physical storage and use cache instead.

VH


2005-07-22  Vaclav Haisman  <v.haisman@sh.cvut.cz>

	* syscalls.cc (open_with_attributes): Rename open() to
	open_with_attributes(). Add fileattr parameter and use it. Add
	explicit mode_t parameter for mode. Tweak debugging
	syscall_printf() calls to reflect the new parameter.
	(open): Reimplement using open_with_attributes().
	* fhandler.cc (fhandler_base::open): Use pc.file_attributes() when
	opening disk file.
	* mktemp.cc (_gettemp): Set FILE_ATTRIBUTE_TEMPORARY on WinNT
	using open_with_attributes().
-------------- next part --------------
Index: fhandler.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler.cc,v
retrieving revision 1.239
diff -u -p -d -r1.239 fhandler.cc
--- fhandler.cc	6 Jul 2005 20:05:00 -0000	1.239
+++ fhandler.cc	21 Jul 2005 23:27:57 -0000
@@ -639,7 +639,10 @@ fhandler_base::open (int flags, mode_t m
 
   if (flags & O_CREAT && get_device () == FH_FS)
     {
-      file_attributes = FILE_ATTRIBUTE_NORMAL;
+      if (pc.file_attributes () == INVALID_FILE_ATTRIBUTES)
+        file_attributes = FILE_ATTRIBUTE_NORMAL;
+      else
+        file_attributes = pc.file_attributes ();
       /* If mode has no write bits set, we set the R/O attribute. */
       if (!(mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
 	file_attributes |= FILE_ATTRIBUTE_READONLY;
Index: mktemp.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/mktemp.cc,v
retrieving revision 1.2
diff -u -p -d -r1.2 mktemp.cc
--- mktemp.cc	25 May 2005 03:43:58 -0000	1.2
+++ mktemp.cc	21 Jul 2005 23:27:57 -0000
@@ -101,11 +101,15 @@ _gettemp(char *path, int *doopen, int do
 	}
     }
 
+  DWORD const fileattr = wincap.is_winnt () ? 
+    FILE_ATTRIBUTE_TEMPORARY : FILE_ATTRIBUTE_NORMAL;
   for (;;)
     {
       if (doopen)
 	{
-	  if ((*doopen = open (path, O_CREAT | O_EXCL | O_RDWR, 0600)) >= 0)
+          extern int open_with_attributes (const char *, int, mode_t, DWORD);
+	  if ((*doopen = open_with_attributes (path, O_CREAT | O_EXCL | O_RDWR,
+                                               0600, fileattr)) >= 0)
 	    return 1;
 	  if (errno != EEXIST)
 	    return 0;
Index: syscalls.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/syscalls.cc,v
retrieving revision 1.386
diff -u -p -d -r1.386 syscalls.cc
--- syscalls.cc	6 Jul 2005 20:05:03 -0000	1.386
+++ syscalls.cc	21 Jul 2005 23:27:59 -0000
@@ -539,18 +539,15 @@ done:
   return res;
 }
 
-/* _open */
-/* newlib's fcntl.h defines _open as taking variable args so we must
-   correspond.  The third arg if it exists is: mode_t mode. */
-extern "C" int
-open (const char *unix_path, int flags, ...)
+
+extern int
+open_with_attributes (const char *unix_path, int flags, mode_t mode, 
+                      DWORD fileattr)
 {
   int res = -1;
-  va_list ap;
-  mode_t mode = 0;
   sig_dispatch_pending ();
 
-  syscall_printf ("open (%s, %p)", unix_path, flags);
+  syscall_printf ("open (%s, %p, %p, %p)", unix_path, flags, mode, fileattr);
   myfault efault;
   if (efault.faulted (EFAULT))
     /* errno already set */;
@@ -558,30 +555,36 @@ open (const char *unix_path, int flags, 
     set_errno (ENOENT);
   else
     {
-      /* check for optional mode argument */
-      va_start (ap, flags);
-      mode = va_arg (ap, mode_t);
-      va_end (ap);
-
       fhandler_base *fh;
       cygheap_fdnew fd;
 
       if (fd >= 0)
 	{
 	  if (!(fh = build_fh_name (unix_path, NULL, PC_SYM_FOLLOW)))
-	    res = -1;		// errno already set
-	  else if (((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) && fh->exists ())
+            {
+              res = -1;		// errno already set
+              goto out;
+            }
+	  else if (((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) 
+              && fh->exists ())
 	    {
 	      delete fh;
 	      res = -1;
 	      set_errno (EEXIST);
+              goto out;
 	    }
 	  else if (fh->is_fs_special () && fh->device_access_denied (flags))
 	    {
 	      delete fh;
 	      res = -1;
+              goto out;
 	    }
-	  else if (!fh->open (flags, (mode & 07777) & ~cygheap->umask))
+          
+          if (static_cast<DWORD &>(*fh) == INVALID_FILE_ATTRIBUTES)
+            static_cast<DWORD &>(*fh) = fileattr;
+          else
+            static_cast<DWORD &>(*fh) = static_cast<DWORD &>(*fh) | fileattr;
+	  if (!fh->open (flags, (mode & 07777) & ~cygheap->umask))
 	    {
 	      delete fh;
 	      res = -1;
@@ -595,10 +598,31 @@ open (const char *unix_path, int flags, 
 	}
     }
 
-  syscall_printf ("%d = open (%s, %p)", res, unix_path, flags);
+ out:
+  syscall_printf ("%d = open (%s, %p, %p, %p)", res, unix_path, flags, mode, 
+                  fileattr);
   return res;
 }
 
+
+/* _open */
+/* newlib's fcntl.h defines _open as taking variable args so we must
+   correspond.  The third arg if it exists is: mode_t mode. */
+extern "C" int
+open (const char *unix_path, int flags, ...)
+{
+  va_list ap;
+  int ret;
+  mode_t mode;
+
+  va_start (ap, flags);
+  mode = flags & O_CREAT ? va_arg (ap, mode_t) : 0;
+  ret = open_with_attributes (unix_path, flags, mode, FILE_ATTRIBUTE_NORMAL);
+  va_end (ap);
+
+  return ret;
+}
+
 EXPORT_ALIAS (open, _open )
 EXPORT_ALIAS (open, _open64 )
 
-------------- next part --------------
2005-07-22  Vaclav Haisman  <v.haisman@sh.cvut.cz>



	* syscalls.cc (open_with_attributes): Rename open() to

	open_with_attributes(). Add fileattr parameter and use it. Add

	explicit mode_t parameter for mode. Tweak debugging

	syscall_printf() calls to reflect the new parameter.

	(open): Reimplement using open_with_attributes().

	* fhandler.cc (fhandler_base::open): Use pc.file_attributes() when

	opening disk file.

	* mktemp.cc (_gettemp): Set FILE_ATTRIBUTE_TEMPORARY on WinNT

	using open_with_attributes().



More information about the Cygwin-patches mailing list