1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-27 16:51:06 -07:00

Function implementations call the macro implementations, to reduce the burden of keeping the functions and macros consistent.

Copied from Perforce
 Change: 194418
This commit is contained in:
Gareth Rees 2018-07-05 09:28:01 +01:00
parent 2564ffcb61
commit ae3cc16e4b
3 changed files with 49 additions and 35 deletions

View file

@ -4,6 +4,13 @@
* Copyright (c) 2014-2016 Ravenbrook Limited. See end of file for license.
*
* .design: <design/land/>
*
* .critical.macros: In manual-allocation-bound programs using MVFF,
* the Land generic functions are on the critical path via mps_free.
* In non-checking varieties we provide macro alternatives (in mpm.h)
* to these functions that call the underlying methods directly,
* giving a few percent improvement in performance but skipping the
* re-entrancy checking provided by landEnter and landLeave.
*/
#include "mpm.h"
@ -143,9 +150,6 @@ void LandFinish(Land land)
/* LandSize -- return the total size of ranges in land
*
* See <design/land/#function.size>
*
* .size.critical: In manual-allocation-bound programs using MVFF this
* is on the critical path.
*/
Size (LandSize)(Land land)
@ -153,16 +157,13 @@ Size (LandSize)(Land land)
/* .enter-leave.simple */
AVERC(Land, land);
return Method(Land, land, sizeMethod)(land);
return LandSizeMacro(land);
}
/* LandInsert -- insert range of addresses into land
*
* See <design/land/#function.insert>
*
* .insert.critical: In manual-allocation-bound programs using MVFF
* this is on the critical path.
*/
Res (LandInsert)(Range rangeReturn, Land land, Range range)
@ -176,7 +177,7 @@ Res (LandInsert)(Range rangeReturn, Land land, Range range)
AVER(!RangeIsEmpty(range));
landEnter(land);
res = Method(Land, land, insert)(rangeReturn, land, range);
res = LandInsertMacro(rangeReturn, land, range);
landLeave(land);
return res;
@ -198,7 +199,7 @@ Res (LandDelete)(Range rangeReturn, Land land, Range range)
AVER(RangeIsAligned(range, land->alignment));
landEnter(land);
res = Method(Land, land, delete)(rangeReturn, land, range);
res = LandDeleteMacro(rangeReturn, land, range);
landLeave(land);
return res;
@ -208,9 +209,6 @@ Res (LandDelete)(Range rangeReturn, Land land, Range range)
/* LandIterate -- iterate over isolated ranges of addresses in land
*
* See <design/land/#function.iterate>
*
* .iterate.critical: In manual-allocation-bound programs using MVFF
* this is on the critical path.
*/
Bool (LandIterate)(Land land, LandVisitor visitor, void *closure)
@ -220,7 +218,7 @@ Bool (LandIterate)(Land land, LandVisitor visitor, void *closure)
AVER(FUNCHECK(visitor));
landEnter(land);
b = Method(Land, land, iterate)(land, visitor, closure);
b = LandIterateMacro(land, visitor, closure);
landLeave(land);
return b;
@ -240,7 +238,7 @@ Bool (LandIterateAndDelete)(Land land, LandDeleteVisitor visitor, void *closure)
AVER(FUNCHECK(visitor));
landEnter(land);
b = Method(Land, land, iterateAndDelete)(land, visitor, closure);
b = LandIterateAndDeleteMacro(land, visitor, closure);
landLeave(land);
return b;
@ -263,8 +261,7 @@ Bool (LandFindFirst)(Range rangeReturn, Range oldRangeReturn, Land land, Size si
AVERT(FindDelete, findDelete);
landEnter(land);
b = Method(Land, land, findFirst)(rangeReturn, oldRangeReturn, land, size,
findDelete);
b = LandFindFirstMacro(rangeReturn, oldRangeReturn, land, size, findDelete);
landLeave(land);
return b;
@ -287,8 +284,7 @@ Bool (LandFindLast)(Range rangeReturn, Range oldRangeReturn, Land land, Size siz
AVERT(FindDelete, findDelete);
landEnter(land);
b = Method(Land, land, findLast)(rangeReturn, oldRangeReturn, land, size,
findDelete);
b = LandFindLastMacro(rangeReturn, oldRangeReturn, land, size, findDelete);
landLeave(land);
return b;
@ -311,8 +307,7 @@ Bool (LandFindLargest)(Range rangeReturn, Range oldRangeReturn, Land land, Size
AVERT(FindDelete, findDelete);
landEnter(land);
b = Method(Land, land, findLargest)(rangeReturn, oldRangeReturn, land, size,
findDelete);
b = LandFindLargestMacro(rangeReturn, oldRangeReturn, land, size, findDelete);
landLeave(land);
return b;
@ -337,8 +332,8 @@ Res (LandFindInZones)(Bool *foundReturn, Range rangeReturn, Range oldRangeReturn
AVERT(Bool, high);
landEnter(land);
res = Method(Land, land, findInZones)(foundReturn, rangeReturn, oldRangeReturn,
land, size, zoneSet, high);
res = LandFindInZonesMacro(foundReturn, rangeReturn, oldRangeReturn,
land, size, zoneSet, high);
landLeave(land);
return res;
@ -400,7 +395,7 @@ Bool (LandFlush)(Land dest, Land src)
AVERC(Land, dest);
AVERC(Land, src);
return LandIterateAndDelete(src, LandFlushVisitor, dest);
return LandFlushMacro(dest, src);
}

View file

@ -7,6 +7,12 @@
* .trans.bufferinit: The Buffer data structure has an Init field and
* an Init method, there's a name clash. We resolve this by calling the
* accessor BufferGetInit.
*
* .critical.macros: In manual-allocation-bound programs using MVFF,
* PoolFree and the Land generic functions are on the critical path
* via mps_free. In non-checking varieties we provide macro
* alternatives to these functions that call the underlying methods
* directly, giving a few percent improvement in performance.
*/
#ifndef mpm_h
@ -263,8 +269,10 @@ extern PoolDebugMixin PoolNoDebugMixin(Pool pool);
extern BufferClass PoolNoBufferClass(void);
extern Size PoolNoSize(Pool pool);
/* See .critical.macros. */
#define PoolFreeMacro(pool, old, size) Method(Pool, pool, free)(pool, old, size)
#if !defined(AVER_AND_CHECK_ALL)
#define PoolFree(pool, old, size) Method(Pool, pool, free)(pool, old, size)
#define PoolFree(pool, old, size) PoolFreeMacro(pool, old, size)
#endif /* !defined(AVER_AND_CHECK_ALL) */
/* Abstract Pool Classes Interface -- see <code/poolabs.c> */
@ -982,17 +990,28 @@ extern Bool (LandFlush)(Land dest, Land src);
extern Size LandSlowSize(Land land);
extern Bool LandClassCheck(LandClass klass);
/* See .critical.macros. */
#define LandSizeMacro(land) Method(Land, land, sizeMethod)(land)
#define LandInsertMacro(rangeReturn, land, range) Method(Land, land, insert)(rangeReturn, land, range)
#define LandDeleteMacro(rangeReturn, land, range) Method(Land, land, delete)(rangeReturn, land, range)
#define LandIterateMacro(land, visitor, closure) Method(Land, land, iterate)(land, visitor, closure)
#define LandIterateAndDeleteMacro(land, visitor, closure) Method(Land, land, iterateAndDelete)(land, visitor, closure)
#define LandFindFirstMacro(rangeReturn, oldRangeReturn, land, size, findDelete) Method(Land, land, findFirst)(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindLastMacro(rangeReturn, oldRangeReturn, land, size, findDelete) Method(Land, land, findLast)(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindLargestMacro(rangeReturn, oldRangeReturn, land, size, findDelete) Method(Land, land, findLargest)(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindInZonesMacro(foundReturn, rangeReturn, oldRangeReturn, land, size, zoneSet, high) Method(Land, land, findInZones)(foundReturn, rangeReturn, oldRangeReturn, land, size, zoneSet, high)
#define LandFlushMacro(dest, src) LandIterateAndDelete(src, LandFlushVisitor, dest)
#if !defined(AVER_AND_CHECK_ALL)
#define LandSize(land) Method(Land, land, sizeMethod)(land)
#define LandInsert(rangeReturn, land, range) Method(Land, land, insert)(rangeReturn, land, range)
#define LandDelete(rangeReturn, land, range) Method(Land, land, delete)(rangeReturn, land, range)
#define LandIterate(land, visitor, closure) Method(Land, land, iterate)(land, visitor, closure)
#define LandIterateAndDelete(land, visitor, closure) Method(Land, land, iterateAndDelete)(land, visitor, closure)
#define LandFindFirst(rangeReturn, oldRangeReturn, land, size, findDelete) Method(Land, land, findFirst)(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindLast(rangeReturn, oldRangeReturn, land, size, findDelete) Method(Land, land, findLast)(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindLargest(rangeReturn, oldRangeReturn, land, size, findDelete) Method(Land, land, findLargest)(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindInZones(foundReturn, rangeReturn, oldRangeReturn, land, size, zoneSet, high) Method(Land, land, findInZones)(foundReturn, rangeReturn, oldRangeReturn, land, size, zoneSet, high)
#define LandFlush(dest, src) LandIterateAndDelete(src, LandFlushVisitor, dest)
#define LandSize(land) LandSizeMacro(land)
#define LandInsert(rangeReturn, land, range) LandInsertMacro(rangeReturn, land, range)
#define LandDelete(rangeReturn, land, range) LandDeleteMacro(rangeReturn, land, range)
#define LandIterate(land, visitor, closure) LandIterateMacro(land, visitor, closure)
#define LandIterateAndDelete(land, visitor, closure) LandIterateAndDeleteMacro(land, visitor, closure)
#define LandFindFirst(rangeReturn, oldRangeReturn, land, size, findDelete) LandFindFirstMacro(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindLast(rangeReturn, oldRangeReturn, land, size, findDelete) LandFindLastMacro(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindLargest(rangeReturn, oldRangeReturn, land, size, findDelete) LandFindLargestMacro(rangeReturn, oldRangeReturn, land, size, findDelete)
#define LandFindInZones(foundReturn, rangeReturn, oldRangeReturn, land, size, zoneSet, high) LandFindInZonesMacro(foundReturn, rangeReturn, oldRangeReturn, land, size, zoneSet, high)
#define LandFlush(dest, src) LandFlushMacro(dest, src)
#endif /* !defined(AVER_AND_CHECK_ALL) */
DECLARE_CLASS(Inst, LandClass, InstClass);

View file

@ -250,7 +250,7 @@ void (PoolFree)(Pool pool, Addr old, Size size)
AVER(AddrIsAligned(old, pool->alignment));
AVER(PoolHasRange(pool, old, AddrAdd(old, size)));
Method(Pool, pool, free)(pool, old, size);
PoolFreeMacro(pool, old, size);
EVENT3(PoolFree, pool, old, size);
}