PATCH: Get rid of superfluous dup() and close() calls.

Martin Wilck Martin.Wilck at Fujitsu-Siemens.com
Fri Jan 24 09:15:50 CST 2003


patch: dup.diff

Get rid of superfluous dup() and close() calls.

Modified files:
 dlls/kernel/comm.c    |   25 ------------------
 dlls/ntdll/file.c     |    2 -
 dlls/ntdll/virtual.c  |    5 ---
 dlls/winsock/socket.c |   68 +-------------------------------------------------
 files/file.c          |   15 -----------
 files/smb.c           |    1 
 include/async.h       |    1 
 scheduler/client.c    |    1 

Comment:

The dup() in wine_server_handle_to_fd() requires dozens of close()
calls spread over the wine code. I think this is confusing and error-prone
(close() calls are easily forgotten, leading to rapid fd leak - actually, 
when looking through the code, I found a number of functions where I 
had expected a close(), but it was lacking).
Moreover, I can't see why that dup() is necessary (any more). 

If there are still some points in the code where the dup() is really
required, I strongly recommend to insert explicit dup()s in the 
respective functions after calling wine_server_handle_to_fd().

I have carried out a number of IO intensive tests with no problems.
I'd like people to test the COMM port stuff, though, and watch the
number of file descriptors. Other IO- and Network-bound tests would 
be very welcome.

If this is absolutely dumb, please tell me why.

Forwarding to wine-devel, 'cause it's pretty intrusive.

Index: dlls/kernel/comm.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/comm.c,v
retrieving revision 1.68
diff -u -r1.68 comm.c
--- dlls/kernel/comm.c	25 Oct 2002 21:02:30 -0000	1.68
+++ dlls/kernel/comm.c	24 Jan 2003 14:13:32 -0000
@@ -516,7 +516,6 @@
 		return FALSE;
 	}
 	result = ioctl(fd,TIOCSBRK,0);
-	close(fd);
 	if (result ==-1)
 	  {
 	        TRACE("ioctl failed\n");
@@ -556,7 +555,6 @@
 		return FALSE;
 	}
 	result = ioctl(fd,TIOCCBRK,0);
-	close(fd);
 	if (result ==-1)
 	  {
 	        TRACE("ioctl failed\n");
@@ -598,7 +596,6 @@
 
 	if (tcgetattr(fd,&port) == -1) {
 		COMM_SetCommError(handle,CE_IOE);
-		close(fd);
 		return FALSE;
 	}
 
@@ -670,7 +667,6 @@
 
 	if (!direct)
 	  if (tcsetattr(fd, TCSADRAIN, &port) == -1) {
-		close(fd);
 		COMM_SetCommError(handle,CE_IOE);
 		return FALSE;
 	  } else
@@ -685,7 +681,6 @@
 	    else
 	      result = TRUE;
 	  }
-	close(fd);
 	return result;
 }
 
@@ -726,7 +721,6 @@
          tcflush(fd,TCOFLUSH);
      if(flags&PURGE_RXCLEAR)
          tcflush(fd,TCIFLUSH);
-     close(fd);
 
      return 1;
 }
@@ -782,8 +776,6 @@
 	      handle, lpStat->cbInQue, lpStat->cbOutQue);
     }
 
-    close(fd);
-
     COMM_GetCommError(handle, errors);
     COMM_SetCommError(handle, 0);
 
@@ -817,7 +809,6 @@
 	FIXME("handle %p not found?\n",handle);
         return FALSE;
     }
-    close(fd);
     return TRUE;
 }
 
@@ -916,7 +907,6 @@
      if ((tcgetattr(fd,&port)) == -1) {
          int save_error = errno;
          COMM_SetCommError(handle,CE_IOE);
-         close( fd );
          ERR("tcgetattr error '%s'\n", strerror(save_error));
          return FALSE;
      }
@@ -1023,7 +1013,6 @@
 

                         COMM_SetCommError(handle,IE_BAUDRATE);
-			close( fd );
 			ERR("baudrate %ld\n",lpdcb->BaudRate);
 			return FALSE;
 	}
@@ -1089,7 +1078,6 @@
 #endif
                 default:
                         COMM_SetCommError(handle,IE_BAUDRATE);
-                        close( fd );
 			ERR("baudrate %ld\n",lpdcb->BaudRate);
                         return FALSE;
         }
