OSDN Git Service

* path.cc (conv_path_list): Take cygwin_conv_path_t as third parameter.
[pf3gnuchains/pf3gnuchains4x.git] / winsup / cygwin / mmap_helper.h
1 /* mmap_helper.h
2
3    Copyright 2006 Red Hat, Inc.
4
5 This file is part of Cygwin.
6
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
9 details. */
10
11 #ifndef _MMAP_HELPER_H
12 #define _MMAP_HELPER_H
13 #define _MMIOWRAP(__ptr, __len, __func) \
14 ({ \
15   BOOL __res; \
16   for (int __i = 0; __i < 2; __i++) \
17     { \
18       __res = __func; \
19       if (__res || __i > 0) \
20         break; \
21       DWORD __errcode = GetLastError (); \
22       if (__errcode != ERROR_NOACCESS) \
23         break; \
24       switch (mmap_is_attached_or_noreserve (__ptr, __len)) \
25         { \
26         case MMAP_NORESERVE_COMMITED: \
27           continue; \
28         case MMAP_RAISE_SIGBUS: \
29           raise(SIGBUS); \
30         default: \
31           break; \
32         } \
33       break; \
34     } \
35   __res; \
36 })
37
38 #define _MMSOCKWRAP(__ptr, __count, __func) \
39 ({ \
40   int __res; \
41   for (int __i = 0; __i < 2; __i++) \
42     { \
43       __res = __func; \
44       if (!__res || __i > 0) \
45         break; \
46       DWORD __errcode = WSAGetLastError (); \
47       if (__errcode != WSAEFAULT) \
48         break; \
49       for (unsigned __j = 0; __j < __count; __j++) \
50         switch (mmap_is_attached_or_noreserve (__ptr[__j].buf, __ptr[__j].len)) \
51           { \
52           case MMAP_NORESERVE_COMMITED: \
53             goto keeptrying; \
54           case MMAP_RAISE_SIGBUS: \
55             raise(SIGBUS); \
56           default: \
57             break; \
58           } \
59       break; \
60     keeptrying: \
61       continue; \
62     } \
63   __res; \
64 })
65
66 extern inline BOOL
67 mmReadFile (HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
68             LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
69 {
70   return _MMIOWRAP (lpBuffer, nNumberOfBytesToRead,
71                     (ReadFile (hFile, lpBuffer, nNumberOfBytesToRead,
72                                lpNumberOfBytesRead, lpOverlapped)));
73 }
74
75 #ifdef _WINSOCK_H
76 extern inline int
77 mmWSARecvFrom (SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
78             LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags,
79             struct sockaddr* lpFrom,
80             LPINT lpFromlen, LPWSAOVERLAPPED lpOverlapped,
81             LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
82 {
83   return _MMSOCKWRAP (lpBuffers, dwBufferCount,
84                       (mmWSARecvFrom(s, lpBuffers, dwBufferCount,
85                                      lpNumberOfBytesRecvd, lpFlags, lpFrom,
86                                      lpFromlen, lpOverlapped,
87                                      lpCompletionRoutine)));
88 }
89 #endif /*_WINSOCK_H*/
90
91 #endif /*_MMAP_HELPER_H*/