Fix problems with memoryview object.  There is still more to do to finish PEP 3118.  The memory-view object needs to be fleshed out and the struct module needs to be modified.
diff --git a/Include/memoryobject.h b/Include/memoryobject.h
index 4426cd8..8709da5 100644
--- a/Include/memoryobject.h
+++ b/Include/memoryobject.h
@@ -8,9 +8,9 @@
 #endif
 
 typedef struct {
-        PyObject_HEAD
-        PyObject *base;
-        Py_buffer view;
+	PyObject_HEAD
+	PyObject *base;
+	Py_buffer view;
 } PyMemoryViewObject;
 
 
@@ -21,39 +21,40 @@
 
 #define Py_END_OF_MEMORY	(-1)
 
-PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, int buffertype, 
-                                                  char fort);
+PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, 
+						  int buffertype, 
+						  char fort);
 
 	/* Return a contiguous chunk of memory representing the buffer
 	   from an object in a memory view object.  If a copy is made then the
-           base object for the memory view will be a *new* bytes object. 
-           
-           Otherwise, the base-object will be the object itself and no 
-           data-copying will be done. 
-
-           The buffertype argument can be PyBUF_READ, PyBUF_WRITE,
-           PyBUF_UPDATEIFCOPY to determine whether the returned buffer
-           should be READONLY, WRITABLE, or set to update the
-           original buffer if a copy must be made.  If buffertype is
-           PyBUF_WRITE and the buffer is not contiguous an error will
-           be raised.  In this circumstance, the user can use
-           PyBUF_UPDATEIFCOPY to ensure that a a writable temporary
-           contiguous buffer is returned.  The contents of this
-           contiguous buffer will be copied back into the original
-           object after the memoryview object is deleted as long as
-           the original object is writable and allows setting its
-           memory to "readonly".  If this is not allowed by the
-           original object, then a BufferError is raised.
+	   base object for the memory view will be a *new* bytes object. 
 	   
-           If the object is multi-dimensional and if fortran is 'F',
-           the first dimension of the underlying array will vary the
-           fastest in the buffer.  If fortran is 'C', then the last
-           dimension will vary the fastest (C-style contiguous).  If
-           fortran is 'A', then it does not matter and you will get
-           whatever the object decides is more efficient.  
+	   Otherwise, the base-object will be the object itself and no 
+	   data-copying will be done. 
 
-           A new reference is returned that must be DECREF'd when finished.
-        */
+	   The buffertype argument can be PyBUF_READ, PyBUF_WRITE,
+	   PyBUF_SHADOW to determine whether the returned buffer
+	   should be READONLY, WRITABLE, or set to update the
+	   original buffer if a copy must be made.  If buffertype is
+	   PyBUF_WRITE and the buffer is not contiguous an error will
+	   be raised.  In this circumstance, the user can use
+	   PyBUF_SHADOW to ensure that a a writable temporary
+	   contiguous buffer is returned.  The contents of this
+	   contiguous buffer will be copied back into the original
+	   object after the memoryview object is deleted as long as
+	   the original object is writable and allows setting an
+	   exclusive write lock. If this is not allowed by the
+	   original object, then a BufferError is raised.
+	   
+	   If the object is multi-dimensional and if fortran is 'F',
+	   the first dimension of the underlying array will vary the
+	   fastest in the buffer.  If fortran is 'C', then the last
+	   dimension will vary the fastest (C-style contiguous).  If
+	   fortran is 'A', then it does not matter and you will get
+	   whatever the object decides is more efficient.  
+
+	   A new reference is returned that must be DECREF'd when finished.
+	*/
 
 PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base);
 
diff --git a/Include/object.h b/Include/object.h
index 88a3b84..c9d2217 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -164,7 +164,7 @@
 #define PyBUF_WRITABLE 0x0002
 /*  we used to include an E, backwards compatible alias  */
 #define PyBUF_WRITEABLE PyBUF_WRITABLE
-#define PyBUF_LOCKDATA 0x0004
+#define PyBUF_LOCK 0x0004
 #define PyBUF_FORMAT 0x0008
 #define PyBUF_ND 0x0010
 #define PyBUF_STRIDES (0x0020 | PyBUF_ND)
@@ -175,19 +175,25 @@
 
 #define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE)
 #define PyBUF_CONTIG_RO (PyBUF_ND)
-#define PyBUF_CONTIG_LCK (PyBUF_ND | PyBUF_LOCKDATA)
+#define PyBUF_CONTIG_LCK (PyBUF_ND | PyBUF_LOCK)
+#define PyBUF_CONTIG_XLCK (PyBUF_ND | PyBUF_LOCK | PyBUF_WRITABLE)
 
 #define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE)
 #define PyBUF_STRIDED_RO (PyBUF_STRIDES)
-#define PyBUF_STRIDED_LCK (PyBUF_STRIDES | PyBUF_LOCKDATA)
+#define PyBUF_STRIDED_LCK (PyBUF_STRIDES | PyBUF_LOCK)
+#define PyBUF_STRIDED_XLCK (PyBUF_STRIDES | PyBUF_LOCK | PyBUF_WRITABLE)
 
 #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT)
 #define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT)
-#define PyBUF_RECORDS_LCK (PyBUF_STRIDES | PyBUF_LOCKDATA | PyBUF_FORMAT)
+#define PyBUF_RECORDS_LCK (PyBUF_STRIDES | PyBUF_LOCK | PyBUF_FORMAT)
+#define PyBUF_RECORDS_XLCK (PyBUF_STRIDES | PyBUF_LOCK | PyBUF_WRITABLE \
+			    | PyBUF_FORMAT)
 
 #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT)
 #define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT)
-#define PyBUF_FULL_LCK (PyBUF_INDIRECT | PyBUF_LOCKDATA | PyBUF_FORMAT)
+#define PyBUF_FULL_LCK (PyBUF_INDIRECT | PyBUF_LOCK | PyBUF_FORMAT)
+#define PyBUF_FULL_XLCK (PyBUF_INDIRECT | PyBUF_LOCK | PyBUF_WRITABLE \
+			 | PyBUF_FORMAT)
 
 
 #define PyBUF_READ  0x100