@@ -1132,7 +1120,6 @@
                             port.c_iflag &= ~INPCK;
                         } else {
                             COMM_SetCommError(handle,IE_BYTESIZE);
-                            close( fd );
                             ERR("Cannot set MARK Parity\n");
                             return FALSE;
                         }
@@ -1143,7 +1130,6 @@
                             port.c_iflag &= ~INPCK;
                         } else {
                             COMM_SetCommError(handle,IE_BYTESIZE);
-                            close( fd );
                             ERR("Cannot set SPACE Parity\n");
                             return FALSE;
                         }
@@ -1151,7 +1137,6 @@
 #endif
                default:
                         COMM_SetCommError(handle,IE_BYTESIZE);
-                        close( fd );
 			ERR("Parity\n");
                         return FALSE;
         }
@@ -1173,7 +1158,6 @@
 			break;
 		default:
                         COMM_SetCommError(handle,IE_BYTESIZE);
-                        close( fd );
 			ERR("ByteSize\n");
 			return FALSE;
 	}
@@ -1188,7 +1172,6 @@
 				break;
 		default:
                         COMM_SetCommError(handle,IE_BYTESIZE);
-                        close( fd );
 			ERR("StopBits\n");
 			return FALSE;
 	}
@@ -1219,12 +1202,10 @@
 	if (tcsetattr(fd,TCSANOW,&port)==-1) { /* otherwise it hangs with pending input*/
 	        int save_error=errno;
                 COMM_SetCommError(handle,CE_IOE);
-                close( fd );
                 ERR("tcsetattr error '%s'\n", strerror(save_error));
 		return FALSE;
 	} else {
                 COMM_SetCommError(handle,0);
-                close( fd );
 		return TRUE;
 	}
 }
@@ -1262,10 +1243,8 @@
                 int save_error=errno;
                 ERR("tcgetattr error '%s'\n", strerror(save_error));
                 COMM_SetCommError(handle,CE_IOE);
-                close( fd );
 		return FALSE;
 	}
-     close( fd );
 #ifndef __EMX__
 #ifdef CBAUD
      speed= (port.c_cflag & CBAUD);
@@ -1465,7 +1444,6 @@
     else
     {
         r = (1 == write(fd, &chTransmit, 1));
-        close(fd);
     }
 
     return r;
@@ -1593,7 +1571,6 @@
         FIXME("tcsetattr on fd %d failed!\n",fd);
         return FALSE;
     }
-    close(fd);
     return TRUE;
 }
 
@@ -1619,7 +1596,6 @@
 	if(fd<0)
 		return FALSE;
 	result = ioctl(fd, TIOCMGET, &mstat);
-	close(fd);
 	if (result == -1)
 	  {
 	    WARN("ioctl failed\n");
@@ -1702,7 +1678,6 @@
     ovp = (async_commio*) HeapAlloc(GetProcessHeap(), 0, sizeof (async_commio));
     if(!ovp)
     {
-        close(fd);
         return FALSE;
     }
 
Index: dlls/ntdll/file.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/file.c,v
retrieving revision 1.20
diff -u -r1.20 file.c
--- dlls/ntdll/file.c	7 Jan 2003 20:36:28 -0000	1.20
+++ dlls/ntdll/file.c	24 Jan 2003 14:13:35 -0000
@@ -237,8 +237,6 @@
 	}
 	while ( (result == -1) && ((errno == EAGAIN) || (errno == EINTR)) );
 
-	close( fd );
-
 	if (result == -1)
 	{
 		return IoStatusBlock->u.Status = NTFILE_errno_to_status(errno);
Index: dlls/ntdll/virtual.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/virtual.c,v
retrieving revision 1.4
diff -u -r1.4 virtual.c
--- dlls/ntdll/virtual.c	7 Jan 2003 20:36:28 -0000	1.4
+++ dlls/ntdll/virtual.c	24 Jan 2003 14:13:39 -0000
@@ -736,13 +736,11 @@
         VIRTUAL_SetProt( view, ptr + sec->VirtualAddress, size, vprot );
     }
 
-    close( fd );
     *addr_ptr = ptr;
     return STATUS_SUCCESS;
 
  error:
     if (ptr != (char *)-1) munmap( ptr, total_size );
-    close( fd );
     return status;
 }
 
@@ -1408,7 +1406,6 @@
         }
         res = map_image( handle, unix_handle, base, size_low, header_size,
                          shared_fd, shared_size, removable, addr_ptr );
