summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog4
-rw-r--r--winsup/cygwin/fhandler.cc18
-rw-r--r--winsup/cygwin/fhandler_socket.cc5
-rw-r--r--winsup/cygwin/mmap_helper.h91
-rw-r--r--winsup/cygwin/winsup.h3
5 files changed, 103 insertions, 18 deletions
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 <cgf@timesys.com>
+
+ * winsup.h: Turn on DEBUGGING by default for now.
+
2006-08-10 Corinna Vinschen <corinna@vinschen.de>
* 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 <winioctl.h>
#include <ntdef.h>
#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 <sys/acl.h>
#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