~vadim-tk/percona-server/percona-5.5.15-galera

« back to all changes in this revision

Viewing changes to mysys/my_mmap.c

  • Committer: root
  • Date: 2011-09-10 16:37:18 UTC
  • Revision ID: root@r815.office.percona.com-20110910163718-ydh4zj8hcdgoyavb
Porting Galera to 5.5.15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
 
2
 
 
3
   This program is free software; you can redistribute it and/or modify
 
4
   it under the terms of the GNU General Public License as published by
 
5
   the Free Software Foundation; version 2 of the License.
 
6
 
 
7
   This program is distributed in the hope that it will be useful,
 
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
   GNU General Public License for more details.
 
11
 
 
12
   You should have received a copy of the GNU General Public License
 
13
   along with this program; if not, write to the Free Software
 
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA */
 
15
 
 
16
#include "mysys_priv.h"
 
17
 
 
18
#ifdef HAVE_SYS_MMAN_H
 
19
 
 
20
/*
 
21
  system msync() only syncs mmap'ed area to fs cache.
 
22
  fsync() is required to really sync to disc
 
23
*/
 
24
int my_msync(int fd, void *addr, size_t len, int flags)
 
25
{
 
26
  msync(addr, len, flags);
 
27
  return my_sync(fd, MYF(0));
 
28
}
 
29
 
 
30
#elif defined(_WIN32)
 
31
 
 
32
static SECURITY_ATTRIBUTES mmap_security_attributes=
 
33
  {sizeof(SECURITY_ATTRIBUTES), 0, TRUE};
 
34
 
 
35
void *my_mmap(void *addr, size_t len, int prot,
 
36
               int flags, File fd, my_off_t offset)
 
37
{
 
38
  HANDLE hFileMap;
 
39
  LPVOID ptr;
 
40
  HANDLE hFile= (HANDLE)my_get_osfhandle(fd);
 
41
  DBUG_ENTER("my_mmap");
 
42
  DBUG_PRINT("mysys", ("map fd: %d", fd));
 
43
 
 
44
  if (hFile == INVALID_HANDLE_VALUE)
 
45
    DBUG_RETURN(MAP_FAILED);
 
46
 
 
47
  hFileMap=CreateFileMapping(hFile, &mmap_security_attributes,
 
48
                             PAGE_READWRITE, 0, (DWORD) len, NULL);
 
49
  if (hFileMap == 0)
 
50
    DBUG_RETURN(MAP_FAILED);
 
51
 
 
52
  ptr=MapViewOfFile(hFileMap,
 
53
                    prot & PROT_WRITE ? FILE_MAP_WRITE : FILE_MAP_READ,
 
54
                    (DWORD)(offset >> 32), (DWORD)offset, len);
 
55
 
 
56
  /*
 
57
    MSDN explicitly states that it's possible to close File Mapping Object
 
58
    even when a view is not unmapped - then the object will be held open
 
59
    implicitly until unmap, as every view stores internally a handler of
 
60
    a corresponding File Mapping Object
 
61
   */
 
62
  CloseHandle(hFileMap);
 
63
 
 
64
  if (ptr)
 
65
  {
 
66
    DBUG_PRINT("mysys", ("mapped addr: %p", ptr));
 
67
    DBUG_RETURN(ptr);
 
68
  }
 
69
 
 
70
  DBUG_RETURN(MAP_FAILED);
 
71
}
 
72
 
 
73
int my_munmap(void *addr, size_t len)
 
74
{
 
75
  DBUG_ENTER("my_munmap");
 
76
  DBUG_PRINT("mysys", ("unmap addr: %p", addr));
 
77
  DBUG_RETURN(UnmapViewOfFile(addr) ? 0 : -1);
 
78
}
 
79
 
 
80
int my_msync(int fd, void *addr, size_t len, int flags)
 
81
{
 
82
  return FlushViewOfFile(addr, len) ? 0 : -1;
 
83
}
 
84
 
 
85
#else
 
86
#warning "no mmap!"
 
87
#endif
 
88