-        if (shared_fd != -1) close( shared_fd );
         if (!res) *size_ptr = size_low;
         return res;
     }
@@ -1484,12 +1481,10 @@
         res = STATUS_NO_MEMORY;
         goto error;
     }
-    if (unix_handle != -1) close( unix_handle );
     *size_ptr = size;
     return STATUS_SUCCESS;
 
 error:
-    if (unix_handle != -1) close( unix_handle );
     if (ptr != (void *)-1) munmap( ptr, size );
     return res;
 }
Index: dlls/winsock/socket.c
===================================================================
RCS file: /home/wine/wine/dlls/winsock/socket.c,v
retrieving revision 1.117
diff -u -r1.117 socket.c
--- dlls/winsock/socket.c	23 Jan 2003 21:20:36 -0000	1.117
+++ dlls/winsock/socket.c	24 Jan 2003 14:13:51 -0000
@@ -336,7 +336,6 @@
     if ( ( (access & GENERIC_READ)  && (*flags & FD_FLAG_RECV_SHUTDOWN ) ) ||
          ( (access & GENERIC_WRITE) && (*flags & FD_FLAG_SEND_SHUTDOWN ) ) )
     {
-        close (fd);
         WSASetLastError ( WSAESHUTDOWN );
         return -1;
     }
@@ -578,7 +577,6 @@
 			 else
 			     wsfds16->fd_array[j++] = wsfds16->fd_array[i];
 		}
-		close(fd);
 		lfd[i] = -1;
 	    }
 	}
@@ -593,24 +591,6 @@
     return num_err;
 }
 
-static void fd_set_unimport( void* wsfds, int lfd[], BOOL b32 )
-{
-    if ( wsfds )
-    {
-#define wsfds16 ((ws_fd_set16*)wsfds)
-#define wsfds32 ((WS_fd_set*)wsfds)
-	int i, count = (b32) ? wsfds32->fd_count : wsfds16->fd_count;
-
-	for( i = 0; i < count; i++ )
-	    if ( lfd[i] >= 0 )
-		close(lfd[i]);
-
-	TRACE("\n");
-#undef wsfds32
-#undef wsfds16
-    }
-}
-
 static int do_block( int fd, int mask )
 {
     fd_set fds[3];
@@ -1417,7 +1397,6 @@
 	    SetLastError(_get_sock_error(s, FD_ACCEPT_BIT));
 	    /* FIXME: care about the error? */
 	}
-        close(fd);
         SERVER_START_REQ( accept_socket )
         {
             req->lhandle = SOCKET2HANDLE(s);
@@ -1516,7 +1495,6 @@
                 ws_sockaddr_free(uaddr,name);
             }
         }
-        close(fd);
     }
     else
     {
@@ -1613,7 +1591,6 @@
         {
             SetLastError(wsaErrno());
         }
-        close(fd);
     }
     else
     {
@@ -1622,7 +1599,6 @@
     return SOCKET_ERROR;
 
 connect_success:
-    close(fd);
     _enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE,
                   FD_WINE_CONNECTED|FD_READ|FD_WRITE,
                   FD_CONNECT|FD_WINE_LISTENING);
@@ -1690,7 +1666,6 @@
             res=0;
         }
         ws_sockaddr_free(uaddr,name);
-        close(fd);
     }
     else
     {
@@ -1755,7 +1730,6 @@
         {
             res=0;
         }
-        close(fd);
     }
     else
     {
@@ -1820,12 +1794,10 @@
         } else {
 	    if (getsockopt(fd, (int) level, optname, optval, optlen) == 0 )
 	    {
-		close(fd);
 		return 0;
 	    }
 	    SetLastError((errno == EBADF) ? WSAENOTSOCK : wsaErrno());
 	}
-	close(fd);
     }
     return SOCKET_ERROR;
 }
@@ -1966,7 +1938,6 @@
             if (numInt < 0)
             {
                ERR ("Unable to open /proc filesystem to determine number of network interfaces!\n");
-               close(fd);
                WSASetLastError(WSAEINVAL);
                return (SOCKET_ERROR);
             }
@@ -1976,7 +1947,6 @@
                if (!WSAIOCTL_GetInterfaceName(i, ifName))
                {
                   ERR ("Error parsing /proc filesystem!\n");
-                  close(fd);
                   WSASetLastError(WSAEINVAL);
                   return (SOCKET_ERROR);
                }
