Commit 58cb5227 authored by Jim Fulton's avatar Jim Fulton

Backed off fix made in 1.27, which seems to cause intermittent core

dumps. Copied source from 1.26.
parent d27d3a6d
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
****************************************************************************/ ****************************************************************************/
#define BTREETEMPLATE_C "$Id: BTreeTemplate.c,v 1.28 2002/05/30 18:29:59 jeremy Exp $\n" #define BTREETEMPLATE_C "$Id: BTreeTemplate.c,v 1.29 2002/05/30 21:47:39 jim Exp $\n"
/* /*
** _BTree_get ** _BTree_get
...@@ -356,9 +356,7 @@ _BTree_set(BTree *self, PyObject *keyarg, PyObject *value, ...@@ -356,9 +356,7 @@ _BTree_set(BTree *self, PyObject *keyarg, PyObject *value,
} }
} }
/* Binary search to find insertion point. /* Binary search to find insertion point */
min will be set to the index of the child that might have the key.
*/
for (min=0, max=self->len, i=max/2; max-min > 1; i=(max+min)/2) for (min=0, max=self->len, i=max/2; max-min > 1; i=(max+min)/2)
{ {
d=self->data+i; d=self->data+i;
...@@ -372,26 +370,20 @@ _BTree_set(BTree *self, PyObject *keyarg, PyObject *value, ...@@ -372,26 +370,20 @@ _BTree_set(BTree *self, PyObject *keyarg, PyObject *value,
else max=i; else max=i;
} }
d=self->data+min; /* Get item */ d=self->data+min;
if (SameType_Check(self, d->value)) /* Child is a BTree */ if (SameType_Check(self, d->value))
grew = _BTree_set( BTREE(d->value), keyarg, value, unique, noval); grew= _BTree_set( BTREE(d->value), keyarg, value, unique, noval);
else /* Child is a bucket */ else
grew = _bucket_set(BUCKET(d->value), keyarg, value, unique, noval, grew=_bucket_set(BUCKET(d->value), keyarg, value, unique, noval,
&bchanged); &bchanged);
if (grew < 0) goto err; if (grew < 0) goto err;
/* grew >0 if we changed the length of the BTree.
If we got smaller and a bucket got deleted, then
grew might be >1 to indicate that we need to adjust previous
bucket pointers, if we can.
*/
if (grew) if (grew)
{ {
bchanged=1; /* A bucket changed size */ bchanged=1; /* A bucket changed size */
if (value) /* got bigger, check for max size exceeded */ if (value) /* got bigger */
{ {
if (SameType_Check(self, d->value)) /* BTree */ if (SameType_Check(self, d->value))
{ {
if (BTREE(d->value)->len > MAX_BTREE_SIZE(d->value)) if (BTREE(d->value)->len > MAX_BTREE_SIZE(d->value))
{ {
...@@ -399,7 +391,7 @@ _BTree_set(BTree *self, PyObject *keyarg, PyObject *value, ...@@ -399,7 +391,7 @@ _BTree_set(BTree *self, PyObject *keyarg, PyObject *value,
changed=1; changed=1;
} }
} }
else /* Bucket */ else
{ {
if (BUCKET(d->value)->len > MAX_BUCKET_SIZE(d->value)) if (BUCKET(d->value)->len > MAX_BUCKET_SIZE(d->value))
{ {
...@@ -449,46 +441,38 @@ _BTree_set(BTree *self, PyObject *keyarg, PyObject *value, ...@@ -449,46 +441,38 @@ _BTree_set(BTree *self, PyObject *keyarg, PyObject *value,
if (min < self->len) if (min < self->len)
memmove(d, d+1, (self->len-min)*sizeof(BTreeItem)); memmove(d, d+1, (self->len-min)*sizeof(BTreeItem));
changed=1; if (! min)
} {
if (self->len)
if (min == 0 && grew > 1) { /* We just deleted our first child, so we need to
/* The first bucket got deleted by us or a child. adjust our first bucket. */
If grew is > 1 then either we deleted the first one and if (SameType_Check(self, self->data->value))
incremented grew ourself (just above) or {
a child deleted it's first bucket and nobody could UNLESS (PER_USE(BTREE(self->data->value))) goto err;
adjust the pervious bucket's pointer, because there ASSIGNB(self->firstbucket,
were no previous buckets. Thus, it *must* be the first! BTREE(self->data->value)->firstbucket);
*/ Py_XINCREF(self->firstbucket);
{ PER_ALLOW_DEACTIVATION(BTREE(self->data->value));
if (self->len) PER_ACCESSED(BTREE(self->data->value));
{ /* We just deleted our first child, so we need to }
adjust our first bucket. */ else
if (SameType_Check(self, self->data->value)) {
{ ASSIGNB(self->firstbucket,
UNLESS (PER_USE(BTREE(self->data->value))) goto err; BUCKET(self->data->value));
ASSIGNB(self->firstbucket, Py_INCREF(self->firstbucket);
BTREE(self->data->value)->firstbucket); }
Py_XINCREF(self->firstbucket); /* We can toss our first key now */
PER_ALLOW_DEACTIVATION(BTREE(self->data->value)); DECREF_KEY(self->data->key);
PER_ACCESSED(BTREE(self->data->value));
} }
else else
{ {
ASSIGNB(self->firstbucket, Py_XDECREF(self->firstbucket);
BUCKET(self->data->value)); self->firstbucket = 0;
Py_INCREF(self->firstbucket);
} }
/* We can toss our first key now */
DECREF_KEY(self->data->key);
}
else
{
Py_XDECREF(self->firstbucket);
self->firstbucket = 0;
} }
changed=1;
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment