/*
  * 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);
 }