@@ -1988,7 +1958,6 @@
                if (ioctl(fd, SIOCGIFADDR, &ifInfo) < 0)
                {
                   ERR ("Error obtaining IP address\n");
-                  close(fd);
                   WSASetLastError(WSAEINVAL);
                   return (SOCKET_ERROR);
                }
@@ -2006,7 +1975,6 @@
                if (ioctl(fd, SIOCGIFBRDADDR, &ifInfo) < 0)
                {
                   ERR ("Error obtaining Broadcast IP address\n");
-                  close(fd);
                   WSASetLastError(WSAEINVAL);
                   return (SOCKET_ERROR);
                }
@@ -2024,7 +1992,6 @@
                if (ioctl(fd, SIOCGIFNETMASK, &ifInfo) < 0)
                {
                   ERR ("Error obtaining Subnet IP address\n");
-                  close(fd);
                   WSASetLastError(WSAEINVAL);
                   return (SOCKET_ERROR);
                }
@@ -2059,7 +2026,6 @@
                if (ioctl(fd, SIOCGIFFLAGS, &ifInfo) < 0)
                {
                   ERR ("Error obtaining status flags for socket!\n");
-                  close(fd);
                   WSASetLastError(WSAEINVAL);
                   return (SOCKET_ERROR);
                }
@@ -2079,14 +2045,12 @@
          default:
          {
             WARN("\tunsupported WS_IOCTL cmd (%08lx)\n", dwIoControlCode);
-            close(fd);
             WSASetLastError(WSAEOPNOTSUPP);
             return (SOCKET_ERROR);
          }
       }
 
       /* Function executed with no errors */
-      close(fd);
       return (0);
    }
    else
@@ -2242,14 +2206,11 @@
 		{
 		    /* AsyncSelect()'ed sockets are always nonblocking */
 		    if (*argp) {
-			close(fd);
 			return 0;
 		    }
 		    SetLastError(WSAEINVAL);
-		    close(fd);
 		    return SOCKET_ERROR;
 		}
-		close(fd);
 		if (*argp)
 		    _enable_event(SOCKET2HANDLE(s), 0, FD_WINE_NONBLOCKING, 0);
 		else
@@ -2279,11 +2240,9 @@
     }
     if( ioctl(fd, newcmd, (char*)argp ) == 0 )
     {
-	close(fd);
 	return 0;
     }
     SetLastError((errno == EBADF) ? WSAENOTSOCK : wsaErrno());
-    close(fd);
   }
   return SOCKET_ERROR;
 }
@@ -2309,7 +2268,6 @@
     {
 	if (listen(fd, backlog) == 0)
 	{
-	    close(fd);
 	    _enable_event(SOCKET2HANDLE(s), FD_ACCEPT,
 			  FD_WINE_LISTENING,
 			  FD_CONNECT|FD_WINE_CONNECTED);
@@ -2437,7 +2395,6 @@
                     else
                         wsfds16->fd_array[j++] = wsfds16->fd_array[i];
                 }
-                if( fd >= 0 ) close(fd);
                 exceptfd[i] = -1;
             }
             if( b32 )
@@ -2449,9 +2406,6 @@
         }
         return highfd;
     }
-    fd_set_unimport(ws_readfds, readfd, b32);
-    fd_set_unimport(ws_writefds, writefd, b32);
-    fd_set_unimport(ws_exceptfds, exceptfd, b32);
     if( ws_readfds ) ((WS_fd_set*)ws_readfds)->fd_count = 0;
     if( ws_writefds ) ((WS_fd_set*)ws_writefds)->fd_count = 0;
     if( ws_exceptfds ) ((WS_fd_set*)ws_exceptfds)->fd_count = 0;
@@ -2553,7 +2507,7 @@
     if ( !iovec )
     {
         err = WSAEFAULT;
-        goto err_close;
+        goto error;
     }
 
     for ( i = 0; i < dwBufferCount; i++ )
@@ -2617,15 +2571,11 @@
     *lpNumberOfBytesSent = n;
 
     HeapFree ( GetProcessHeap(), 0, iovec );
-    close ( fd );
     return 0;
 
 err_free:
     HeapFree ( GetProcessHeap(), 0, iovec );
 
-err_close:
-    close ( fd );
-
 error:
     WARN (" -> ERROR %d\n", err);
     WSASetLastError (err);
