diff --git a/src/BTrees/SetOpTemplate.c b/src/BTrees/SetOpTemplate.c
index 526bdb012199dd0a4258f8d12c3e032f1e90b829..12b821d65bc29dfa8ee8d6b1effff81d864ae5da 100644
--- a/src/BTrees/SetOpTemplate.c
+++ b/src/BTrees/SetOpTemplate.c
@@ -16,7 +16,7 @@
  Set operations
  ****************************************************************************/
 
-#define SETOPTEMPLATE_C "$Id: SetOpTemplate.c,v 1.19 2002/06/03 17:45:08 tim_one Exp $\n"
+#define SETOPTEMPLATE_C "$Id: SetOpTemplate.c,v 1.20 2002/06/05 16:03:11 tim_one Exp $\n"
 
 #ifdef INTSET_H
 static int 
@@ -459,20 +459,28 @@ multiunion_m(PyObject *ignored, PyObject *args)
         /* If set is a bucket, do a straight resize + memcpy. */
         if (set->ob_type == (PyTypeObject*)&SetType ||
             set->ob_type == (PyTypeObject*)&BucketType) {
+            int setsize;
+            int size_desired;
 
-            const int setsize = SIZED(set)->len;
-            int size_desired = result->len + setsize;
+            UNLESS (PER_USE(set)) goto Error;
+            setsize = SIZED(set)->len;
+            size_desired = result->len + setsize;
             /* If there are more to come, overallocate by 25% (arbitrary). */
             if (i < n-1)
                 size_desired += size_desired >> 2;
             if (size_desired && size_desired > result->size) {
-                if (Bucket_grow(result, size_desired, 1) < 0)
+                if (Bucket_grow(result, size_desired, 1) < 0) {
+                    PER_ALLOW_DEACTIVATION(set);
+                    PER_ACCESSED(set);
                     goto Error;
+                }
             }
             memcpy(result->keys + result->len,
                    BUCKET(set)->keys,
                    setsize * sizeof(KEY_TYPE));
             result->len += setsize;
+            PER_ALLOW_DEACTIVATION(set);
+            PER_ACCESSED(set);
         }
         else {
             /* No cheap way:  iterate over set's elements one at a time. */