diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 4b60bc953..b01b31aee 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +2006-08-10 Christopher Faylor + + * winsup.h: Turn on DEBUGGING by default for now. + 2006-08-10 Corinna Vinschen * fhandler_disk_file.cc (fhandler_disk_file::lock): Handle diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index 00e987587..ae5edcb62 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -31,6 +31,7 @@ details. */ #include #include #include "ntdll.h" +#include "mmap_helper.h" static NO_COPY const int CHUNK_SIZE = 1024; /* Used for crlf conversions */ @@ -223,10 +224,8 @@ fhandler_base::raw_read (void *ptr, size_t& ulen) HANDLE h = NULL; /* grumble */ int prio = 0; /* ditto */ - int try_noreserve = 1; DWORD len = ulen; -retry: ulen = (size_t) -1; if (read_state) { @@ -235,7 +234,7 @@ retry: SetThreadPriority (h, THREAD_PRIORITY_TIME_CRITICAL); signal_read_state (1); } - BOOL res = ReadFile (get_handle (), ptr, len, (DWORD *) &ulen, 0); + BOOL res = mmReadFile (get_handle (), ptr, len, (DWORD *) &ulen, 0); if (read_state) { signal_read_state (1); @@ -261,19 +260,6 @@ retry: bytes_read = 0; break; } - if (try_noreserve) - { - try_noreserve = 0; - switch (mmap_is_attached_or_noreserve (ptr, len)) - { - case MMAP_NORESERVE_COMMITED: - goto retry; - case MMAP_RAISE_SIGBUS: - raise(SIGBUS); - case MMAP_NONE: - break; - } - } /*FALLTHRU*/ case ERROR_INVALID_FUNCTION: case ERROR_INVALID_PARAMETER: diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index 0fecdaaac..5feb9a69c 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -38,6 +38,7 @@ #include #include "cygtls.h" #include "cygwin/in6.h" +#include "mmap_helper.h" #define ASYNC_MASK (FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT) #define EVENT_MASK (FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE) @@ -1163,8 +1164,8 @@ fhandler_socket::recv_internal (WSABUF *wsabuf, DWORD wsacnt, DWORD flags, while (!(res = wait_for_events (evt_mask | FD_CLOSE)) || saw_shutdown_read ()) { - res = WSARecvFrom (get_socket (), wsabuf, wsacnt, &ret, - &flags, from, fromlen, NULL, NULL); + res = mmWSARecvFrom (get_socket (), wsabuf, wsacnt, &ret, + &flags, from, fromlen, NULL, NULL); if (!res || WSAGetLastError () != WSAEWOULDBLOCK) break; } diff --git a/winsup/cygwin/mmap_helper.h b/winsup/cygwin/mmap_helper.h new file mode 100644 index 000000000..23a03ff60 --- /dev/null +++ b/winsup/cygwin/mmap_helper.h @@ -0,0 +1,91 @@ +/* mmap_helper.h + + Copyright 2006 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. */ + +#ifndef _MMAP_HELPER_H +#define _MMAP_HELPER_H +#define _MMIOWRAP(__ptr, __len, __func) \ +({ \ + BOOL __res; \ + for (int __i = 0; __i < 2; __i++) \ + { \ + __res = __func; \ + if (__res || __i > 0) \ + break; \ + DWORD __errcode = GetLastError (); \ + if (__errcode != ERROR_NOACCESS) \ + break; \ + switch (mmap_is_attached_or_noreserve (__ptr, __len)) \ + { \ + case MMAP_NORESERVE_COMMITED: \ + continue; \ + case MMAP_RAISE_SIGBUS: \ + raise(SIGBUS); \ + default: \ + break; \ + } \ + break; \ + } \ + __res; \ +}) + +#define _MMSOCKWRAP(__ptr, __count, __func) \ +({ \ + int __res; \ + for (int __i = 0; __i < 2; __i++) \ + { \ + __res = __func; \ + if (!__res || __i > 0) \ + break; \ + DWORD __errcode = WSAGetLastError (); \ + if (__errcode != WSAEFAULT) \ + break; \ + for (unsigned __j = 0; __j < __count; __j++) \ + switch (mmap_is_attached_or_noreserve (__ptr[__j].buf, __ptr[__j].len)) \ + { \ + case MMAP_NORESERVE_COMMITED: \ + goto keeptrying; \ + case MMAP_RAISE_SIGBUS: \ + raise(SIGBUS); \ + default: \ + break; \ + } \ + break; \ + keeptrying: \ + continue; \ + } \ + __res; \ +}) + +extern inline BOOL +mmReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, + LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) +{ + return _MMIOWRAP (lpBuffer, nNumberOfBytesToRead, + (ReadFile (hFile, lpBuffer, nNumberOfBytesToRead, + lpNumberOfBytesRead, lpOverlapped))); +} + +#ifdef _WINSOCK_H +extern inline int +mmWSARecvFrom (SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, + LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, + struct sockaddr* lpFrom, + LPINT lpFromlen, LPWSAOVERLAPPED lpOverlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) +{ + return _MMSOCKWRAP (lpBuffers, dwBufferCount, + (mmWSARecvFrom(s, lpBuffers, dwBufferCount, + lpNumberOfBytesRecvd, lpFlags, lpFrom, + lpFromlen, lpOverlapped, + lpCompletionRoutine))); +} +#endif /*_WINSOCK_H*/ + +#endif /*_MMAP_HELPER_H*/ diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h index ff7037a65..175bbee85 100644 --- a/winsup/cygwin/winsup.h +++ b/winsup/cygwin/winsup.h @@ -19,6 +19,9 @@ details. */ # include "config.h" #endif +#undef DEBUGGING +#define DEBUGGING 1 /* CGF: FIXME: TEMPORARY */ + #define __INSIDE_CYGWIN__ #define strlen __builtin_strlen