summaryrefslogtreecommitdiff
path: root/PACE/pace/win32/mman.c
blob: 7c08f8f6e0f2e4ff25fbf676d24e867f3abde9cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* $Id$

 * =============================================================================
 *
 * = LIBRARY
 *    pace
 *
 * = FILENAME
 *    pace/win32/mman.c
 *
 * = AUTHOR
 *    Luther Baker
 *
 * ============================================================================= */

#include "pace/sys/mman.h"

#if !defined (PACE_HAS_INLINE)
# include "pace/win32/mman.inl"
#endif /* ! PACE_HAS_INLINE */

#include <windows.h>
#include <stdio.h>

#if (PACE_HAS_POSIX_NONUOF_FUNCS)
void *
mmap (void * addr, size_t len, int prot, int flags,
      PACE_HANDLE fildes, pace_off_t off)
{
  void *addr_mapping = 0;
  int nt_flags = 0;
  PACE_HANDLE file_mapping = PACE_INVALID_HANDLE;

  if (PACE_BIT_ENABLED (flags, MAP_PRIVATE))
    {
      prot = PAGE_WRITECOPY;
      nt_flags = FILE_MAP_COPY;
    }
  else if (PACE_BIT_ENABLED (flags, MAP_SHARED))
    {
      if (PACE_BIT_ENABLED (prot, PAGE_READONLY))
        nt_flags = FILE_MAP_READ;
      if (PACE_BIT_ENABLED (prot, PAGE_READWRITE))
        nt_flags = FILE_MAP_WRITE;
    }

  file_mapping = CreateFileMapping (fildes,
                                    0,
                                    prot,
                                    0,
                                    0,
                                    0);
  if (file_mapping == 0)
    PACE_FAIL_RETURN (MAP_FAILED);

# if defined (PACE_OS_EXTRA_MMAP_FLAGS)
  nt_flags |= PACE_OS_EXTRA_MMAP_FLAGS;
# endif /* PACE_OS_EXTRA_MMAP_FLAGS */

# if !defined (PACE_HAS_WINCE)
  addr_mapping = MapViewOfFileEx (file_mapping,
                                  nt_flags,
                                  0,
                                  off,
                                  len,
                                  addr);
# else
  ACE_UNUSED_ARG (addr);        /* WinCE does not allow specifying <addr>.*/
  addr_mapping = MapViewOfFile (file_mapping,
                                nt_flags,
                                0,
                                off,
                                len);
# endif /* ! PACE_HAS_WINCE */

  /* Only close this down if we used the temporary. */
  if (file_mapping == PACE_INVALID_HANDLE)
    CloseHandle (file_mapping);

  if (addr_mapping == 0)
    PACE_FAIL_RETURN (MAP_FAILED);

  else if (PACE_BIT_ENABLED (flags, MAP_FIXED)
           && addr_mapping != addr)
    {
      errno = EINVAL;
      return MAP_FAILED;
    }
  else
    return addr_mapping;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */

#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
mprotect (void * addr, size_t len, int prot)
{
  DWORD dummy; /* Sigh! */
  return VirtualProtect(addr, len, prot, &dummy) ? 0 : -1;
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */

#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
msync (void * addr, size_t len, int flags)
{
  PACE_UNUSED_ARG (flags);
  PACE_WIN32CALL_RETURN
    (PACE_ADAPT_RETVAL
     (FlushViewOfFile (addr, len), pace_result_), int, -1);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */

#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
munmap (void * addr, size_t len)
{
  PACE_UNUSED_ARG (len);
  PACE_WIN32CALL_RETURN
    (PACE_ADAPT_RETVAL
     (UnmapViewOfFile (addr), pace_result_), int, -1);
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */