]> granicus.if.org Git - postgresql/commitdiff
Minor speed hacks in AllocSetReset: avoid clearing the freelist headers
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 14 May 2005 20:29:13 +0000 (20:29 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 14 May 2005 20:29:13 +0000 (20:29 +0000)
when the blocks list is empty (there can surely be no freelist items if
the context contains no memory), and use MemSetAligned not MemSet to
clear the headers (we assume alignof(pointer) >= alignof(int32)).
Per discussion with Atsushi Ogawa.  He proposes some further hacking
that I'm not yet sold on, but these two changes are unconditional wins
since there is no case in which they make things slower.

src/backend/utils/mmgr/aset.c

index 386d4508b373007efa51d29db1a459377de317b0..4f60b186c27bc6c0e60e738218fd09711e409df3 100644 (file)
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/mmgr/aset.c,v 1.59 2004/12/31 22:02:48 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/mmgr/aset.c,v 1.60 2005/05/14 20:29:13 tgl Exp $
  *
  * NOTE:
  *     This is a new (Feb. 05, 1999) implementation of the allocation set
@@ -395,12 +395,17 @@ AllocSetReset(MemoryContext context)
        AllocSetCheck(context);
 #endif
 
+       /* Nothing to do if context has never contained any data */
+       if (block == NULL)
+               return;
+
        /* Clear chunk freelists */
-       MemSet(set->freelist, 0, sizeof(set->freelist));
+       MemSetAligned(set->freelist, 0, sizeof(set->freelist));
+
        /* New blocks list is either empty or just the keeper block */
        set->blocks = set->keeper;
 
-       while (block != NULL)
+       do
        {
                AllocBlock      next = block->next;
 
@@ -427,6 +432,7 @@ AllocSetReset(MemoryContext context)
                }
                block = next;
        }
+       while (block != NULL);
 }
 
 /*
@@ -451,7 +457,7 @@ AllocSetDelete(MemoryContext context)
 #endif
 
        /* Make it look empty, just in case... */
-       MemSet(set->freelist, 0, sizeof(set->freelist));
+       MemSetAligned(set->freelist, 0, sizeof(set->freelist));
        set->blocks = NULL;
        set->keeper = NULL;