002-fd_type.patch - small version

Martin Wilck Martin.Wilck at fujitsu-siemens.com
Tue Jan 8 12:26:37 CST 2002


This is a stripped down version of the 002-fd_type patch I submitted
yesterday. Alexandre, let me know if you like this one better.

New versions of the subsequent patches are required in any case after
today's CVS update. I have them if you want.

-- 
Martin Wilck                Phone: +49 5251 8 15113
Fujitsu Siemens Computers   Fax:   +49 5251 8 20409
Heinz-Nixdorf-Ring 1	    mailto:Martin.Wilck at Fujitsu-Siemens.com
D-33106 Paderborn           http://www.fujitsu-siemens.com/primergy

Patch file:	002-fd_type.diff
Purpose:	More general approach to file descriptor types and flags.
Created: 	2002-01-08
Applies:	CVS 2002-01-08

server/protocol.def:
	The lowest byte of the type value is reserved for the type itself
	(macro FD_TYPE (type)the rest is available for miscellaneous flags.

	New FD flags (were formerly FD types):
		FD_TYPE_FLAG_OVERLAPPED: The fd uses overlapped I/O.
		FD_TYPE_FLAG_TIMEOUT: The fd applies a timeout on
			its I/O operations
	New test macros: FD_TYPE_IS_OVERLAPPED (type),
		FD_TYPE_HAS_TIMEOUT (type)

server/file.c:
	file_get_info():
		set FD_TYPE_FLAG_OVERLAPPED on overlapped files.

server/serial.c:
	serial_get_info():
		account for OVERLAPPED and TIMEOUT flags.

files/file.c:
	ReadFile():
		Replace FD_TYPE_XYZ dependent switch statement
		with an equivalent if/elseif construct which
		will allow a morte fine-grained destinction
		of fd types and flags in the future.
	WriteFile():
		dito.

Martin Wilck <Martin.Wilck at Fujitsu-Siemens.com>

diff -ruX diffignore CVS/wine/files/file.c MW/wine/files/file.c
--- CVS/wine/files/file.c	Tue Jan  8 10:59:59 2002
+++ MW/wine/files/file.c	Tue Jan  8 12:00:39 2002
@@ -1459,9 +1459,8 @@

     unix_handle = FILE_GetUnixHandleType( hFile, GENERIC_READ, &type );

-    switch (type)
+    if ( FD_TYPE_IS_OVERLAPPED (type) )
     {
-    case FD_TYPE_OVERLAPPED:
 	if (unix_handle == -1) return FALSE;
         if ( (overlapped==NULL) || NtResetEvent( overlapped->hEvent, NULL ) )
         {
@@ -1506,15 +1505,21 @@
         /* fail on return, with ERROR_IO_PENDING */
         SetLastError(ERROR_IO_PENDING);
         return FALSE;
+    }

-    case FD_TYPE_CONSOLE:
+    else if ( FD_TYPE (type) == FD_TYPE_CONSOLE )
+    {
 	return ReadConsoleA(hFile, buffer, bytesToRead, bytesRead, NULL);
+    }

-    case FD_TYPE_TIMEOUT:
+    else if ( FD_TYPE_HAS_TIMEOUT (type) )
+    {
         close(unix_handle);
         return FILE_TimeoutRead(hFile, buffer, bytesToRead, bytesRead);
+    }

-    default:
+    else
+    {
 	/* normal unix files */
 	if (unix_handle == -1)
 	    return FALSE;
@@ -1524,7 +1529,6 @@
 	    SetLastError(ERROR_INVALID_PARAMETER);
 	    return FALSE;
 	}
-	break;
     }

     /* code for synchronous reads */
@@ -1678,9 +1682,8 @@

     unix_handle = FILE_GetUnixHandleType( hFile, GENERIC_WRITE, &type );

-    switch (type)
+    if ( FD_TYPE_IS_OVERLAPPED (type) )
     {
-    case FD_TYPE_OVERLAPPED:
 	if (unix_handle == -1) return FALSE;
         if ( (overlapped==NULL) || NtResetEvent( overlapped->hEvent, NULL ) )
         {
@@ -1728,11 +1731,17 @@
         SetLastError(ERROR_IO_PENDING);
         return FALSE;

-    case FD_TYPE_CONSOLE:
+    }
+
+    else if ( FD_TYPE (type) == FD_TYPE_CONSOLE )
+    {
 	TRACE("%d %s %ld %p %p\n", hFile, debugstr_an(buffer, bytesToWrite), bytesToWrite,
 	      bytesWritten, overlapped );
 	return WriteConsoleA(hFile, buffer, bytesToWrite, bytesWritten, NULL);
-    default:
+    }
+
+    else
+    {
 	if (unix_handle == -1)
 	    return FALSE;
     }
diff -ruX diffignore CVS/wine/server/file.c MW/wine/server/file.c
--- CVS/wine/server/file.c	Tue Jan  8 10:53:08 2002
+++ MW/wine/server/file.c	Tue Jan  8 12:01:03 2002
@@ -307,6 +307,7 @@
 {
     struct stat st;
     struct file *file = (struct file *)obj;
+    int fd_type = FD_TYPE_DEFAULT;
     assert( obj->ops == &file_ops );

     if (reply)
@@ -340,9 +341,9 @@
         reply->serial      = 0; /* FIXME */
     }

-    if (file->flags & FILE_FLAG_OVERLAPPED) return FD_TYPE_OVERLAPPED;
+    if (file->flags & FILE_FLAG_OVERLAPPED) fd_type |= FD_TYPE_FLAG_OVERLAPPED;

-    return FD_TYPE_DEFAULT;
+    return fd_type;
 }

 static struct async_queue *file_queue_async(struct object *obj, struct async *async, int type, int count)
diff -ruX diffignore CVS/wine/server/protocol.def MW/wine/server/protocol.def
--- CVS/wine/server/protocol.def	Mon Jan  7 16:08:44 2002
+++ MW/wine/server/protocol.def	Tue Jan  8 11:54:30 2002
@@ -544,12 +544,17 @@
     int          fd;            /* file descriptor */
     int          type;          /* the type of file */
 @END
+#define FD_TYPE(x) ((x) & 0xff)
+
 #define FD_TYPE_INVALID    0
 #define FD_TYPE_DEFAULT    1
 #define FD_TYPE_CONSOLE    2
-#define FD_TYPE_OVERLAPPED 3
-#define FD_TYPE_TIMEOUT    4
+
+#define FD_TYPE_FLAG_OVERLAPPED 0x100
+#define FD_TYPE_FLAG_TIMEOUT    0x200

+#define FD_TYPE_IS_OVERLAPPED(x) ((x) & FD_TYPE_FLAG_OVERLAPPED)
+#define FD_TYPE_HAS_TIMEOUT(x)   ((x) & FD_TYPE_FLAG_TIMEOUT)

 /* Set a file current position */
 @REQ(set_file_pointer)
diff -ruX diffignore CVS/wine/server/serial.c MW/wine/server/serial.c
--- CVS/wine/server/serial.c	Mon Jan  7 16:08:44 2002
+++ MW/wine/server/serial.c	Tue Jan  8 11:54:30 2002
@@ -192,6 +192,7 @@
 static int serial_get_info( struct object *obj, struct get_file_info_reply *reply )
 {
     struct serial *serial = (struct serial *) obj;
+    int fd_type = FD_TYPE_DEFAULT;
     assert( obj->ops == &serial_ops );

     if (reply)
@@ -209,13 +210,13 @@
     }

     if(serial->attrib & FILE_FLAG_OVERLAPPED)
-        return FD_TYPE_OVERLAPPED;
+        fd_type |= FD_TYPE_FLAG_OVERLAPPED;

-    if( (serial->readinterval == MAXDWORD) &&
-        (serial->readmult == 0) && (serial->readconst == 0) )
-        return FD_TYPE_DEFAULT;
+    else if( !((serial->readinterval == MAXDWORD) &&
+	       (serial->readmult == 0) && (serial->readconst == 0)) )
+	fd_type |= FD_TYPE_FLAG_TIMEOUT;

-    return FD_TYPE_TIMEOUT;
+    return fd_type;
 }

 static void serial_poll_event(struct object *obj, int event)








More information about the wine-patches mailing list