@@ -2725,7 +2675,6 @@
         }else{
             if (!convert_sockopt(&level, &optname)) {
 		SetLastError(WSAENOPROTOOPT);
-		close(fd);
 		return SOCKET_ERROR;
 	    }
             if (optname == SO_LINGER && optval) {
@@ -2755,7 +2704,6 @@
                    WARN("SO_RCVTIMEO for %d bytes: assuming unixism\n", optlen);
 		} else {
                    WARN("SO_RCVTIMEO for %d bytes is weird: ignored\n", optlen);
-		    close(fd);
 		    return 0;
 		}
 	    }
@@ -2774,7 +2722,6 @@
                    WARN("SO_SNDTIMEO for %d bytes: assuming unixism\n", optlen);
                } else {
                    WARN("SO_SNDTIMEO for %d bytes is weird: ignored\n", optlen);
-                   close(fd);
                    return 0;
                }
            }
@@ -2782,17 +2729,14 @@
 	}
         if(optname == SO_RCVBUF && *(int*)optval < 2048) {
             WARN("SO_RCVBF for %d bytes is too small: ignored\n", *(int*)optval );
-            close( fd);
             return 0;
         }
 
 	if (setsockopt(fd, level, optname, optval, optlen) == 0)
 	{
-	    close(fd);
 	    return 0;
 	}
 	SetLastError(wsaErrno());
-	close(fd);
     }
     else SetLastError(WSAENOTSOCK);
     return SOCKET_ERROR;
@@ -2859,7 +2803,6 @@
             err = WS2_register_async_shutdown ( s, fd0, ASYNC_TYPE_READ );
             if ( err )
             {
-                close ( fd0 );
                 goto error;
             }
         }
@@ -2868,7 +2811,6 @@
             err = WS2_register_async_shutdown ( s, fd1, ASYNC_TYPE_WRITE );
             if ( err )
             {
-                close ( fd1 );
                 goto error;
             }
         }
@@ -2878,10 +2820,8 @@
         if ( shutdown( fd, how ) )
         {
             err = wsaErrno ();
-            close ( fd );
             goto error;
         }
-        close(fd);
     }
 
     _enable_event( SOCKET2HANDLE(s), 0, 0, clear_flags );
@@ -4006,7 +3946,7 @@
     if ( !iovec )
     {
         err = WSAEFAULT;
-        goto err_close;
+        goto error;
     }
 
     for (i = 0; i < dwBufferCount; i++)
@@ -4070,16 +4010,12 @@
     *lpNumberOfBytesRecvd = n;
 
     HeapFree (GetProcessHeap(), 0, iovec);
-    close(fd);
     _enable_event(SOCKET2HANDLE(s), FD_READ, 0, 0);
 
     return 0;
 
 err_free:
     HeapFree (GetProcessHeap(), 0, iovec);
-
-err_close:
-    close (fd);
 
 error:
     WARN(" -> ERROR %d\n", err);
Index: files/file.c
===================================================================
RCS file: /home/wine/wine/files/file.c,v
retrieving revision 1.177
diff -u -r1.177 file.c
--- files/file.c	11 Jan 2003 21:03:18 -0000	1.177
+++ files/file.c	24 Jan 2003 14:13:59 -0000
@@ -333,7 +333,6 @@
     else if (((access & GENERIC_READ)  && (flags & FD_FLAG_RECV_SHUTDOWN)) ||
              ((access & GENERIC_WRITE) && (flags & FD_FLAG_SEND_SHUTDOWN)))
     {
-        close (fd);
         SetLastError ( ERROR_PIPE_NOT_CONNECTED );
         return -1;
     }
@@ -1755,7 +1754,6 @@
     return !register_new_async (&ovp->async);
 
 error:
-    close (fd);
     return FALSE;
 
 }
@@ -1813,12 +1811,10 @@
         if ( (overlapped==NULL) || NtResetEvent( overlapped->hEvent, NULL ) )
         {
             TRACE("Overlapped not specified or invalid event flag\n");
-	    close(unix_handle);
             SetLastError(ERROR_INVALID_PARAMETER);
             return FALSE;
         }
 
-        close(unix_handle);
         overlapped->InternalHigh = 0;
 
         if(!FILE_ReadFileEx(hFile, buffer, bytesToRead, overlapped, NULL, overlapped->hEvent))
