/*
  * AllocSetContext is our standard implementation of MemoryContext.
  *
- * Note: isReset means there is nothing for AllocSetReset to do.  This is
+ * Note: header.isReset means there is nothing for AllocSetReset to do.  This is
  * different from the aset being physically empty (empty blocks list) because
  * we may still have a keeper block.  It's also different from the set being
  * logically empty, because we don't attempt to detect pfree'ing the last
        /* Info about storage allocated in this context: */
        AllocBlock      blocks;                 /* head of list of blocks in this set */
        AllocChunk      freelist[ALLOCSET_NUM_FREELISTS];               /* free chunk lists */
-       bool            isReset;                /* T = no space alloced since last reset */
        /* Allocation parameters for this context: */
        Size            initBlockSize;  /* initial block size */
        Size            maxBlockSize;   /* maximum block size */
                context->keeper = block;
        }
 
-       context->isReset = true;
-
        return (MemoryContext) context;
 }
 
 
        AssertArg(AllocSetIsValid(set));
 
-       /* Nothing to do if no pallocs since startup or last reset */
-       if (set->isReset)
-               return;
-
 #ifdef MEMORY_CONTEXT_CHECKING
        /* Check for corruption and leaks before freeing */
        AllocSetCheck(context);
 
        /* Reset block size allocation sequence, too */
        set->nextBlockSize = set->initBlockSize;
-
-       set->isReset = true;
 }
 
 /*
                        set->blocks = block;
                }
 
-               set->isReset = false;
-
                AllocAllocInfo(set, chunk);
                return AllocChunkGetPointer(chunk);
        }
                randomize_mem((char *) AllocChunkGetPointer(chunk), size);
 #endif
 
-               /* isReset must be false already */
-               Assert(!set->isReset);
-
                AllocAllocInfo(set, chunk);
                return AllocChunkGetPointer(chunk);
        }
        randomize_mem((char *) AllocChunkGetPointer(chunk), size);
 #endif
 
-       set->isReset = false;
-
        AllocAllocInfo(set, chunk);
        return AllocChunkGetPointer(chunk);
 }
                                 set->header.name, chunk);
 #endif
 
-       /* isReset must be false already */
-       Assert(!set->isReset);
-
        /*
         * Chunk sizes are aligned to power of 2 in AllocSetAlloc(). Maybe the
         * allocated area already is >= the new size.  (In particular, we always
 static bool
 AllocSetIsEmpty(MemoryContext context)
 {
-       AllocSet        set = (AllocSet) context;
-
        /*
         * For now, we say "empty" only if the context is new or just reset. We
         * could examine the freelists to determine if all space has been freed,
         * but it's not really worth the trouble for present uses of this
         * functionality.
         */
-       if (set->isReset)
+       if (context->isReset)
                return true;
        return false;
 }
 
        if (context->firstchild != NULL)
                MemoryContextResetChildren(context);
 
-       (*context->methods->reset) (context);
+       /* Nothing to do if no pallocs since startup or last reset */
+       if (!context->isReset)
+       {
+               (*context->methods->reset) (context);
+               context->isReset = true;
+       }
 }
 
 /*
        node->parent = NULL;            /* for the moment */
        node->firstchild = NULL;
        node->nextchild = NULL;
+       node->isReset = true;
        node->name = ((char *) node) + size;
        strcpy(node->name, name);
 
 void *
 MemoryContextAlloc(MemoryContext context, Size size)
 {
+       void       *ret;
        AssertArg(MemoryContextIsValid(context));
 
        if (!AllocSizeIsValid(size))
                elog(ERROR, "invalid memory alloc request size %lu",
                         (unsigned long) size);
 
-       return (*context->methods->alloc) (context, size);
+       ret = (*context->methods->alloc) (context, size);
+       context->isReset = false;
+       return ret;
 }
 
 /*
 
        MemSetAligned(ret, 0, size);
 
+       context->isReset = false;
        return ret;
 }
 
 
        MemSetLoop(ret, 0, size);
 
+       context->isReset = false;
        return ret;
 }
 
                elog(ERROR, "invalid memory alloc request size %lu",
                         (unsigned long) size);
 
+       /* isReset must be false already */
+       Assert(!header->context->isReset);
+
        return (*header->context->methods->realloc) (header->context,
                                                                                                 pointer, size);
 }