diff options
author | Christian Heimes <christian@cheimes.de> | 2008-01-21 11:20:28 (GMT) |
---|---|---|
committer | Christian Heimes <christian@cheimes.de> | 2008-01-21 11:20:28 (GMT) |
commit | e1c981161c49ce6bc232b62f85ca222530491dae (patch) | |
tree | 2e092c9be8b0cd874ce26022e3f58aae64c04f07 /Modules/mmapmodule.c | |
parent | 9bd667ad030913ead3a789f45e73c26f9f28fb46 (diff) | |
download | cpython-e1c981161c49ce6bc232b62f85ca222530491dae.zip cpython-e1c981161c49ce6bc232b62f85ca222530491dae.tar.gz cpython-e1c981161c49ce6bc232b62f85ca222530491dae.tar.bz2 |
Merged revisions 60143-60149 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r60143 | georg.brandl | 2008-01-20 15:50:05 +0100 (Sun, 20 Jan 2008) | 3 lines
Switch mmap from old Py_FindMethod to new PyObject_GenericGetAttr attribute access.
Fixes #1087735.
........
r60145 | georg.brandl | 2008-01-20 20:40:58 +0100 (Sun, 20 Jan 2008) | 2 lines
Add blurb about executable scripts on Windows. #760657.
........
r60146 | georg.brandl | 2008-01-20 20:48:40 +0100 (Sun, 20 Jan 2008) | 2 lines
#1219903: fix tp_richcompare docs.
........
r60147 | georg.brandl | 2008-01-20 22:10:08 +0100 (Sun, 20 Jan 2008) | 2 lines
Fix markup.
........
r60148 | gregory.p.smith | 2008-01-21 08:11:11 +0100 (Mon, 21 Jan 2008) | 14 lines
Provide a sanity check during PyThreadState_DeleteCurrent() and
PyThreadState_Delete() to avoid an infinite loop when the tstate list
is messed up and has somehow becomes circular and does not contain the
current thread.
I don't know how this happens but it does, *very* rarely. On more than
one hardware platform. I have not been able to reproduce it manually.
Attaching to a process where its happening: it has always been in an
infinite loop over a single element tstate list that is not the tstate
we're looking to delete. It has been in t_bootstrap()'s call to
PyThreadState_DeleteCurrent() as a pthread is exiting.
........
r60149 | georg.brandl | 2008-01-21 11:24:59 +0100 (Mon, 21 Jan 2008) | 2 lines
#1269: fix a bug in pstats.add_callers() and add a unit test file for pstats.
........
Diffstat (limited to 'Modules/mmapmodule.c')
-rw-r--r-- | Modules/mmapmodule.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index ab9eedc..e06cefb 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -666,12 +666,6 @@ mmap_buffer_releasebuf(mmap_object *self, Py_buffer *view) self->exports--; } -static PyObject * -mmap_object_getattr(mmap_object *self, char *name) -{ - return Py_FindMethod(mmap_object_methods, (PyObject *)self, name); -} - static Py_ssize_t mmap_length(mmap_object *self) { @@ -901,6 +895,30 @@ static PyBufferProcs mmap_as_buffer = { (releasebufferproc)mmap_buffer_releasebuf, }; +PyDoc_STRVAR(mmap_doc, +"Windows: mmap(fileno, length[, tagname[, access[, offset]]])\n\ +\n\ +Maps length bytes from the file specified by the file handle fileno,\n\ +and returns a mmap object. If length is larger than the current size\n\ +of the file, the file is extended to contain length bytes. If length\n\ +is 0, the maximum length of the map is the current size of the file,\n\ +except that if the file is empty Windows raises an exception (you cannot\n\ +create an empty mapping on Windows).\n\ +\n\ +Unix: mmap(fileno, length[, flags[, prot[, access[, offset]]]])\n\ +\n\ +Maps length bytes from the file specified by the file descriptor fileno,\n\ +and returns a mmap object. If length is 0, the maximum length of the map\n\ +will be the current size of the file when mmap is called.\n\ +flags specifies the nature of the mapping. MAP_PRIVATE creates a\n\ +private copy-on-write mapping, so changes to the contents of the mmap\n\ +object will be private to this process, and MAP_SHARED`creates a mapping\n\ +that's shared with all other processes mapping the same areas of the file.\n\ +The default value is MAP_SHARED.\n\ +\n\ +To map anonymous memory, pass -1 as the fileno (both versions)."); + + static PyTypeObject mmap_object_type = { PyVarObject_HEAD_INIT(0, 0) /* patched in module init */ "mmap.mmap", /* tp_name */ @@ -909,7 +927,7 @@ static PyTypeObject mmap_object_type = { /* methods */ (destructor) mmap_object_dealloc, /* tp_dealloc */ 0, /* tp_print */ - (getattrfunc) mmap_object_getattr, /* tp_getattr */ + 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ @@ -919,11 +937,19 @@ static PyTypeObject mmap_object_type = { 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ - 0, /*tp_getattro*/ + PyObject_GenericGetAttr, /*tp_getattro*/ 0, /*tp_setattro*/ &mmap_as_buffer, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ + mmap_doc, /*tp_doc*/ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + mmap_object_methods, /* tp_methods */ + }; @@ -1265,7 +1291,7 @@ new_mmap_object(PyObject *self, PyObject *args, PyObject *kwdict) /* List of functions exported by this module */ static struct PyMethodDef mmap_functions[] = { {"mmap", (PyCFunction) new_mmap_object, - METH_VARARGS|METH_KEYWORDS}, + METH_VARARGS|METH_KEYWORDS, mmap_doc}, {NULL, NULL} /* Sentinel */ }; |