Index: arraymodule.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Modules/arraymodule.c,v retrieving revision 2.79 diff -c -r2.79 arraymodule.c *** arraymodule.c 2 Aug 2002 02:27:12 -0000 2.79 --- arraymodule.c 12 Dec 2002 19:47:44 -0000 *************** *** 33,38 **** --- 33,39 ---- int ob_size; char *ob_item; struct arraydescr *ob_descr; + int ob_bufferlocks; } arrayobject; static PyTypeObject Arraytype; *************** *** 394,399 **** --- 395,401 ---- } } op->ob_descr = descr; + op->ob_bufferlocks = 0; return (PyObject *) op; } *************** *** 414,419 **** --- 416,427 ---- ins1(arrayobject *self, int where, PyObject *v) { char *items; + if (self->ob_bufferlocks != 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot extend array while buffer is locked"); + return -1; + + } if (v == NULL) { PyErr_BadInternalCall(); return -1; *************** *** 444,449 **** --- 452,460 ---- static void array_dealloc(arrayobject *op) { + if (op->ob_bufferlocks != 0) { + Py_FatalError("Free locked array object!"); + } if (op->ob_item != NULL) PyMem_DEL(op->ob_item); op->ob_type->tp_free((PyObject *)op); *************** *** 666,671 **** --- 677,687 ---- ihigh = a->ob_size; item = a->ob_item; d = n - (ihigh-ilow); + if (d != 0 && a->ob_bufferlocks != 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot extend array while buffer is locked"); + return -1; + } if (d < 0) { /* Delete -d items */ memmove(item + (ihigh+d)*a->ob_descr->itemsize, item + ihigh*a->ob_descr->itemsize, *************** *** 732,737 **** --- 748,758 ---- "can only extend with array of same kind"); return -1; } + if (self->ob_bufferlocks != 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot extend array while buffer is locked"); + return -1; + } size = self->ob_size + b->ob_size; PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize); if (self->ob_item == NULL) { *************** *** 762,767 **** --- 783,795 ---- char *items, *p; int size, i; + if (self->ob_size > 0 && n > 0 && + self->ob_bufferlocks > 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot inplace repeat array while buffer is locked"); + return NULL; + } + if (self->ob_size > 0) { if (n < 0) n = 0; *************** *** 1096,1101 **** --- 1124,1134 ---- PyErr_SetString(PyExc_TypeError, "arg1 must be open file"); return NULL; } + if (n > 0 && self->ob_bufferlocks > 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot extend array while buffer is locked"); + return NULL; + } if (n > 0) { char *item = self->ob_item; int itemsize = self->ob_descr->itemsize; *************** *** 1181,1186 **** --- 1214,1225 ---- return NULL; } n = PyList_Size(list); + if (n > 0 && self->ob_bufferlocks > 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot extend array while buffer is locked"); + return NULL; + } + if (n > 0) { char *item = self->ob_item; int i; *************** *** 1253,1258 **** --- 1292,1302 ---- return NULL; } n = n / itemsize; + if (n > 0 && self->ob_bufferlocks > 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot extend array while buffer is locked"); + return NULL; + } if (n > 0) { char *item = self->ob_item; PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize); *************** *** 1308,1313 **** --- 1352,1362 ---- "type 'u' arrays"); return NULL; } + if (n > 0 && self->ob_bufferlocks > 0) { + PyErr_SetString(PyExc_RuntimeError, + "cannot extend array while buffer is locked"); + return NULL; + } if (n > 0) { Py_UNICODE *item = (Py_UNICODE *) self->ob_item; PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n); *************** *** 1684,1689 **** --- 1733,1761 ---- return 1; } + static size_t + array_getlockedreadbuffer(arrayobject *self, const void **ptr) + { + self->ob_bufferlocks++; + *ptr = (void *)self->ob_item; + return self->ob_size*self->ob_descr->itemsize; + } + + static size_t + array_getlockedwritebuffer(arrayobject *self, const void **ptr) + { + self->ob_bufferlocks++; + *ptr = (void *)self->ob_item; + return self->ob_size*self->ob_descr->itemsize; + } + + static void + array_releaselockedbuffer(arrayobject *self) + { + self->ob_bufferlocks--; + return; + } + static PySequenceMethods array_as_sequence = { (inquiry)array_length, /*sq_length*/ (binaryfunc)array_concat, /*sq_concat*/ *************** *** 1701,1706 **** --- 1773,1782 ---- (getreadbufferproc)array_buffer_getreadbuf, (getwritebufferproc)array_buffer_getwritebuf, (getsegcountproc)array_buffer_getsegcount, + (getcharbufferproc) 0, + (acquirelockedreadbufferproc)array_getlockedreadbuffer, + (acquirelockedwritebufferproc)array_getlockedwritebuffer, + (releaselockedbufferproc)array_releaselockedbuffer, }; static PyObject *