annotate Modules/mmapmodule.c @ 70817:dd775b1561ba

Fix markup.
author Georg Brandl <georg@python.org>
date Tue, 14 Jun 2011 21:09:55 +0200
parents 964d0d65a2a9
children 04182fa5255b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12146
e8c30e69666b Hacked for Win32 by Mark Hammond.
Guido van Rossum <guido@python.org>
parents: 12120
diff changeset
1 /*
e8c30e69666b Hacked for Win32 by Mark Hammond.
Guido van Rossum <guido@python.org>
parents: 12120
diff changeset
2 / Author: Sam Rushing <rushing@nightmare.com>
20888
2cd2ae4de30d Remove obsolete e-mail address
Andrew M. Kuchling <amk@amk.ca>
parents: 18626
diff changeset
3 / Hacked for Unix by AMK
12146
e8c30e69666b Hacked for Win32 by Mark Hammond.
Guido van Rossum <guido@python.org>
parents: 12120
diff changeset
4 / $Id$
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
5
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
6 / Modified to support mmap with offset - to map a 'window' of a file
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
7 / Author: Yotam Medini yotamm@mellanox.co.il
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
8 /
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
9 / mmapmodule.cpp -- map a view of a file into memory
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
10 /
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
11 / todo: need permission flags, perhaps a 'chsize' analog
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
12 / not all functions check range yet!!!
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
13 /
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
14 /
13758
bc37e6a335f2 More Windows changes.
Mark Hammond <mhammond@skippinet.com.au>
parents: 13757
diff changeset
15 / This version of mmapmodule.c has been changed significantly
bc37e6a335f2 More Windows changes.
Mark Hammond <mhammond@skippinet.com.au>
parents: 13757
diff changeset
16 / from the original mmapfile.c on which it was based.
bc37e6a335f2 More Windows changes.
Mark Hammond <mhammond@skippinet.com.au>
parents: 13757
diff changeset
17 / The original version of mmapfile is maintained by Sam at
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
18 / ftp://squirl.nightmare.com/pub/python/python-ext.
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
19 */
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
20
36541
f7f0d2a5b20b Remove size restrictions.
Martin v. Löwis <martin@v.loewis.de>
parents: 36540
diff changeset
21 #define PY_SSIZE_T_CLEAN
12146
e8c30e69666b Hacked for Win32 by Mark Hammond.
Guido van Rossum <guido@python.org>
parents: 12120
diff changeset
22 #include <Python.h>
e8c30e69666b Hacked for Win32 by Mark Hammond.
Guido van Rossum <guido@python.org>
parents: 12120
diff changeset
23
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
24 #ifndef MS_WINDOWS
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
25 #define UNIX
69753
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
26 # ifdef __APPLE__
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
27 # include <fcntl.h>
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
28 # endif
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
29 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
30
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
31 #ifdef MS_WINDOWS
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
32 #include <windows.h>
14956
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
33 static int
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
34 my_getpagesize(void)
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
35 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
36 SYSTEM_INFO si;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
37 GetSystemInfo(&si);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
38 return si.dwPageSize;
14956
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
39 }
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
40
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
41 static int
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
42 my_getallocationgranularity (void)
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
43 {
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
44
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
45 SYSTEM_INFO si;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
46 GetSystemInfo(&si);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
47 return si.dwAllocationGranularity;
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
48 }
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
49
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
50 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
51
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
52 #ifdef UNIX
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
53 #include <sys/mman.h>
12941
8c9554edbebb Fix the size() method to return the size of the file on Unix, not the
Andrew M. Kuchling <amk@amk.ca>
parents: 12846
diff changeset
54 #include <sys/stat.h>
14836
67e0ff4aa7b9 For the benefit of SunOS 4.1.4, define MS_SYNC as 0 when it's
Guido van Rossum <guido@python.org>
parents: 13758
diff changeset
55
14956
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
56 #if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
57 static int
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
58 my_getpagesize(void)
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
59 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
60 return sysconf(_SC_PAGESIZE);
14956
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
61 }
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
62
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
63 #define my_getallocationgranularity my_getpagesize
14956
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
64 #else
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
65 #define my_getpagesize getpagesize
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
66 #endif
c78e76a571b6 my_getpagesize(): New function; returns the size of a page of memory.
Fred Drake <fdrake@acm.org>
parents: 14836
diff changeset
67
14836
67e0ff4aa7b9 For the benefit of SunOS 4.1.4, define MS_SYNC as 0 when it's
Guido van Rossum <guido@python.org>
parents: 13758
diff changeset
68 #endif /* UNIX */
67e0ff4aa7b9 For the benefit of SunOS 4.1.4, define MS_SYNC as 0 when it's
Guido van Rossum <guido@python.org>
parents: 13758
diff changeset
69
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
70 #include <string.h>
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39222
diff changeset
71
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39222
diff changeset
72 #ifdef HAVE_SYS_TYPES_H
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
73 #include <sys/types.h>
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 39222
diff changeset
74 #endif /* HAVE_SYS_TYPES_H */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
75
36515
7c9cfd3b5d0f Update comment and make accurate.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36501
diff changeset
76 /* Prefer MAP_ANONYMOUS since MAP_ANON is deprecated according to man page. */
36446
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
77 #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
78 # define MAP_ANONYMOUS MAP_ANON
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
79 #endif
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
80
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
81 static PyObject *mmap_module_error;
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
82
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
83 typedef enum
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
84 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
85 ACCESS_DEFAULT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
86 ACCESS_READ,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
87 ACCESS_WRITE,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
88 ACCESS_COPY
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
89 } access_mode;
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
90
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
91 typedef struct {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
92 PyObject_HEAD
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
93 char * data;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
94 size_t size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
95 size_t pos; /* relative to offset */
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
96 #ifdef MS_WINDOWS
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
97 PY_LONG_LONG offset;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
98 #else
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
99 off_t offset;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
100 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
101 int exports;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
102
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
103 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
104 HANDLE map_handle;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
105 HANDLE file_handle;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
106 char * tagname;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
107 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
108
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
109 #ifdef UNIX
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
110 int fd;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
111 #endif
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
112
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
113 access_mode access;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
114 } mmap_object;
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
115
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
116
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
117 static void
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
118 mmap_object_dealloc(mmap_object *m_obj)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
119 {
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
120 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
121 if (m_obj->data != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
122 UnmapViewOfFile (m_obj->data);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
123 if (m_obj->map_handle != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
124 CloseHandle (m_obj->map_handle);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
125 if (m_obj->file_handle != INVALID_HANDLE_VALUE)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
126 CloseHandle (m_obj->file_handle);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
127 if (m_obj->tagname)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
128 PyMem_Free(m_obj->tagname);
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
129 #endif /* MS_WINDOWS */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
130
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
131 #ifdef UNIX
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
132 if (m_obj->fd >= 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
133 (void) close(m_obj->fd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
134 if (m_obj->data!=NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
135 munmap(m_obj->data, m_obj->size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
136 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
137 #endif /* UNIX */
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
138
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
139 Py_TYPE(m_obj)->tp_free((PyObject*)m_obj);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
140 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
141
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
142 static PyObject *
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
143 mmap_close_method(mmap_object *self, PyObject *unused)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
144 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
145 if (self->exports > 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
146 PyErr_SetString(PyExc_BufferError, "cannot close "\
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
147 "exported pointers exist");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
148 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
149 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
150 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
151 /* For each resource we maintain, we need to check
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
152 the value is valid, and if so, free the resource
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
153 and set the member value to an invalid value so
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
154 the dealloc does not attempt to resource clearing
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
155 again.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
156 TODO - should we check for errors in the close operations???
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
157 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
158 if (self->data != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
159 UnmapViewOfFile(self->data);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
160 self->data = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
161 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
162 if (self->map_handle != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
163 CloseHandle(self->map_handle);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
164 self->map_handle = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
165 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
166 if (self->file_handle != INVALID_HANDLE_VALUE) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
167 CloseHandle(self->file_handle);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
168 self->file_handle = INVALID_HANDLE_VALUE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
169 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
170 #endif /* MS_WINDOWS */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
171
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
172 #ifdef UNIX
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
173 if (0 <= self->fd)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
174 (void) close(self->fd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
175 self->fd = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
176 if (self->data != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
177 munmap(self->data, self->size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
178 self->data = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
179 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
180 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
181
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
182 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
183 return Py_None;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
184 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
185
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
186 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
187 #define CHECK_VALID(err) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
188 do { \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
189 if (self->map_handle == NULL) { \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
190 PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
191 return err; \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
192 } \
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
193 } while (0)
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
194 #endif /* MS_WINDOWS */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
195
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
196 #ifdef UNIX
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
197 #define CHECK_VALID(err) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
198 do { \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
199 if (self->data == NULL) { \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
200 PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
201 return err; \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
202 } \
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
203 } while (0)
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
204 #endif /* UNIX */
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
205
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
206 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
207 mmap_read_byte_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
208 PyObject *unused)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
209 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
210 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
211 if (self->pos < self->size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
212 char value = self->data[self->pos];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
213 self->pos += 1;
65932
1e4d46a61fbe Merged revisions 86159 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 64047
diff changeset
214 return Py_BuildValue("B", (unsigned char)value);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
215 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
216 PyErr_SetString(PyExc_ValueError, "read byte out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
217 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
218 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
219 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
220
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
221 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
222 mmap_read_line_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
223 PyObject *unused)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
224 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
225 char *start = self->data+self->pos;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
226 char *eof = self->data+self->size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
227 char *eol;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
228 PyObject *result;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
229
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
230 CHECK_VALID(NULL);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
231
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
232 eol = memchr(start, '\n', self->size - self->pos);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
233 if (!eol)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
234 eol = eof;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
235 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
236 ++eol; /* we're interested in the position after the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
237 newline. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
238 result = PyBytes_FromStringAndSize(start, (eol - start));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
239 self->pos += (eol - start);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
240 return result;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
241 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
242
70712
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
243 /* Basically the "n" format code with the ability to turn None into -1. */
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
244 static int
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
245 mmap_convert_ssize_t(PyObject *obj, void *result) {
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
246 Py_ssize_t limit;
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
247 if (obj == Py_None) {
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
248 limit = -1;
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
249 }
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
250 else if (PyNumber_Check(obj)) {
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
251 limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
252 if (limit == -1 && PyErr_Occurred())
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
253 return 0;
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
254 }
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
255 else {
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
256 PyErr_Format(PyExc_TypeError,
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
257 "integer argument expected, got '%.200s'",
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
258 Py_TYPE(obj)->tp_name);
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
259 return 0;
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
260 }
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
261 *((Py_ssize_t *)result) = limit;
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
262 return 1;
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
263 }
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
264
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
265 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
266 mmap_read_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
267 PyObject *args)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
268 {
70712
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
269 Py_ssize_t num_bytes = -1, n;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
270 PyObject *result;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
271
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
272 CHECK_VALID(NULL);
70712
964d0d65a2a9 Issue #12021: Make mmap's read() method argument optional. Patch by Petri
Charles-François Natali <neologix@free.fr>
parents: 70696
diff changeset
273 if (!PyArg_ParseTuple(args, "|O&:read", mmap_convert_ssize_t, &num_bytes))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
274 return(NULL);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
275
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
276 /* silently 'adjust' out-of-range requests */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
277 assert(self->size >= self->pos);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
278 n = self->size - self->pos;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
279 /* The difference can overflow, only if self->size is greater than
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
280 * PY_SSIZE_T_MAX. But then the operation cannot possibly succeed,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
281 * because the mapped area and the returned string each need more
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
282 * than half of the addressable memory. So we clip the size, and let
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
283 * the code below raise MemoryError.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
284 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
285 if (n < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
286 n = PY_SSIZE_T_MAX;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
287 if (num_bytes < 0 || num_bytes > n) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
288 num_bytes = n;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
289 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
290 result = PyBytes_FromStringAndSize(self->data+self->pos, num_bytes);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
291 self->pos += num_bytes;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
292 return result;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
293 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
294
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
295 static PyObject *
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
296 mmap_gfind(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
297 PyObject *args,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
298 int reverse)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
299 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
300 Py_ssize_t start = self->pos;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
301 Py_ssize_t end = self->size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
302 const char *needle;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
303 Py_ssize_t len;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
304
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
305 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
306 if (!PyArg_ParseTuple(args, reverse ? "y#|nn:rfind" : "y#|nn:find",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
307 &needle, &len, &start, &end)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
308 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
309 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
310 const char *p, *start_p, *end_p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
311 int sign = reverse ? -1 : 1;
17821
780248cd1d9a Fix the .find() method for memory maps.
Greg Stein <gstein@lyra.org>
parents: 17735
diff changeset
312
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
313 if (start < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
314 start += self->size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
315 if (start < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
316 start = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
317 else if ((size_t)start > self->size)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
318 start = self->size;
17821
780248cd1d9a Fix the .find() method for memory maps.
Greg Stein <gstein@lyra.org>
parents: 17735
diff changeset
319
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
320 if (end < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
321 end += self->size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
322 if (end < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
323 end = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
324 else if ((size_t)end > self->size)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
325 end = self->size;
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
326
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
327 start_p = self->data + start;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
328 end_p = self->data + end;
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
329
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
330 for (p = (reverse ? end_p - len : start_p);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
331 (p >= start_p) && (p + len <= end_p); p += sign) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
332 Py_ssize_t i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
333 for (i = 0; i < len && needle[i] == p[i]; ++i)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
334 /* nothing */;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
335 if (i == len) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
336 return PyLong_FromSsize_t(p - self->data);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
337 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
338 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
339 return PyLong_FromLong(-1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
340 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
341 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
342
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
343 static PyObject *
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
344 mmap_find_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
345 PyObject *args)
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
346 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
347 return mmap_gfind(self, args, 0);
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
348 }
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
349
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
350 static PyObject *
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
351 mmap_rfind_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
352 PyObject *args)
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
353 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
354 return mmap_gfind(self, args, 1);
44782
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
355 }
ca2683a67943 Merged revisions 60080-60089,60091-60093 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44643
diff changeset
356
36537
fdabdf148336 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 36536
diff changeset
357 static int
43384
4e57c36f6d2e Fixing the spelling of "writeable" to "writable", particularly PyBUF_WRITEABLE.
Sean Reifscheider <jafo@tummy.com>
parents: 43100
diff changeset
358 is_writable(mmap_object *self)
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
359 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
360 if (self->access != ACCESS_READ)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
361 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
362 PyErr_Format(PyExc_TypeError, "mmap can't modify a readonly memory map.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
363 return 0;
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
364 }
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
365
36537
fdabdf148336 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 36536
diff changeset
366 static int
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
367 is_resizeable(mmap_object *self)
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
368 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
369 if (self->exports > 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
370 PyErr_SetString(PyExc_BufferError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
371 "mmap can't resize with extant buffers exported.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
372 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
373 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
374 if ((self->access == ACCESS_WRITE) || (self->access == ACCESS_DEFAULT))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
375 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
376 PyErr_Format(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
377 "mmap can't resize a readonly or copy-on-write memory map.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
378 return 0;
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
379 }
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
380
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
381
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
382 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
383 mmap_write_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
384 PyObject *args)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
385 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
386 Py_ssize_t length;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
387 char *data;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
388
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
389 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
390 if (!PyArg_ParseTuple(args, "y#:write", &data, &length))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
391 return(NULL);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
392
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
393 if (!is_writable(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
394 return NULL;
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
395
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
396 if ((self->pos + length) > self->size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
397 PyErr_SetString(PyExc_ValueError, "data out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
398 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
399 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
400 memcpy(self->data+self->pos, data, length);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
401 self->pos = self->pos+length;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
402 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
403 return Py_None;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
404 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
405
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
406 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
407 mmap_write_byte_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
408 PyObject *args)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
409 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
410 char value;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
411
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
412 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
413 if (!PyArg_ParseTuple(args, "b:write_byte", &value))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
414 return(NULL);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
415
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
416 if (!is_writable(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
417 return NULL;
51910
759dbace51d2 Merged revisions 70053 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 51706
diff changeset
418
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
419 if (self->pos < self->size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
420 *(self->data+self->pos) = value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
421 self->pos += 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
422 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
423 return Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
424 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
425 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
426 PyErr_SetString(PyExc_ValueError, "write byte out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
427 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
428 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
429 }
36537
fdabdf148336 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 36536
diff changeset
430
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
431 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
432 mmap_size_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
433 PyObject *unused)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
434 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
435 CHECK_VALID(NULL);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
436
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
437 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
438 if (self->file_handle != INVALID_HANDLE_VALUE) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
439 DWORD low,high;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
440 PY_LONG_LONG size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
441 low = GetFileSize(self->file_handle, &high);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
442 if (low == INVALID_FILE_SIZE) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
443 /* It might be that the function appears to have failed,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
444 when indeed its size equals INVALID_FILE_SIZE */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
445 DWORD error = GetLastError();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
446 if (error != NO_ERROR)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
447 return PyErr_SetFromWindowsErr(error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
448 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
449 if (!high && low < LONG_MAX)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
450 return PyLong_FromLong((long)low);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
451 size = (((PY_LONG_LONG)high)<<32) + low;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
452 return PyLong_FromLongLong(size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
453 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
454 return PyLong_FromSsize_t(self->size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
455 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
456 #endif /* MS_WINDOWS */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
457
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
458 #ifdef UNIX
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
459 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
460 struct stat buf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
461 if (-1 == fstat(self->fd, &buf)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
462 PyErr_SetFromErrno(mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
463 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
464 }
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
465 #ifdef HAVE_LARGEFILE_SUPPORT
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
466 return PyLong_FromLongLong(buf.st_size);
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
467 #else
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
468 return PyLong_FromLong(buf.st_size);
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
469 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
470 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
471 #endif /* UNIX */
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
472 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
473
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
474 /* This assumes that you want the entire file mapped,
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
475 / and when recreating the map will make the new file
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
476 / have the new size
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
477 /
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
478 / Is this really necessary? This could easily be done
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
479 / from python by just closing and re-opening with the
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
480 / new size?
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
481 */
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
482
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
483 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
484 mmap_resize_method(mmap_object *self,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
485 PyObject *args)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
486 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
487 Py_ssize_t new_size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
488 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
489 if (!PyArg_ParseTuple(args, "n:resize", &new_size) ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
490 !is_resizeable(self)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
491 return NULL;
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
492 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
493 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
494 DWORD dwErrCode = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
495 DWORD off_hi, off_lo, newSizeLow, newSizeHigh;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
496 /* First, unmap the file view */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
497 UnmapViewOfFile(self->data);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
498 self->data = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
499 /* Close the mapping object */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
500 CloseHandle(self->map_handle);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
501 self->map_handle = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
502 /* Move to the desired EOF position */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
503 newSizeHigh = (DWORD)((self->offset + new_size) >> 32);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
504 newSizeLow = (DWORD)((self->offset + new_size) & 0xFFFFFFFF);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
505 off_hi = (DWORD)(self->offset >> 32);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
506 off_lo = (DWORD)(self->offset & 0xFFFFFFFF);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
507 SetFilePointer(self->file_handle,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
508 newSizeLow, &newSizeHigh, FILE_BEGIN);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
509 /* Change the size of the file */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
510 SetEndOfFile(self->file_handle);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
511 /* Create another mapping object and remap the file view */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
512 self->map_handle = CreateFileMapping(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
513 self->file_handle,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
514 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
515 PAGE_READWRITE,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
516 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
517 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
518 self->tagname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
519 if (self->map_handle != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
520 self->data = (char *) MapViewOfFile(self->map_handle,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
521 FILE_MAP_WRITE,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
522 off_hi,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
523 off_lo,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
524 new_size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
525 if (self->data != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
526 self->size = new_size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
527 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
528 return Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
529 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
530 dwErrCode = GetLastError();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
531 CloseHandle(self->map_handle);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
532 self->map_handle = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
533 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
534 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
535 dwErrCode = GetLastError();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
536 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
537 PyErr_SetFromWindowsErr(dwErrCode);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
538 return NULL;
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
539 #endif /* MS_WINDOWS */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
540
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
541 #ifdef UNIX
36537
fdabdf148336 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 36536
diff changeset
542 #ifndef HAVE_MREMAP
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
543 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
544 PyErr_SetString(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
545 "mmap: resizing not available--no mremap()");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
546 return NULL;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
547 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
548 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
549 void *newmap;
35612
35a99eccaca6 C89 compliance.
Armin Rigo <arigo@tunes.org>
parents: 35408
diff changeset
550
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
551 if (ftruncate(self->fd, self->offset + new_size) == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
552 PyErr_SetFromErrno(mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
553 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
554 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
555
12948
acb0261b6942 Support resizing the mapping depending on whether HAVE_MREMAP is defined
Andrew M. Kuchling <amk@amk.ca>
parents: 12945
diff changeset
556 #ifdef MREMAP_MAYMOVE
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
557 newmap = mremap(self->data, self->size, new_size, MREMAP_MAYMOVE);
12948
acb0261b6942 Support resizing the mapping depending on whether HAVE_MREMAP is defined
Andrew M. Kuchling <amk@amk.ca>
parents: 12945
diff changeset
558 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
559 #if defined(__NetBSD__)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
560 newmap = mremap(self->data, self->size, self->data, new_size, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
561 #else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
562 newmap = mremap(self->data, self->size, new_size, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
563 #endif /* __NetBSD__ */
12948
acb0261b6942 Support resizing the mapping depending on whether HAVE_MREMAP is defined
Andrew M. Kuchling <amk@amk.ca>
parents: 12945
diff changeset
564 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
565 if (newmap == (void *)-1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
566 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
567 PyErr_SetFromErrno(mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
568 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
569 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
570 self->data = newmap;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
571 self->size = new_size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
572 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
573 return Py_None;
12948
acb0261b6942 Support resizing the mapping depending on whether HAVE_MREMAP is defined
Andrew M. Kuchling <amk@amk.ca>
parents: 12945
diff changeset
574 #endif /* HAVE_MREMAP */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
575 #endif /* UNIX */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
576 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
577 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
578
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
579 static PyObject *
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
580 mmap_tell_method(mmap_object *self, PyObject *unused)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
581 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
582 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
583 return PyLong_FromSize_t(self->pos);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
584 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
585
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
586 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
587 mmap_flush_method(mmap_object *self, PyObject *args)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
588 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
589 Py_ssize_t offset = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
590 Py_ssize_t size = self->size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
591 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
592 if (!PyArg_ParseTuple(args, "|nn:flush", &offset, &size))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
593 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
594 if ((size_t)(offset + size) > self->size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
595 PyErr_SetString(PyExc_ValueError, "flush values out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
596 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
597 }
66825
7253be96a19e Merged revisions 85678 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 65932
diff changeset
598
7253be96a19e Merged revisions 85678 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 65932
diff changeset
599 if (self->access == ACCESS_READ || self->access == ACCESS_COPY)
7253be96a19e Merged revisions 85678 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 65932
diff changeset
600 return PyLong_FromLong(0);
7253be96a19e Merged revisions 85678 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 65932
diff changeset
601
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
602 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
603 return PyLong_FromLong((long) FlushViewOfFile(self->data+offset, size));
44999
7c02182e2979 Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
604 #elif defined(UNIX)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
605 /* XXX semantics of return value? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
606 /* XXX flags for msync? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
607 if (-1 == msync(self->data + offset, size, MS_SYNC)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
608 PyErr_SetFromErrno(mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
609 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
610 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
611 return PyLong_FromLong(0);
44999
7c02182e2979 Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
612 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
613 PyErr_SetString(PyExc_ValueError, "flush not supported on this system");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
614 return NULL;
44999
7c02182e2979 Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44885
diff changeset
615 #endif
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
616 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
617
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
618 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
619 mmap_seek_method(mmap_object *self, PyObject *args)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
620 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
621 Py_ssize_t dist;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
622 int how=0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
623 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
624 if (!PyArg_ParseTuple(args, "n|i:seek", &dist, &how))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
625 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
626 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
627 size_t where;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
628 switch (how) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
629 case 0: /* relative to start */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
630 if (dist < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
631 goto onoutofrange;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
632 where = dist;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
633 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
634 case 1: /* relative to current position */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
635 if ((Py_ssize_t)self->pos + dist < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
636 goto onoutofrange;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
637 where = self->pos + dist;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
638 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
639 case 2: /* relative to end */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
640 if ((Py_ssize_t)self->size + dist < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
641 goto onoutofrange;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
642 where = self->size + dist;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
643 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
644 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
645 PyErr_SetString(PyExc_ValueError, "unknown seek type");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
646 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
647 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
648 if (where > self->size)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
649 goto onoutofrange;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
650 self->pos = where;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
651 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
652 return Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
653 }
12945
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
654
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
655 onoutofrange:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
656 PyErr_SetString(PyExc_ValueError, "seek out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
657 return NULL;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
658 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
659
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
660 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
661 mmap_move_method(mmap_object *self, PyObject *args)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
662 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
663 unsigned long dest, src, cnt;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
664 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
665 if (!PyArg_ParseTuple(args, "kkk:move", &dest, &src, &cnt) ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
666 !is_writable(self)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
667 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
668 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
669 /* bounds check the values */
70696
9ef14857e49c Checking if an unsigned long is < 0 is pointless.
Brett Cannon <brett@python.org>
parents: 69754
diff changeset
670 if ((cnt + dest) < cnt || (cnt + src) < cnt ||
9ef14857e49c Checking if an unsigned long is < 0 is pointless.
Brett Cannon <brett@python.org>
parents: 69754
diff changeset
671 src > self->size || (src + cnt) > self->size ||
9ef14857e49c Checking if an unsigned long is < 0 is pointless.
Brett Cannon <brett@python.org>
parents: 69754
diff changeset
672 dest > self->size || (dest + cnt) > self->size) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
673 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
674 "source, destination, or count out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
675 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
676 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
677 memmove(self->data+dest, self->data+src, cnt);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
678 Py_INCREF(Py_None);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
679 return Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
680 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
681 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
682
63422
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
683 static PyObject *
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
684 mmap_closed_get(mmap_object *self)
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
685 {
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
686 #ifdef MS_WINDOWS
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
687 return PyBool_FromLong(self->map_handle == NULL ? 1 : 0);
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
688 #elif defined(UNIX)
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
689 return PyBool_FromLong(self->data == NULL ? 1 : 0);
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
690 #endif
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
691 }
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
692
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
693 static PyObject *
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
694 mmap__enter__method(mmap_object *self, PyObject *args)
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
695 {
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
696 CHECK_VALID(NULL);
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
697
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
698 Py_INCREF(self);
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
699 return (PyObject *)self;
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
700 }
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
701
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
702 static PyObject *
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
703 mmap__exit__method(PyObject *self, PyObject *args)
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
704 {
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
705 return PyObject_CallMethod(self, "close", NULL);
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
706 }
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
707
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
708 static struct PyMethodDef mmap_object_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
709 {"close", (PyCFunction) mmap_close_method, METH_NOARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
710 {"find", (PyCFunction) mmap_find_method, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
711 {"rfind", (PyCFunction) mmap_rfind_method, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
712 {"flush", (PyCFunction) mmap_flush_method, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
713 {"move", (PyCFunction) mmap_move_method, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
714 {"read", (PyCFunction) mmap_read_method, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
715 {"read_byte", (PyCFunction) mmap_read_byte_method, METH_NOARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
716 {"readline", (PyCFunction) mmap_read_line_method, METH_NOARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
717 {"resize", (PyCFunction) mmap_resize_method, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
718 {"seek", (PyCFunction) mmap_seek_method, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
719 {"size", (PyCFunction) mmap_size_method, METH_NOARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
720 {"tell", (PyCFunction) mmap_tell_method, METH_NOARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
721 {"write", (PyCFunction) mmap_write_method, METH_VARARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
722 {"write_byte", (PyCFunction) mmap_write_byte_method, METH_VARARGS},
63422
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
723 {"__enter__", (PyCFunction) mmap__enter__method, METH_NOARGS},
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
724 {"__exit__", (PyCFunction) mmap__exit__method, METH_VARARGS},
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
725 {NULL, NULL} /* sentinel */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
726 };
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
727
63422
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
728 static PyGetSetDef mmap_object_getset[] = {
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
729 {"closed", (getter) mmap_closed_get, NULL, NULL},
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
730 {NULL}
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
731 };
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
732
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
733
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
734 /* Functions for treating an mmap'ed file as a buffer */
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
735
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42560
diff changeset
736 static int
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
737 mmap_buffer_getbuf(mmap_object *self, Py_buffer *view, int flags)
36537
fdabdf148336 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 36536
diff changeset
738 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
739 CHECK_VALID(-1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
740 if (PyBuffer_FillInfo(view, (PyObject*)self, self->data, self->size,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
741 (self->access == ACCESS_READ), flags) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
742 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
743 self->exports++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
744 return 0;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
745 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
746
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents: 42560
diff changeset
747 static void
43423
0476a2cc5658 Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex. Add some more functionality to the memoryview object.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43384
diff changeset
748 mmap_buffer_releasebuf(mmap_object *self, Py_buffer *view)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
749 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
750 self->exports--;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
751 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
752
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36446
diff changeset
753 static Py_ssize_t
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
754 mmap_length(mmap_object *self)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
755 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
756 CHECK_VALID(-1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
757 return self->size;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
758 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
759
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
760 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36446
diff changeset
761 mmap_item(mmap_object *self, Py_ssize_t i)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
762 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
763 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
764 if (i < 0 || (size_t)i >= self->size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
765 PyErr_SetString(PyExc_IndexError, "mmap index out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
766 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
767 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
768 return PyBytes_FromStringAndSize(self->data + i, 1);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
769 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
770
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
771 static PyObject *
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
772 mmap_subscript(mmap_object *self, PyObject *item)
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
773 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
774 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
775 if (PyIndex_Check(item)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
776 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
777 if (i == -1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
778 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
779 if (i < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
780 i += self->size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
781 if (i < 0 || (size_t)i >= self->size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
782 PyErr_SetString(PyExc_IndexError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
783 "mmap index out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
784 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
785 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
786 return PyLong_FromLong(Py_CHARMASK(self->data[i]));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
787 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
788 else if (PySlice_Check(item)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
789 Py_ssize_t start, stop, step, slicelen;
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
790
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65931
diff changeset
791 if (PySlice_GetIndicesEx(item, self->size,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
792 &start, &stop, &step, &slicelen) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
793 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
794 }
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
795
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
796 if (slicelen <= 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
797 return PyBytes_FromStringAndSize("", 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
798 else if (step == 1)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
799 return PyBytes_FromStringAndSize(self->data + start,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
800 slicelen);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
801 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
802 char *result_buf = (char *)PyMem_Malloc(slicelen);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
803 Py_ssize_t cur, i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
804 PyObject *result;
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
805
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
806 if (result_buf == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
807 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
808 for (cur = start, i = 0; i < slicelen;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
809 cur += step, i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
810 result_buf[i] = self->data[cur];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
811 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
812 result = PyBytes_FromStringAndSize(result_buf,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
813 slicelen);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
814 PyMem_Free(result_buf);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
815 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
816 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
817 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
818 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
819 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
820 "mmap indices must be integers");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
821 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
822 }
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
823 }
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
824
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
825 static PyObject *
13441
5edee6878943 -- ANSI-fying, names
Fredrik Lundh <fredrik@pythonware.com>
parents: 13359
diff changeset
826 mmap_concat(mmap_object *self, PyObject *bb)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
827 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
828 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
829 PyErr_SetString(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
830 "mmaps don't support concatenation");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
831 return NULL;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
832 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
833
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
834 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36446
diff changeset
835 mmap_repeat(mmap_object *self, Py_ssize_t n)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
836 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
837 CHECK_VALID(NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
838 PyErr_SetString(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
839 "mmaps don't support repeat operation");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
840 return NULL;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
841 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
842
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
843 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36446
diff changeset
844 mmap_ass_item(mmap_object *self, Py_ssize_t i, PyObject *v)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
845 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
846 const char *buf;
36537
fdabdf148336 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 36536
diff changeset
847
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
848 CHECK_VALID(-1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
849 if (i < 0 || (size_t)i >= self->size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
850 PyErr_SetString(PyExc_IndexError, "mmap index out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
851 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
852 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
853 if (v == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
854 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
855 "mmap object doesn't support item deletion");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
856 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
857 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
858 if (! (PyBytes_Check(v) && PyBytes_Size(v)==1) ) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
859 PyErr_SetString(PyExc_IndexError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
860 "mmap assignment must be length-1 bytes()");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
861 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
862 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
863 if (!is_writable(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
864 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
865 buf = PyBytes_AsString(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
866 self->data[i] = buf[0];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
867 return 0;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
868 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
869
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
870 static int
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
871 mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
872 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
873 CHECK_VALID(-1);
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
874
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
875 if (!is_writable(self))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
876 return -1;
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
877
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
878 if (PyIndex_Check(item)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
879 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
880 Py_ssize_t v;
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
881
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
882 if (i == -1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
883 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
884 if (i < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
885 i += self->size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
886 if (i < 0 || (size_t)i >= self->size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
887 PyErr_SetString(PyExc_IndexError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
888 "mmap index out of range");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
889 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
890 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
891 if (value == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
892 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
893 "mmap doesn't support item deletion");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
894 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
895 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
896 if (!PyIndex_Check(value)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
897 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
898 "mmap item value must be an int");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
899 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
900 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
901 v = PyNumber_AsSsize_t(value, PyExc_TypeError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
902 if (v == -1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
903 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
904 if (v < 0 || v > 255) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
905 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
906 "mmap item value must be "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
907 "in range(0, 256)");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
908 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
909 }
64047
79d572ea17df Merged revisions 84076 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63425
diff changeset
910 self->data[i] = (char) v;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
911 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
912 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
913 else if (PySlice_Check(item)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
914 Py_ssize_t start, stop, step, slicelen;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
915 Py_buffer vbuf;
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
916
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65931
diff changeset
917 if (PySlice_GetIndicesEx(item,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
918 self->size, &start, &stop,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
919 &step, &slicelen) < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
920 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
921 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
922 if (value == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
923 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
924 "mmap object doesn't support slice deletion");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
925 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
926 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
927 if (PyObject_GetBuffer(value, &vbuf, PyBUF_SIMPLE) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
928 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
929 if (vbuf.len != slicelen) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
930 PyErr_SetString(PyExc_IndexError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
931 "mmap slice assignment is wrong size");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
932 PyBuffer_Release(&vbuf);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
933 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
934 }
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
935
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
936 if (slicelen == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
937 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
938 else if (step == 1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
939 memcpy(self->data + start, vbuf.buf, slicelen);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
940 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
941 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
942 Py_ssize_t cur, i;
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
943
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
944 for (cur = start, i = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
945 i < slicelen;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
946 cur += step, i++)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
947 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
948 self->data[cur] = ((char *)vbuf.buf)[i];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
949 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
950 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
951 PyBuffer_Release(&vbuf);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
952 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
953 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
954 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
955 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
956 "mmap indices must be integer");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
957 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
958 }
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
959 }
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
960
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
961 static PySequenceMethods mmap_as_sequence = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
962 (lenfunc)mmap_length, /*sq_length*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
963 (binaryfunc)mmap_concat, /*sq_concat*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
964 (ssizeargfunc)mmap_repeat, /*sq_repeat*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
965 (ssizeargfunc)mmap_item, /*sq_item*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
966 0, /*sq_slice*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
967 (ssizeobjargproc)mmap_ass_item, /*sq_ass_item*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
968 0, /*sq_ass_slice*/
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
969 };
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
970
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
971 static PyMappingMethods mmap_as_mapping = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
972 (lenfunc)mmap_length,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
973 (binaryfunc)mmap_subscript,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
974 (objobjargproc)mmap_ass_subscript,
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
975 };
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42665
diff changeset
976
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
977 static PyBufferProcs mmap_as_buffer = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
978 (getbufferproc)mmap_buffer_getbuf,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
979 (releasebufferproc)mmap_buffer_releasebuf,
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
980 };
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
981
44859
feba5d5cac22 Merged revisions 60151-60159,60161-60168,60170,60172-60173,60175 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44834
diff changeset
982 static PyObject *
feba5d5cac22 Merged revisions 60151-60159,60161-60168,60170,60172-60173,60175 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44834
diff changeset
983 new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict);
feba5d5cac22 Merged revisions 60151-60159,60161-60168,60170,60172-60173,60175 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44834
diff changeset
984
44834
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
985 PyDoc_STRVAR(mmap_doc,
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
986 "Windows: mmap(fileno, length[, tagname[, access[, offset]]])\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
987 \n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
988 Maps length bytes from the file specified by the file handle fileno,\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
989 and returns a mmap object. If length is larger than the current size\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
990 of the file, the file is extended to contain length bytes. If length\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
991 is 0, the maximum length of the map is the current size of the file,\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
992 except that if the file is empty Windows raises an exception (you cannot\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
993 create an empty mapping on Windows).\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
994 \n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
995 Unix: mmap(fileno, length[, flags[, prot[, access[, offset]]]])\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
996 \n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
997 Maps length bytes from the file specified by the file descriptor fileno,\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
998 and returns a mmap object. If length is 0, the maximum length of the map\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
999 will be the current size of the file when mmap is called.\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
1000 flags specifies the nature of the mapping. MAP_PRIVATE creates a\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
1001 private copy-on-write mapping, so changes to the contents of the mmap\n\
48771
ea3d13cd7c1e Merged revisions 65780,65782,65785,65809,65812,65834,65846,65859,65861 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48683
diff changeset
1002 object will be private to this process, and MAP_SHARED creates a mapping\n\
44834
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
1003 that's shared with all other processes mapping the same areas of the file.\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
1004 The default value is MAP_SHARED.\n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
1005 \n\
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
1006 To map anonymous memory, pass -1 as the fileno (both versions).");
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
1007
ed33da2e74e7 Merged revisions 60143-60149 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44782
diff changeset
1008
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1009 static PyTypeObject mmap_object_type = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1010 PyVarObject_HEAD_INIT(NULL, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1011 "mmap.mmap", /* tp_name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1012 sizeof(mmap_object), /* tp_size */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1013 0, /* tp_itemsize */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1014 /* methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1015 (destructor) mmap_object_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1016 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1017 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1018 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1019 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1020 0, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1021 0, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1022 &mmap_as_sequence, /*tp_as_sequence*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1023 &mmap_as_mapping, /*tp_as_mapping*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1024 0, /*tp_hash*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1025 0, /*tp_call*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1026 0, /*tp_str*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1027 PyObject_GenericGetAttr, /*tp_getattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1028 0, /*tp_setattro*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1029 &mmap_as_buffer, /*tp_as_buffer*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1030 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1031 mmap_doc, /*tp_doc*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1032 0, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1033 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1034 0, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1035 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1036 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1037 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1038 mmap_object_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1039 0, /* tp_members */
63422
cf989a34c77e #8046: add context manager protocol support to mmap objects. Also add closed property.
Georg Brandl <georg@python.org>
parents: 61466
diff changeset
1040 mmap_object_getset, /* tp_getset */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1041 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1042 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1043 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1044 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1045 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1046 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1047 PyType_GenericAlloc, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1048 new_mmap_object, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1049 PyObject_Del, /* tp_free */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1050 };
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1051
12945
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
1052
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
1053 /* extract the map size from the given PyObject
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
1054
13620
5b727ab37092 Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents: 13463
diff changeset
1055 Returns -1 on error, with an appropriate Python exception raised. On
12945
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
1056 success, the map size is returned. */
36541
f7f0d2a5b20b Remove size restrictions.
Martin v. Löwis <martin@v.loewis.de>
parents: 36540
diff changeset
1057 static Py_ssize_t
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
1058 _GetMapSize(PyObject *o, const char* param)
12945
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
1059 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1060 if (o == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1061 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1062 if (PyIndex_Check(o)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1063 Py_ssize_t i = PyNumber_AsSsize_t(o, PyExc_OverflowError);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1064 if (i==-1 && PyErr_Occurred())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1065 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1066 if (i < 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1067 PyErr_Format(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1068 "memory mapped %s must be positive",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1069 param);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1070 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1071 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1072 return i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1073 }
12945
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
1074
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1075 PyErr_SetString(PyExc_TypeError, "map size must be an integral value");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1076 return -1;
12945
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
1077 }
5d2fb67408a7 Patch from Trent Mick:
Andrew M. Kuchling <amk@amk.ca>
parents: 12944
diff changeset
1078
36537
fdabdf148336 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 36536
diff changeset
1079 #ifdef UNIX
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1080 #ifdef HAVE_LARGEFILE_SUPPORT
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1081 #define _Py_PARSE_OFF_T "L"
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1082 #else
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1083 #define _Py_PARSE_OFF_T "l"
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1084 #endif
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1085
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1086 static PyObject *
44859
feba5d5cac22 Merged revisions 60151-60159,60161-60168,60170,60172-60173,60175 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44834
diff changeset
1087 new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1088 {
25130
368bc3a4919e SF bug # 585792, Invalid mmap crashes Python interpreter
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
1089 #ifdef HAVE_FSTAT
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1090 struct stat st;
25130
368bc3a4919e SF bug # 585792, Invalid mmap crashes Python interpreter
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
1091 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1092 mmap_object *m_obj;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1093 PyObject *map_size_obj = NULL;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1094 Py_ssize_t map_size;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1095 off_t offset = 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1096 int fd, flags = MAP_SHARED, prot = PROT_WRITE | PROT_READ;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1097 int devzero = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1098 int access = (int)ACCESS_DEFAULT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1099 static char *keywords[] = {"fileno", "length",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1100 "flags", "prot",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1101 "access", "offset", NULL};
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1102
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1103 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iO|iii" _Py_PARSE_OFF_T, keywords,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1104 &fd, &map_size_obj, &flags, &prot,
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1105 &access, &offset))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1106 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1107 map_size = _GetMapSize(map_size_obj, "size");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1108 if (map_size < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1109 return NULL;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1110 if (offset < 0) {
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1111 PyErr_SetString(PyExc_OverflowError,
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1112 "memory mapped offset must be positive");
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1113 return NULL;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1114 }
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
1115
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1116 if ((access != (int)ACCESS_DEFAULT) &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1117 ((flags != MAP_SHARED) || (prot != (PROT_WRITE | PROT_READ))))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1118 return PyErr_Format(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1119 "mmap can't specify both access and flags, prot.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1120 switch ((access_mode)access) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1121 case ACCESS_READ:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1122 flags = MAP_SHARED;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1123 prot = PROT_READ;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1124 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1125 case ACCESS_WRITE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1126 flags = MAP_SHARED;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1127 prot = PROT_READ | PROT_WRITE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1128 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1129 case ACCESS_COPY:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1130 flags = MAP_PRIVATE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1131 prot = PROT_READ | PROT_WRITE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1132 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1133 case ACCESS_DEFAULT:
68268
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1134 /* map prot to access type */
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1135 if ((prot & PROT_READ) && (prot & PROT_WRITE)) {
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1136 /* ACCESS_DEFAULT */
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1137 }
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1138 else if (prot & PROT_WRITE) {
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1139 access = ACCESS_WRITE;
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1140 }
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1141 else {
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1142 access = ACCESS_READ;
97a5590b9291 Issue #11391: Writing to a mmap object created with
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1143 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1144 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1145 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1146 return PyErr_Format(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1147 "mmap invalid access parameter.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1148 }
25130
368bc3a4919e SF bug # 585792, Invalid mmap crashes Python interpreter
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
1149
69753
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
1150 #ifdef __APPLE__
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
1151 /* Issue #11277: fsync(2) is not enough on OS X - a special, OS X specific
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
1152 fcntl(2) is necessary to force DISKSYNC and get around mmap(2) bug */
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
1153 if (fd != -1)
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
1154 (void)fcntl(fd, F_FULLFSYNC);
cb464f8fb3a1 Issue #11277: mmap calls fcntl(fd, F_FULLFSYNC) on Mac OS X to get around a
Victor Stinner <victor.stinner@haypocalc.com>
parents: 68268
diff changeset
1155 #endif
25130
368bc3a4919e SF bug # 585792, Invalid mmap crashes Python interpreter
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
1156 #ifdef HAVE_FSTAT
28949
ac487a7f7f2c Patch #708495: Port more stuff to OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 28558
diff changeset
1157 # ifdef __VMS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1158 /* on OpenVMS we must ensure that all bytes are written to the file */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1159 if (fd != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1160 fsync(fd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1161 }
28949
ac487a7f7f2c Patch #708495: Port more stuff to OpenVMS.
Martin v. Löwis <martin@v.loewis.de>
parents: 28558
diff changeset
1162 # endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1163 if (fd != -1 && fstat(fd, &st) == 0 && S_ISREG(st.st_mode)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1164 if (map_size == 0) {
67707
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1165 if (offset >= st.st_size) {
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1166 PyErr_SetString(PyExc_ValueError,
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1167 "mmap offset is greater than file size");
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1168 return NULL;
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1169 }
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1170 off_t calc_size = st.st_size - offset;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1171 map_size = calc_size;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1172 if (map_size != calc_size) {
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1173 PyErr_SetString(PyExc_ValueError,
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1174 "mmap length is too large");
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1175 return NULL;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1176 }
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1177 } else if (offset + (size_t)map_size > st.st_size) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1178 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1179 "mmap length is greater than file size");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1180 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1181 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1182 }
25130
368bc3a4919e SF bug # 585792, Invalid mmap crashes Python interpreter
Neal Norwitz <nnorwitz@gmail.com>
parents: 24363
diff changeset
1183 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1184 m_obj = (mmap_object *)type->tp_alloc(type, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1185 if (m_obj == NULL) {return NULL;}
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1186 m_obj->data = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1187 m_obj->size = (size_t) map_size;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1188 m_obj->pos = (size_t) 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1189 m_obj->exports = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1190 m_obj->offset = offset;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1191 if (fd == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1192 m_obj->fd = -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1193 /* Assume the caller wants to map anonymous memory.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1194 This is the same behaviour as Windows. mmap.mmap(-1, size)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1195 on both Windows and Unix map anonymous memory.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1196 */
36446
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
1197 #ifdef MAP_ANONYMOUS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1198 /* BSD way to map anonymous memory */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1199 flags |= MAP_ANONYMOUS;
36446
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
1200 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1201 /* SVR4 method to map anonymous memory is to open /dev/zero */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1202 fd = devzero = open("/dev/zero", O_RDWR);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1203 if (devzero == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1204 Py_DECREF(m_obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1205 PyErr_SetFromErrno(mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1206 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1207 }
36446
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
1208 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1209 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1210 m_obj->fd = dup(fd);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1211 if (m_obj->fd == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1212 Py_DECREF(m_obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1213 PyErr_SetFromErrno(mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1214 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1215 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1216 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1217
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1218 m_obj->data = mmap(NULL, map_size,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1219 prot, flags,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1220 fd, offset);
36446
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
1221
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1222 if (devzero != -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1223 close(devzero);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1224 }
36446
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
1225
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1226 if (m_obj->data == (char *)-1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1227 m_obj->data = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1228 Py_DECREF(m_obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1229 PyErr_SetFromErrno(mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1230 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1231 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1232 m_obj->access = (access_mode)access;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1233 return (PyObject *)m_obj;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1234 }
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1235 #endif /* UNIX */
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1236
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
1237 #ifdef MS_WINDOWS
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1238
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1239 /* A note on sizes and offsets: while the actual map size must hold in a
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1240 Py_ssize_t, both the total file size and the start offset can be longer
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1241 than a Py_ssize_t, so we use PY_LONG_LONG which is always 64-bit.
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1242 */
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1243
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1244 static PyObject *
44859
feba5d5cac22 Merged revisions 60151-60159,60161-60168,60170,60172-60173,60175 via svnmerge from
Georg Brandl <georg@python.org>
parents: 44834
diff changeset
1245 new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1246 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1247 mmap_object *m_obj;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1248 PyObject *map_size_obj = NULL;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1249 Py_ssize_t map_size;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1250 PY_LONG_LONG offset = 0, size;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1251 DWORD off_hi; /* upper 32 bits of offset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1252 DWORD off_lo; /* lower 32 bits of offset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1253 DWORD size_hi; /* upper 32 bits of size */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1254 DWORD size_lo; /* lower 32 bits of size */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1255 char *tagname = "";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1256 DWORD dwErr = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1257 int fileno;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1258 HANDLE fh = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1259 int access = (access_mode)ACCESS_DEFAULT;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1260 DWORD flProtect, dwDesiredAccess;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1261 static char *keywords[] = { "fileno", "length",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1262 "tagname",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1263 "access", "offset", NULL };
12146
e8c30e69666b Hacked for Win32 by Mark Hammond.
Guido van Rossum <guido@python.org>
parents: 12120
diff changeset
1264
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1265 if (!PyArg_ParseTupleAndKeywords(args, kwdict, "iO|ziL", keywords,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1266 &fileno, &map_size_obj,
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1267 &tagname, &access, &offset)) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1268 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1269 }
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
1270
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1271 switch((access_mode)access) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1272 case ACCESS_READ:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1273 flProtect = PAGE_READONLY;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1274 dwDesiredAccess = FILE_MAP_READ;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1275 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1276 case ACCESS_DEFAULT: case ACCESS_WRITE:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1277 flProtect = PAGE_READWRITE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1278 dwDesiredAccess = FILE_MAP_WRITE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1279 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1280 case ACCESS_COPY:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1281 flProtect = PAGE_WRITECOPY;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1282 dwDesiredAccess = FILE_MAP_COPY;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1283 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1284 default:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1285 return PyErr_Format(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1286 "mmap invalid access parameter.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1287 }
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
1288
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1289 map_size = _GetMapSize(map_size_obj, "size");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1290 if (map_size < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1291 return NULL;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1292 if (offset < 0) {
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1293 PyErr_SetString(PyExc_OverflowError,
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1294 "memory mapped offset must be positive");
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1295 return NULL;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1296 }
36537
fdabdf148336 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 36536
diff changeset
1297
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1298 /* assume -1 and 0 both mean invalid filedescriptor
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1299 to 'anonymously' map memory.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1300 XXX: fileno == 0 is a valid fd, but was accepted prior to 2.5.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1301 XXX: Should this code be added?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1302 if (fileno == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1303 PyErr_WarnEx(PyExc_DeprecationWarning,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1304 "don't use 0 for anonymous memory",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1305 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1306 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1307 if (fileno != -1 && fileno != 0) {
63425
0be5504213d3 Merged revisions 83407 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 61466
diff changeset
1308 /* Ensure that fileno is within the CRT's valid range */
0be5504213d3 Merged revisions 83407 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 61466
diff changeset
1309 if (_PyVerify_fd(fileno) == 0) {
0be5504213d3 Merged revisions 83407 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 61466
diff changeset
1310 PyErr_SetFromErrno(mmap_module_error);
0be5504213d3 Merged revisions 83407 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 61466
diff changeset
1311 return NULL;
0be5504213d3 Merged revisions 83407 via svnmerge from
Brian Curtin <brian.curtin@gmail.com>
parents: 61466
diff changeset
1312 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1313 fh = (HANDLE)_get_osfhandle(fileno);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1314 if (fh==(HANDLE)-1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1315 PyErr_SetFromErrno(mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1316 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1317 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1318 /* Win9x appears to need us seeked to zero */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1319 lseek(fileno, 0, SEEK_SET);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1320 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1321
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1322 m_obj = (mmap_object *)type->tp_alloc(type, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1323 if (m_obj == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1324 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1325 /* Set every field to an invalid marker, so we can safely
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1326 destruct the object in the face of failure */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1327 m_obj->data = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1328 m_obj->file_handle = INVALID_HANDLE_VALUE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1329 m_obj->map_handle = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1330 m_obj->tagname = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1331 m_obj->offset = offset;
13757
67b9b05ce5a5 Fixes for Windows (but also tested on Linux). Test suite now completes, and this module should not leak in the face of errors.
Mark Hammond <mhammond@skippinet.com.au>
parents: 13620
diff changeset
1332
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1333 if (fh) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1334 /* It is necessary to duplicate the handle, so the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1335 Python code can close it on us */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1336 if (!DuplicateHandle(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1337 GetCurrentProcess(), /* source process handle */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1338 fh, /* handle to be duplicated */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1339 GetCurrentProcess(), /* target proc handle */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1340 (LPHANDLE)&m_obj->file_handle, /* result */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1341 0, /* access - ignored due to options value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1342 FALSE, /* inherited by child processes? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1343 DUPLICATE_SAME_ACCESS)) { /* options */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1344 dwErr = GetLastError();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1345 Py_DECREF(m_obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1346 PyErr_SetFromWindowsErr(dwErr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1347 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1348 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1349 if (!map_size) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1350 DWORD low,high;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1351 low = GetFileSize(fh, &high);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1352 /* low might just happen to have the value INVALID_FILE_SIZE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1353 so we need to check the last error also. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1354 if (low == INVALID_FILE_SIZE &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1355 (dwErr = GetLastError()) != NO_ERROR) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1356 Py_DECREF(m_obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1357 return PyErr_SetFromWindowsErr(dwErr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1358 }
43777
0d462d789b18 Merging the py3k-pep3137 branch back into the py3k branch.
Guido van Rossum <guido@python.org>
parents: 43734
diff changeset
1359
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1360 size = (((PY_LONG_LONG) high) << 32) + low;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1361 if (offset >= size) {
67707
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1362 PyErr_SetString(PyExc_ValueError,
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1363 "mmap offset is greater than file size");
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1364 Py_DECREF(m_obj);
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1365 return NULL;
f36538ba90a8 Merged revisions 88131 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67623
diff changeset
1366 }
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1367 if (offset - size > PY_SSIZE_T_MAX)
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1368 /* Map area too large to fit in memory */
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1369 m_obj->size = (Py_ssize_t) -1;
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1370 else
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1371 m_obj->size = (Py_ssize_t) (size - offset);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1372 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1373 m_obj->size = map_size;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1374 size = offset + map_size;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1375 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1376 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1377 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1378 m_obj->size = map_size;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1379 size = offset + map_size;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1380 }
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1381
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1382 /* set the initial position */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1383 m_obj->pos = (size_t) 0;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1384
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1385 m_obj->exports = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1386 /* set the tag name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1387 if (tagname != NULL && *tagname != '\0') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1388 m_obj->tagname = PyMem_Malloc(strlen(tagname)+1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1389 if (m_obj->tagname == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1390 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1391 Py_DECREF(m_obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1392 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1393 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1394 strcpy(m_obj->tagname, tagname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1395 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1396 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1397 m_obj->tagname = NULL;
13757
67b9b05ce5a5 Fixes for Windows (but also tested on Linux). Test suite now completes, and this module should not leak in the face of errors.
Mark Hammond <mhammond@skippinet.com.au>
parents: 13620
diff changeset
1398
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1399 m_obj->access = (access_mode)access;
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1400 size_hi = (DWORD)(size >> 32);
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67707
diff changeset
1401 size_lo = (DWORD)(size & 0xFFFFFFFF);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1402 off_hi = (DWORD)(offset >> 32);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1403 off_lo = (DWORD)(offset & 0xFFFFFFFF);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1404 /* For files, it would be sufficient to pass 0 as size.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1405 For anonymous maps, we have to pass the size explicitly. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1406 m_obj->map_handle = CreateFileMapping(m_obj->file_handle,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1407 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1408 flProtect,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1409 size_hi,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1410 size_lo,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1411 m_obj->tagname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1412 if (m_obj->map_handle != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1413 m_obj->data = (char *) MapViewOfFile(m_obj->map_handle,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1414 dwDesiredAccess,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1415 off_hi,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1416 off_lo,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1417 m_obj->size);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1418 if (m_obj->data != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1419 return (PyObject *)m_obj;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1420 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1421 dwErr = GetLastError();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1422 CloseHandle(m_obj->map_handle);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1423 m_obj->map_handle = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1424 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1425 } else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1426 dwErr = GetLastError();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1427 Py_DECREF(m_obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1428 PyErr_SetFromWindowsErr(dwErr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1429 return NULL;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1430 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 22177
diff changeset
1431 #endif /* MS_WINDOWS */
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1432
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
1433 static void
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
1434 setint(PyObject *d, const char *name, long value)
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
1435 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1436 PyObject *o = PyLong_FromLong(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1437 if (o && PyDict_SetItemString(d, name, o) == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1438 Py_DECREF(o);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1439 }
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
1440 }
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
1441
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1442
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1443 static struct PyModuleDef mmapmodule = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1444 PyModuleDef_HEAD_INIT,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1445 "mmap",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1446 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1447 -1,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1448 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1449 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1450 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1451 NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1452 NULL
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1453 };
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1454
24363
979ff5d0ae07 Replace DL_IMPORT with PyMODINIT_FUNC and remove "/export:init..." link
Mark Hammond <mhammond@skippinet.com.au>
parents: 24071
diff changeset
1455 PyMODINIT_FUNC
47580
94f64f11fdd0 Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents: 47301
diff changeset
1456 PyInit_mmap(void)
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1457 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1458 PyObject *dict, *module;
15851
a3c1a234cee7 SF bug 128713: type(mmap_object) blew up on Linux.
Tim Peters <tim.peters@gmail.com>
parents: 15803
diff changeset
1459
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1460 if (PyType_Ready(&mmap_object_type) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1461 return NULL;
15851
a3c1a234cee7 SF bug 128713: type(mmap_object) blew up on Linux.
Tim Peters <tim.peters@gmail.com>
parents: 15803
diff changeset
1462
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1463 module = PyModule_Create(&mmapmodule);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1464 if (module == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1465 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1466 dict = PyModule_GetDict(module);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1467 if (!dict)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1468 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1469 mmap_module_error = PyErr_NewException("mmap.error",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1470 PyExc_EnvironmentError , NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1471 if (mmap_module_error == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1472 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1473 PyDict_SetItemString(dict, "error", mmap_module_error);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1474 PyDict_SetItemString(dict, "mmap", (PyObject*) &mmap_object_type);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1475 #ifdef PROT_EXEC
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1476 setint(dict, "PROT_EXEC", PROT_EXEC);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1477 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1478 #ifdef PROT_READ
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1479 setint(dict, "PROT_READ", PROT_READ);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1480 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1481 #ifdef PROT_WRITE
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1482 setint(dict, "PROT_WRITE", PROT_WRITE);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1483 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1484
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1485 #ifdef MAP_SHARED
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1486 setint(dict, "MAP_SHARED", MAP_SHARED);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1487 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1488 #ifdef MAP_PRIVATE
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1489 setint(dict, "MAP_PRIVATE", MAP_PRIVATE);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1490 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1491 #ifdef MAP_DENYWRITE
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1492 setint(dict, "MAP_DENYWRITE", MAP_DENYWRITE);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1493 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1494 #ifdef MAP_EXECUTABLE
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1495 setint(dict, "MAP_EXECUTABLE", MAP_EXECUTABLE);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1496 #endif
36446
02f0744a9cd0 Patch #1407135, bug #1424041, make mmap.mmap(-1, length) work the same
Neal Norwitz <nnorwitz@gmail.com>
parents: 36445
diff changeset
1497 #ifdef MAP_ANONYMOUS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1498 setint(dict, "MAP_ANON", MAP_ANONYMOUS);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1499 setint(dict, "MAP_ANONYMOUS", MAP_ANONYMOUS);
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1500 #endif
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1501
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1502 setint(dict, "PAGESIZE", (long)my_getpagesize());
20970
e167b82c6444 CVS patch #477161: New "access" keyword for mmap, from Jay T Miller.
Tim Peters <tim.peters@gmail.com>
parents: 20888
diff changeset
1503
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1504 setint(dict, "ALLOCATIONGRANULARITY", (long)my_getallocationgranularity());
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
1505
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1506 setint(dict, "ACCESS_READ", ACCESS_READ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1507 setint(dict, "ACCESS_WRITE", ACCESS_WRITE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1508 setint(dict, "ACCESS_COPY", ACCESS_COPY);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54974
diff changeset
1509 return module;
12120
ec58b503b670 Added mmap module -- map a view of a file into memory on Win32 and Unix.
Andrew M. Kuchling <amk@amk.ca>
parents:
diff changeset
1510 }