Index: src/backend/utils/mmgr/mcxt.c =================================================================== RCS file: /cvsroot/pgsql-server/src/backend/utils/mmgr/mcxt.c,v retrieving revision 1.35 diff -c -c -r1.35 mcxt.c *** src/backend/utils/mmgr/mcxt.c 10 Nov 2002 02:17:25 -0000 1.35 --- src/backend/utils/mmgr/mcxt.c 11 Nov 2002 15:56:09 -0000 *************** *** 460,466 **** * function is called too many times, so we have a separate version. */ void * ! MemoryContextAllocZero(MemoryContext context, Size size) { void *ret; --- 460,466 ---- * function is called too many times, so we have a separate version. */ void * ! MemoryContextAllocZero(MemoryContext context, Size size, bool use_loop) { void *ret; *************** *** 471,477 **** (unsigned long) size); ret = (*context->methods->alloc) (context, size); ! MemSet(ret, 0, size); return ret; } --- 471,477 ---- (unsigned long) size); ret = (*context->methods->alloc) (context, size); ! MemSetLoop(ret, 0, size, use_loop); return ret; } Index: src/include/c.h =================================================================== RCS file: /cvsroot/pgsql-server/src/include/c.h,v retrieving revision 1.131 diff -c -c -r1.131 c.h *** src/include/c.h 11 Nov 2002 03:02:19 -0000 1.131 --- src/include/c.h 11 Nov 2002 15:56:12 -0000 *************** *** 577,601 **** * memset() functions. More research needs to be done, perhaps with * platform-specific MEMSET_LOOP_LIMIT values or tests in configure. * * bjm 2002-10-08 */ ! #define MemSet(start, val, len) \ do \ { \ ! int32 * _start = (int32 *) (start); \ ! int _val = (val); \ ! Size _len = (len); \ ! \ ! if ((( ((long) _start) | _len) & INT_ALIGN_MASK) == 0 && \ ! _val == 0 && \ ! _len <= MEMSET_LOOP_LIMIT) \ { \ ! int32 * _stop = (int32 *) ((char *) _start + _len); \ while (_start < _stop) \ *_start++ = 0; \ } \ else \ ! memset((char *) _start, _val, _len); \ } while (0) #define MEMSET_LOOP_LIMIT 1024 --- 577,613 ---- * memset() functions. More research needs to be done, perhaps with * platform-specific MEMSET_LOOP_LIMIT values or tests in configure. * + * MemSet has been split into two parts so MemSetTest can be optimized + * away for constant 'val' and 'len'. This is used by palloc0(). + * + * Note, arguments are evaluated more than once. + * * bjm 2002-10-08 */ ! #define MemSetTest(val, len) \ ! ( ((len) & INT_ALIGN_MASK) == 0 && \ ! (len) <= MEMSET_LOOP_LIMIT && \ ! (val) == 0 ) ! ! #define MemSetLoop(start, val, len, use_loop) \ do \ { \ ! if (use_loop && ((long)(start) & INT_ALIGN_MASK) == 0 ) \ { \ ! int32 * _start = (int32 *) (start); \ ! int32 * _stop = (int32 *) ((char *) _start + (len)); \ ! \ while (_start < _stop) \ *_start++ = 0; \ } \ else \ ! memset((char *)(start), (val), (len)); \ ! } while (0) ! ! #define MemSet(start, val, len) \ ! do \ ! { \ ! MemSetLoop(start, val, len, MemSetTest(val, len)); \ } while (0) #define MEMSET_LOOP_LIMIT 1024 Index: src/include/utils/palloc.h =================================================================== RCS file: /cvsroot/pgsql-server/src/include/utils/palloc.h,v retrieving revision 1.22 diff -c -c -r1.22 palloc.h *** src/include/utils/palloc.h 10 Nov 2002 02:17:25 -0000 1.22 --- src/include/utils/palloc.h 11 Nov 2002 15:56:14 -0000 *************** *** 46,56 **** * Fundamental memory-allocation operations (more are in utils/memutils.h) */ extern void *MemoryContextAlloc(MemoryContext context, Size size); ! extern void *MemoryContextAllocZero(MemoryContext context, Size size); #define palloc(sz) MemoryContextAlloc(CurrentMemoryContext, (sz)) ! #define palloc0(sz) MemoryContextAllocZero(CurrentMemoryContext, (sz)) extern void pfree(void *pointer); --- 46,57 ---- * Fundamental memory-allocation operations (more are in utils/memutils.h) */ extern void *MemoryContextAlloc(MemoryContext context, Size size); ! extern void *MemoryContextAllocZero(MemoryContext context, Size size, bool use_loop); #define palloc(sz) MemoryContextAlloc(CurrentMemoryContext, (sz)) ! #define palloc0(sz) MemoryContextAllocZero(CurrentMemoryContext, (sz), \ ! MemSetTest(0, (sz))) extern void pfree(void *pointer);