@@ -1835,7 +1831,6 @@
     }
     if (flags & FD_FLAG_TIMEOUT)
     {
-        close(unix_handle);
         return FILE_TimeoutRead(hFile, buffer, bytesToRead, bytesRead);
     }
     switch(type)
@@ -1856,7 +1851,6 @@
                                                              &highOffset, FILE_BEGIN)) &&
                  (GetLastError() != NO_ERROR) )
             {
-              close(unix_handle);
               return FALSE;
             }
         }
@@ -1872,7 +1866,6 @@
 	off_t offset = OVERLAPPED_OFFSET(overlapped);
 	if(lseek(unix_handle, offset, SEEK_SET) == -1)
 	{
-	    close(unix_handle);
 	    SetLastError(ERROR_INVALID_PARAMETER);
 	    return FALSE;
 	}
@@ -1886,7 +1879,6 @@
 	FILE_SetDosError();
 	break;
     }
-    close( unix_handle );
     if (result == -1) return FALSE;
     if (bytesRead) *bytesRead = result;
     return TRUE;
@@ -1998,7 +1990,6 @@
     return !register_new_async (&ovp->async);
 
 error:
-    close (fd);
     return FALSE;
 }
 
@@ -2037,12 +2028,10 @@
         if ( (overlapped==NULL) || NtResetEvent( overlapped->hEvent, NULL ) )
         {
             TRACE("Overlapped not specified or invalid event flag\n");
-	    close(unix_handle);
             SetLastError(ERROR_INVALID_PARAMETER);
             return FALSE;
         }
 
-        close(unix_handle);
         overlapped->InternalHigh = 0;
 
         if(!FILE_WriteFileEx(hFile, buffer, bytesToWrite, overlapped, NULL, overlapped->hEvent))
@@ -2075,7 +2064,6 @@
                                                              &highOffset, FILE_BEGIN)) &&
                  (GetLastError() != NO_ERROR) )
             {
-              close(unix_handle);
               return FALSE;
             }
         }
@@ -2086,7 +2074,6 @@
             return FALSE;
         if (overlapped)
         {
-            close(unix_handle);
             SetLastError(ERROR_INVALID_PARAMETER);
             return FALSE;
         }
@@ -2098,7 +2085,6 @@
 	off_t offset = OVERLAPPED_OFFSET(overlapped);
 	if(lseek(unix_handle, offset, SEEK_SET) == -1)
 	{
-	    close(unix_handle);
 	    SetLastError(ERROR_INVALID_PARAMETER);
 	    return FALSE;
 	}
@@ -2115,7 +2101,6 @@
         FILE_SetDosError();
         break;
     }
-    close( unix_handle );
     if (result == -1) return FALSE;
     if (bytesWritten) *bytesWritten = result;
     return TRUE;
Index: files/smb.c
===================================================================
RCS file: /home/wine/wine/files/smb.c,v
retrieving revision 1.16
diff -u -r1.16 smb.c
--- files/smb.c	24 Jan 2003 00:54:58 -0000	1.16
+++ files/smb.c	24 Jan 2003 14:14:02 -0000
@@ -1532,7 +1532,6 @@
         if(total>=bytesToRead)
             break;
     }
-    close(fd);
 
     if(bytesRead)
         *bytesRead = total;
Index: include/async.h
===================================================================
RCS file: /home/wine/wine/include/async.h,v
retrieving revision 1.5
diff -u -r1.5 async.h
--- include/async.h	4 May 2002 18:37:08 -0000	1.5
+++ include/async.h	24 Jan 2003 14:14:02 -0000
@@ -72,7 +72,6 @@
 
     ovp->next = ovp->prev = NULL;
 
-    close( ovp->fd );
     if( ovp->event != INVALID_HANDLE_VALUE )
         NtSetEvent( ovp->event, NULL );
 
Index: scheduler/client.c
===================================================================
RCS file: /home/wine/wine/scheduler/client.c,v
retrieving revision 1.92
diff -u -r1.92 client.c
--- scheduler/client.c	31 Oct 2002 03:41:56 -0000	1.92
+++ scheduler/client.c	24 Jan 2003 14:14:05 -0000
@@ -436,7 +436,6 @@
          */
     }
 
-    if ((fd != -1) && ((fd = dup(fd)) == -1)) return STATUS_TOO_MANY_OPENED_FILES;
     *unix_fd = fd;
     return STATUS_SUCCESS;
 }
-- 
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








More information about the wine-patches mailing list