1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-17 11:20:39 -08:00

Converting pools to use keyword arguments, mostly, and so far inconsistently, but at least it compiles.

Copied from Perforce
 Change: 181635
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Brooksby 2013-05-08 16:21:12 +01:00
parent f774413584
commit 07f446a450
40 changed files with 601 additions and 150 deletions

View file

@ -301,10 +301,8 @@ Res ControlInit(Arena arena)
Res res; Res res;
AVERT(Arena, arena); AVERT(Arena, arena);
res = PoolInit(&arena->controlPoolStruct.poolStruct, res = PoolInit(&arena->controlPoolStruct.poolStruct, arena,
arena, PoolClassMV(), PoolClassMV(), argsNone);
ARENA_CONTROL_EXTENDBY, ARENA_CONTROL_AVGSIZE,
ARENA_CONTROL_MAXSIZE);
if (res != ResOK) if (res != ResOK)
return res; return res;
arena->poolReady = TRUE; /* <design/arena/#pool.ready> */ arena->poolReady = TRUE; /* <design/arena/#pool.ready> */

View file

@ -337,7 +337,7 @@ static void testPageTable(ArenaClass class, Size size, Addr addr)
Arena arena; Pool pool; Arena arena; Pool pool;
Size pageSize; Size pageSize;
Count tractsPerPage; Count tractsPerPage;
ArgStruct args[3]; ArgStruct args[4];
args[0].key = MPS_KEY_ARENA_SIZE; args[0].key = MPS_KEY_ARENA_SIZE;
args[0].val.size = size; args[0].val.size = size;
@ -346,9 +346,7 @@ static void testPageTable(ArenaClass class, Size size, Addr addr)
args[2].key = MPS_KEY_ARGS_END; args[2].key = MPS_KEY_ARGS_END;
die(ArenaCreate(&arena, class, args), "ArenaCreate"); die(ArenaCreate(&arena, class, args), "ArenaCreate");
die(PoolCreate(&pool, arena, PoolClassMV(), die(PoolCreate(&pool, arena, PoolClassMV(), argsNone), "PoolCreate");
(Size)65536, (Size)32, (Size)65536),
"PoolCreate");
pageSize = ArenaAlign(arena); pageSize = ArenaAlign(arena);
tractsPerPage = pageSize / sizeof(TractStruct); tractsPerPage = pageSize / sizeof(TractStruct);

View file

@ -25,6 +25,8 @@ Bool ArgCheckCant(Arg arg) {
const KeyStruct _mps_key_varargs = {KeySig, "VARARGS", ArgCheckCant}; const KeyStruct _mps_key_varargs = {KeySig, "VARARGS", ArgCheckCant};
ArgStruct mps_args_none[] = {{MPS_KEY_ARGS_END}};
/* KeyCheck -- check the validity of an argument key */ /* KeyCheck -- check the validity of an argument key */

View file

@ -273,6 +273,7 @@ Res CBSInit(Arena arena, CBS cbs, void *owner,
Bool mayUseInline, Bool fastFind) Bool mayUseInline, Bool fastFind)
{ {
Res res; Res res;
ArgStruct args[3];
AVERT(Arena, arena); AVERT(Arena, arena);
AVER(new == NULL || FUNCHECK(new)); AVER(new == NULL || FUNCHECK(new));
@ -286,8 +287,12 @@ Res CBSInit(Arena arena, CBS cbs, void *owner,
SplayTreeInit(splayTreeOfCBS(cbs), &cbsSplayCompare, SplayTreeInit(splayTreeOfCBS(cbs), &cbsSplayCompare,
fastFind ? &cbsUpdateNode : NULL); fastFind ? &cbsUpdateNode : NULL);
res = PoolCreate(&(cbs->blockPool), arena, PoolClassMFS(), args[0].key = MPS_KEY_MFS_UNIT_SIZE;
sizeof(CBSBlockStruct) * 64, sizeof(CBSBlockStruct)); args[0].val.size = sizeof(CBSBlockStruct);
args[1].key = MPS_KEY_MFS_EXTEND_BY;
args[1].val.size = sizeof(CBSBlockStruct) * 64;
args[2].key = MPS_KEY_ARGS_END;
res = PoolCreate(&(cbs->blockPool), arena, PoolClassMFS(), args);
if (res != ResOK) if (res != ResOK)
return res; return res;
cbs->splayTreeSize = 0; cbs->splayTreeSize = 0;

View file

@ -238,6 +238,18 @@
#define EPVMDefaultSubsequentSegSIZE ((Size)64 * 1024) #define EPVMDefaultSubsequentSegSIZE ((Size)64 * 1024)
/* Pool MV Configuration -- see <code/poolmv.c> */
#define MV_EXTEND_BY_DEFAULT ((Size)4096)
#define MV_AVG_SIZE_DEFAULT ((Size)32)
#define MV_MAX_SIZE_DEFAULT ((Size)65536)
/* Pool MFS Configuration -- see <code/poolmfs.c> */
#define MFS_EXTEND_BY_DEFAULT ((Size)65536)
/* Arena Configuration -- see <code/arena.c> /* Arena Configuration -- see <code/arena.c>
* *
* .client.seg-size: ARENA_CLIENT_PAGE_SIZE is the size in bytes of a * .client.seg-size: ARENA_CLIENT_PAGE_SIZE is the size in bytes of a
@ -245,10 +257,6 @@
* with no particular justification. * with no particular justification.
*/ */
#define ARENA_CONTROL_EXTENDBY ((Size)4096)
#define ARENA_CONTROL_AVGSIZE ((Size)32)
#define ARENA_CONTROL_MAXSIZE ((Size)65536)
#define ArenaPollALLOCTIME (65536.0) #define ArenaPollALLOCTIME (65536.0)
#define ARENA_ZONESHIFT ((Shift)20) #define ARENA_ZONESHIFT ((Shift)20)

View file

@ -117,17 +117,32 @@ static Bool PoolDebugOptionsCheck(PoolDebugOptions opt)
* Someday, this could be split into fence and tag init methods. * Someday, this could be split into fence and tag init methods.
*/ */
static Res DebugPoolInit(Pool pool, va_list args) const KeyStruct _mps_key_pool_debug_option = {
KeySig, "POOL_DEBUG_OPTION", ArgCheckCant /* FIXME: ArgCheckPoolDebugOption */
};
static Res DebugPoolInit(Pool pool, ArgList args)
{ {
Res res; Res res;
PoolDebugOptions options; PoolDebugOptions options;
PoolDebugMixin debug; PoolDebugMixin debug;
TagInitMethod tagInit; TagInitMethod tagInit;
Size tagSize; Size tagSize;
ArgStruct arg;
AVERT(Pool, pool); AVERT(Pool, pool);
options = va_arg(args, PoolDebugOptions);
/* FIXME: Split this structure into separate keys */
/* FIXME: Can't use varargs -- update docs. */
if (ArgPick(&arg, args, MPS_KEY_POOL_DEBUG_OPTION))
options = (PoolDebugOptions)arg.val.pool_debug_option;
else {
res = ResPARAM;
goto failParam;
}
AVERT(PoolDebugOptions, options); AVERT(PoolDebugOptions, options);
/* @@@@ Tag parameters should be taken from options, but tags have */ /* @@@@ Tag parameters should be taken from options, but tags have */
/* not been published yet. */ /* not been published yet. */
tagInit = NULL; tagSize = 0; tagInit = NULL; tagSize = 0;
@ -173,11 +188,16 @@ static Res DebugPoolInit(Pool pool, va_list args)
/* tag init */ /* tag init */
debug->tagInit = tagInit; debug->tagInit = tagInit;
if (debug->tagInit != NULL) { if (debug->tagInit != NULL) {
ArgStruct pcArgs[3];
debug->tagSize = tagSize + sizeof(tagStruct) - 1; debug->tagSize = tagSize + sizeof(tagStruct) - 1;
/* This pool has to be like the arena control pool: the blocks */ /* This pool has to be like the arena control pool: the blocks */
/* allocated must be accessible using void*. */ /* allocated must be accessible using void*. */
res = PoolCreate(&debug->tagPool, PoolArena(pool), PoolClassMFS(), pcArgs[0].key = MPS_KEY_MFS_EXTEND_BY;
debug->tagSize, debug->tagSize); pcArgs[0].val.size = debug->tagSize; /* FIXME: Really? */
pcArgs[1].key = MPS_KEY_MFS_UNIT_SIZE;
pcArgs[1].val.size = debug->tagSize;
pcArgs[2].key = MPS_KEY_ARGS_END;
res = PoolCreate(&debug->tagPool, PoolArena(pool), PoolClassMFS(), pcArgs);
if (res != ResOK) if (res != ResOK)
goto tagFail; goto tagFail;
debug->missingTags = 0; debug->missingTags = 0;
@ -191,6 +211,7 @@ static Res DebugPoolInit(Pool pool, va_list args)
tagFail: tagFail:
alignFail: alignFail:
SuperclassOfPool(pool)->finish(pool); SuperclassOfPool(pool)->finish(pool);
failParam:
return res; return res;
} }

View file

@ -834,7 +834,7 @@ Res ArenaFinalize(Arena arena, Ref obj)
if (!arena->isFinalPool) { if (!arena->isFinalPool) {
Pool pool; Pool pool;
res = PoolCreate(&pool, arena, PoolClassMRG()); res = PoolCreate(&pool, arena, PoolClassMRG(), argsNone);
if (res != ResOK) if (res != ResOK)
return res; return res;
arena->finalPool = pool; arena->finalPool = pool;

View file

@ -132,6 +132,7 @@ extern Bool ResIsAllocFailure(Res res);
/* Argument Lists */ /* Argument Lists */
#define argsNone mps_args_none
extern Bool KeyCheck(Key key); extern Bool KeyCheck(Key key);
extern Bool ArgCheck(Arg arg); extern Bool ArgCheck(Arg arg);
extern Bool ArgListCheck(ArgList args); extern Bool ArgListCheck(ArgList args);
@ -187,8 +188,7 @@ extern char *MPSVersion(void);
/* Pool Interface -- see impl.c.pool */ /* Pool Interface -- see impl.c.pool */
extern Res PoolInit(Pool pool, Arena arena, PoolClass class, ...); extern Res PoolInit(Pool pool, Arena arena, PoolClass class, ArgList args);
extern Res PoolInitV(Pool pool, Arena arena, PoolClass class, va_list args);
extern void PoolFinish(Pool pool); extern void PoolFinish(Pool pool);
extern Bool PoolClassCheck(PoolClass class); extern Bool PoolClassCheck(PoolClass class);
extern Bool PoolCheck(Pool pool); extern Bool PoolCheck(Pool pool);
@ -205,9 +205,8 @@ extern double PoolMutatorAllocSize(Pool pool);
extern Bool PoolOfAddr(Pool *poolReturn, Arena arena, Addr addr); extern Bool PoolOfAddr(Pool *poolReturn, Arena arena, Addr addr);
extern Bool PoolHasAddr(Pool pool, Addr addr); extern Bool PoolHasAddr(Pool pool, Addr addr);
extern Res PoolCreate(Pool *poolReturn, Arena arena, PoolClass class, ...); extern Res PoolCreate(Pool *poolReturn, Arena arena, PoolClass class,
extern Res PoolCreateV(Pool *poolReturn, Arena arena, PoolClass class, ArgList args);
va_list arg);
extern void PoolDestroy(Pool pool); extern void PoolDestroy(Pool pool);
extern BufferClass PoolDefaultBufferClass(Pool pool); extern BufferClass PoolDefaultBufferClass(Pool pool);
extern Res PoolAlloc(Addr *pReturn, Pool pool, Size size, extern Res PoolAlloc(Addr *pReturn, Pool pool, Size size,
@ -229,7 +228,7 @@ extern void PoolTraceEnd(Pool pool, Trace trace);
extern void PoolWalk(Pool pool, Seg seg, FormattedObjectsStepMethod f, extern void PoolWalk(Pool pool, Seg seg, FormattedObjectsStepMethod f,
void *v, size_t s); void *v, size_t s);
extern void PoolFreeWalk(Pool pool, FreeBlockStepMethod f, void *p); extern void PoolFreeWalk(Pool pool, FreeBlockStepMethod f, void *p);
extern Res PoolTrivInit(Pool pool, va_list arg); extern Res PoolTrivInit(Pool pool, ArgList arg);
extern void PoolTrivFinish(Pool pool); extern void PoolTrivFinish(Pool pool);
extern Res PoolNoAlloc(Addr *pReturn, Pool pool, Size size, extern Res PoolNoAlloc(Addr *pReturn, Pool pool, Size size,
Bool withReservoirPermit); Bool withReservoirPermit);

View file

@ -182,7 +182,7 @@ typedef Res (*BufferDescribeMethod)(Buffer buffer, mps_lib_FILE *stream);
/* Order of types corresponds to PoolClassStruct in <code/mpmst.h> */ /* Order of types corresponds to PoolClassStruct in <code/mpmst.h> */
typedef Res (*PoolInitMethod)(Pool pool, va_list args); typedef Res (*PoolInitMethod)(Pool pool, ArgList args);
typedef void (*PoolFinishMethod)(Pool pool); typedef void (*PoolFinishMethod)(Pool pool);
typedef Res (*PoolAllocMethod)(Addr *pReturn, Pool pool, Size size, typedef Res (*PoolAllocMethod)(Addr *pReturn, Pool pool, Size size,
Bool withReservoirPermit); Bool withReservoirPermit);

View file

@ -107,6 +107,10 @@ typedef struct mps_arg_s {
size_t size; size_t size;
va_list varargs; va_list varargs;
mps_addr_t addr; mps_addr_t addr;
mps_fmt_t format;
mps_chain_t chain;
struct mps_pool_debug_option_s *pool_debug_option;
mps_addr_t (*addr_method)(mps_addr_t);
} val; } val;
} mps_arg_s; } mps_arg_s;
@ -120,6 +124,12 @@ extern const struct mps_key_s _mps_key_varargs;
#define MPS_KEY_VARARGS (&_mps_key_varargs) #define MPS_KEY_VARARGS (&_mps_key_varargs)
extern const struct mps_key_s _mps_key_arena_size; extern const struct mps_key_s _mps_key_arena_size;
#define MPS_KEY_ARENA_SIZE (&_mps_key_arena_size) #define MPS_KEY_ARENA_SIZE (&_mps_key_arena_size)
extern const struct mps_key_s _mps_key_format;
#define MPS_KEY_FORMAT (&_mps_key_format)
extern const struct mps_key_s _mps_key_chain;
#define MPS_KEY_CHAIN (&_mps_key_chain)
extern mps_arg_s mps_args_none[];
/* <a id="message.types"> Keep in sync with /* <a id="message.types"> Keep in sync with
@ -347,6 +357,8 @@ extern mps_res_t mps_pool_create(mps_pool_t *, mps_arena_t,
mps_class_t, ...); mps_class_t, ...);
extern mps_res_t mps_pool_create_v(mps_pool_t *, mps_arena_t, extern mps_res_t mps_pool_create_v(mps_pool_t *, mps_arena_t,
mps_class_t, va_list); mps_class_t, va_list);
extern mps_res_t mps_pool_create_k(mps_pool_t *, mps_arena_t,
mps_class_t, mps_arg_s []);
extern void mps_pool_destroy(mps_pool_t); extern void mps_pool_destroy(mps_pool_t);
/* .gen-param: This structure must match <code/chain.h#gen-param>. */ /* .gen-param: This structure must match <code/chain.h#gen-param>. */
@ -634,6 +646,9 @@ typedef struct mps_pool_debug_option_s {
size_t free_size; size_t free_size;
} mps_pool_debug_option_s; } mps_pool_debug_option_s;
extern const struct mps_key_s _mps_key_pool_debug_option;
#define MPS_KEY_POOL_DEBUG_OPTION (&_mps_key_pool_debug_option)
extern void mps_pool_check_fenceposts(mps_pool_t); extern void mps_pool_check_fenceposts(mps_pool_t);
extern void mps_pool_check_free_space(mps_pool_t); extern void mps_pool_check_free_space(mps_pool_t);

View file

@ -1038,6 +1038,51 @@
3114A6C6156E9815001E0AA3 /* mpseventcnv */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mpseventcnv; sourceTree = BUILT_PRODUCTS_DIR; }; 3114A6C6156E9815001E0AA3 /* mpseventcnv */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mpseventcnv; sourceTree = BUILT_PRODUCTS_DIR; };
3114A6D0156E9829001E0AA3 /* eventcnv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = eventcnv.c; sourceTree = "<group>"; }; 3114A6D0156E9829001E0AA3 /* eventcnv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = eventcnv.c; sourceTree = "<group>"; };
3114A6D9156E9950001E0AA3 /* eventpro.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = eventpro.c; sourceTree = "<group>"; }; 3114A6D9156E9950001E0AA3 /* eventpro.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = eventpro.c; sourceTree = "<group>"; };
311F2F5017398AD500C15B6A /* boot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = boot.h; sourceTree = "<group>"; };
311F2F5117398AE900C15B6A /* bt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bt.h; sourceTree = "<group>"; };
311F2F5217398AE900C15B6A /* cbs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cbs.h; sourceTree = "<group>"; };
311F2F5317398AE900C15B6A /* chain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = chain.h; sourceTree = "<group>"; };
311F2F5417398AE900C15B6A /* check.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = check.h; sourceTree = "<group>"; };
311F2F5517398AE900C15B6A /* clock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = clock.h; sourceTree = "<group>"; };
311F2F5617398AE900C15B6A /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
311F2F5717398AE900C15B6A /* dbgpool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dbgpool.h; sourceTree = "<group>"; };
311F2F5817398AE900C15B6A /* event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = event.h; sourceTree = "<group>"; };
311F2F5917398AE900C15B6A /* eventcom.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = eventcom.h; sourceTree = "<group>"; };
311F2F5A17398AE900C15B6A /* eventdef.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = eventdef.h; sourceTree = "<group>"; };
311F2F5B17398AE900C15B6A /* eventpro.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = eventpro.h; sourceTree = "<group>"; };
311F2F5C17398AE900C15B6A /* eventrep.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = eventrep.h; sourceTree = "<group>"; };
311F2F5D17398B0400C15B6A /* lo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lo.h; sourceTree = "<group>"; };
311F2F5E17398B0E00C15B6A /* lock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lock.h; sourceTree = "<group>"; };
311F2F5F17398B0E00C15B6A /* meter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = meter.h; sourceTree = "<group>"; };
311F2F6017398B0E00C15B6A /* misc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = misc.h; sourceTree = "<group>"; };
311F2F6117398B0E00C15B6A /* mpm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpm.h; sourceTree = "<group>"; };
311F2F6217398B1A00C15B6A /* mpmst.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpmst.h; sourceTree = "<group>"; };
311F2F6317398B1A00C15B6A /* mpmtypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpmtypes.h; sourceTree = "<group>"; };
311F2F6417398B1A00C15B6A /* mps.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mps.h; sourceTree = "<group>"; };
311F2F6517398B3B00C15B6A /* mpsacl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpsacl.h; sourceTree = "<group>"; };
311F2F6617398B3B00C15B6A /* mpsavm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpsavm.h; sourceTree = "<group>"; };
311F2F6717398B3B00C15B6A /* mpsio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpsio.h; sourceTree = "<group>"; };
311F2F6817398B3B00C15B6A /* mpslib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpslib.h; sourceTree = "<group>"; };
311F2F6917398B3B00C15B6A /* mpstd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpstd.h; sourceTree = "<group>"; };
311F2F6A17398B4C00C15B6A /* mpsw3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpsw3.h; sourceTree = "<group>"; };
311F2F6B17398B4C00C15B6A /* mpswin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpswin.h; sourceTree = "<group>"; };
311F2F6C17398B5800C15B6A /* osxc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = osxc.h; sourceTree = "<group>"; };
311F2F6D17398B6300C15B6A /* prmci3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = prmci3.h; sourceTree = "<group>"; };
311F2F6E17398B6300C15B6A /* prmci6.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = prmci6.h; sourceTree = "<group>"; };
311F2F6F17398B6300C15B6A /* prmcix.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = prmcix.h; sourceTree = "<group>"; };
311F2F7017398B6300C15B6A /* prmcw3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = prmcw3.h; sourceTree = "<group>"; };
311F2F7117398B7100C15B6A /* protocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = protocol.h; sourceTree = "<group>"; };
311F2F7217398B7100C15B6A /* pthrdext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pthrdext.h; sourceTree = "<group>"; };
311F2F7317398B7100C15B6A /* ring.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ring.h; sourceTree = "<group>"; };
311F2F7417398B7100C15B6A /* sac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sac.h; sourceTree = "<group>"; };
311F2F7517398B8E00C15B6A /* sc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sc.h; sourceTree = "<group>"; };
311F2F7617398B8E00C15B6A /* splay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = splay.h; sourceTree = "<group>"; };
311F2F7717398B8E00C15B6A /* ss.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ss.h; sourceTree = "<group>"; };
311F2F7817398B8E00C15B6A /* th.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = th.h; sourceTree = "<group>"; };
311F2F7917398B8E00C15B6A /* thw3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = thw3.h; sourceTree = "<group>"; };
311F2F7A17398B8E00C15B6A /* tract.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tract.h; sourceTree = "<group>"; };
311F2F7B17398E7600C15B6A /* poolmv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = poolmv.h; sourceTree = "<group>"; };
311F2F7C17398E9A00C15B6A /* mpscmv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpscmv.h; sourceTree = "<group>"; };
3124CAB8156BE3EC00753214 /* awlut */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = awlut; sourceTree = BUILT_PRODUCTS_DIR; }; 3124CAB8156BE3EC00753214 /* awlut */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = awlut; sourceTree = BUILT_PRODUCTS_DIR; };
3124CAC2156BE40100753214 /* awlut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awlut.c; sourceTree = "<group>"; }; 3124CAC2156BE40100753214 /* awlut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awlut.c; sourceTree = "<group>"; };
3124CAC6156BE48D00753214 /* fmtdy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmtdy.c; sourceTree = "<group>"; }; 3124CAC6156BE48D00753214 /* fmtdy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmtdy.c; sourceTree = "<group>"; };
@ -1053,6 +1098,9 @@
317B3C2A1731830100F9A469 /* arg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arg.c; sourceTree = "<group>"; }; 317B3C2A1731830100F9A469 /* arg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arg.c; sourceTree = "<group>"; };
31A47BA3156C1E130039B1C2 /* mps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mps.c; sourceTree = "<group>"; }; 31A47BA3156C1E130039B1C2 /* mps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mps.c; sourceTree = "<group>"; };
31A47BA5156C1E5E0039B1C2 /* ssixi3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ssixi3.c; sourceTree = "<group>"; }; 31A47BA5156C1E5E0039B1C2 /* ssixi3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ssixi3.c; sourceTree = "<group>"; };
31CD33BB173A9F1500524741 /* mpscams.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpscams.h; sourceTree = "<group>"; };
31CD33BC173A9F1500524741 /* poolams.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = poolams.c; sourceTree = "<group>"; };
31CD33BD173A9F1500524741 /* poolams.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = poolams.h; sourceTree = "<group>"; };
31D60006156D3C5F00337B26 /* segsmss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = segsmss.c; sourceTree = "<group>"; }; 31D60006156D3C5F00337B26 /* segsmss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = segsmss.c; sourceTree = "<group>"; };
31D6000D156D3CB200337B26 /* awluthe */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = awluthe; sourceTree = BUILT_PRODUCTS_DIR; }; 31D6000D156D3CB200337B26 /* awluthe */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = awluthe; sourceTree = BUILT_PRODUCTS_DIR; };
31D60017156D3CC300337B26 /* awluthe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awluthe.c; sourceTree = "<group>"; }; 31D60017156D3CC300337B26 /* awluthe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awluthe.c; sourceTree = "<group>"; };
@ -1120,6 +1168,11 @@
31EEAC74156AB58E00714D05 /* mpmss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mpmss.c; sourceTree = SOURCE_ROOT; }; 31EEAC74156AB58E00714D05 /* mpmss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mpmss.c; sourceTree = SOURCE_ROOT; };
31EEAC9E156AB73400714D05 /* testlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = testlib.c; sourceTree = "<group>"; }; 31EEAC9E156AB73400714D05 /* testlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = testlib.c; sourceTree = "<group>"; };
31EEACA7156AB79800714D05 /* span.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = span.c; sourceTree = "<group>"; }; 31EEACA7156AB79800714D05 /* span.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = span.c; sourceTree = "<group>"; };
31F6CCA91739B0CF00C48748 /* mpscamc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpscamc.h; sourceTree = "<group>"; };
31F6CCAA1739B0CF00C48748 /* mpscawl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpscawl.h; sourceTree = "<group>"; };
31F6CCAB1739B0CF00C48748 /* mpsclo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpsclo.h; sourceTree = "<group>"; };
31F6CCAC1739B0CF00C48748 /* mpscmvff.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpscmvff.h; sourceTree = "<group>"; };
31F6CCAD1739B0CF00C48748 /* mpscsnc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mpscsnc.h; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -1572,38 +1625,82 @@
31EEAC03156AB23A00714D05 /* arenavm.c */, 31EEAC03156AB23A00714D05 /* arenavm.c */,
317B3C2A1731830100F9A469 /* arg.c */, 317B3C2A1731830100F9A469 /* arg.c */,
31EEAC3F156AB32500714D05 /* boot.c */, 31EEAC3F156AB32500714D05 /* boot.c */,
311F2F5017398AD500C15B6A /* boot.h */,
31EEAC27156AB2F200714D05 /* bt.c */, 31EEAC27156AB2F200714D05 /* bt.c */,
311F2F5117398AE900C15B6A /* bt.h */,
31EEAC19156AB2B200714D05 /* buffer.c */, 31EEAC19156AB2B200714D05 /* buffer.c */,
31EEAC40156AB32500714D05 /* cbs.c */, 31EEAC40156AB32500714D05 /* cbs.c */,
311F2F5217398AE900C15B6A /* cbs.h */,
311F2F5317398AE900C15B6A /* chain.h */,
311F2F5417398AE900C15B6A /* check.h */,
311F2F5517398AE900C15B6A /* clock.h */,
311F2F5617398AE900C15B6A /* config.h */,
31EEAC28156AB2F200714D05 /* dbgpool.c */, 31EEAC28156AB2F200714D05 /* dbgpool.c */,
311F2F5717398AE900C15B6A /* dbgpool.h */,
31EEAC29156AB2F200714D05 /* dbgpooli.c */, 31EEAC29156AB2F200714D05 /* dbgpooli.c */,
31EEAC41156AB32500714D05 /* diag.c */, 31EEAC41156AB32500714D05 /* diag.c */,
31EEAC2A156AB2F200714D05 /* event.c */, 31EEAC2A156AB2F200714D05 /* event.c */,
311F2F5817398AE900C15B6A /* event.h */,
311F2F5917398AE900C15B6A /* eventcom.h */,
311F2F5A17398AE900C15B6A /* eventdef.h */,
311F2F5B17398AE900C15B6A /* eventpro.h */,
311F2F5C17398AE900C15B6A /* eventrep.h */,
31EEAC1A156AB2B200714D05 /* format.c */, 31EEAC1A156AB2B200714D05 /* format.c */,
31EEAC07156AB27B00714D05 /* global.c */, 31EEAC07156AB27B00714D05 /* global.c */,
31EEAC2B156AB2F200714D05 /* ld.c */, 31EEAC2B156AB2F200714D05 /* ld.c */,
311F2F5E17398B0E00C15B6A /* lock.h */,
31EEAC08156AB27B00714D05 /* locus.c */, 31EEAC08156AB27B00714D05 /* locus.c */,
31EEAC2C156AB2F200714D05 /* message.c */, 31EEAC2C156AB2F200714D05 /* message.c */,
31EEAC42156AB32500714D05 /* meter.c */, 31EEAC42156AB32500714D05 /* meter.c */,
311F2F5F17398B0E00C15B6A /* meter.h */,
311F2F6017398B0E00C15B6A /* misc.h */,
31EEAC01156AB21B00714D05 /* mpm.c */, 31EEAC01156AB21B00714D05 /* mpm.c */,
311F2F6117398B0E00C15B6A /* mpm.h */,
311F2F6217398B1A00C15B6A /* mpmst.h */,
311F2F6317398B1A00C15B6A /* mpmtypes.h */,
311F2F6417398B1A00C15B6A /* mps.h */,
311F2F6517398B3B00C15B6A /* mpsacl.h */,
311F2F6617398B3B00C15B6A /* mpsavm.h */,
31EEABF5156AAF7C00714D05 /* mpsi.c */, 31EEABF5156AAF7C00714D05 /* mpsi.c */,
311F2F6717398B3B00C15B6A /* mpsio.h */,
311F2F6817398B3B00C15B6A /* mpslib.h */,
311F2F6917398B3B00C15B6A /* mpstd.h */,
311F2F6A17398B4C00C15B6A /* mpsw3.h */,
311F2F6B17398B4C00C15B6A /* mpswin.h */,
311F2F6C17398B5800C15B6A /* osxc.h */,
31EEAC09156AB27B00714D05 /* pool.c */, 31EEAC09156AB27B00714D05 /* pool.c */,
31EEAC0A156AB27B00714D05 /* poolabs.c */, 31EEAC0A156AB27B00714D05 /* poolabs.c */,
31EEAC2D156AB2F200714D05 /* poolmfs.c */, 31EEAC2D156AB2F200714D05 /* poolmfs.c */,
31EEAC2E156AB2F200714D05 /* poolmrg.c */, 31EEAC2E156AB2F200714D05 /* poolmrg.c */,
31EEAC2F156AB2F200714D05 /* poolmv.c */, 31EEAC2F156AB2F200714D05 /* poolmv.c */,
311F2F7B17398E7600C15B6A /* poolmv.h */,
311F2F7C17398E9A00C15B6A /* mpscmv.h */,
311F2F6D17398B6300C15B6A /* prmci3.h */,
311F2F6E17398B6300C15B6A /* prmci6.h */,
311F2F6F17398B6300C15B6A /* prmcix.h */,
311F2F7017398B6300C15B6A /* prmcw3.h */,
31EEAC0B156AB27B00714D05 /* protocol.c */, 31EEAC0B156AB27B00714D05 /* protocol.c */,
311F2F7117398B7100C15B6A /* protocol.h */,
311F2F7217398B7100C15B6A /* pthrdext.h */,
31EEAC1B156AB2B200714D05 /* ref.c */, 31EEAC1B156AB2B200714D05 /* ref.c */,
31EEAC0C156AB27B00714D05 /* reserv.c */, 31EEAC0C156AB27B00714D05 /* reserv.c */,
31EEAC30156AB2F200714D05 /* ring.c */, 31EEAC30156AB2F200714D05 /* ring.c */,
311F2F7317398B7100C15B6A /* ring.h */,
31EEAC1C156AB2B200714D05 /* root.c */, 31EEAC1C156AB2B200714D05 /* root.c */,
31EEAC31156AB2F200714D05 /* sac.c */, 31EEAC31156AB2F200714D05 /* sac.c */,
311F2F7417398B7100C15B6A /* sac.h */,
311F2F7517398B8E00C15B6A /* sc.h */,
31EEAC1D156AB2B200714D05 /* seg.c */, 31EEAC1D156AB2B200714D05 /* seg.c */,
31EEAC32156AB2F200714D05 /* shield.c */, 31EEAC32156AB2F200714D05 /* shield.c */,
31EEAC43156AB32500714D05 /* splay.c */, 31EEAC43156AB32500714D05 /* splay.c */,
311F2F7617398B8E00C15B6A /* splay.h */,
311F2F7717398B8E00C15B6A /* ss.h */,
311F2F7817398B8E00C15B6A /* th.h */,
311F2F7917398B8E00C15B6A /* thw3.h */,
31EEAC1E156AB2B200714D05 /* trace.c */, 31EEAC1E156AB2B200714D05 /* trace.c */,
31EEAC1F156AB2B200714D05 /* traceanc.c */, 31EEAC1F156AB2B200714D05 /* traceanc.c */,
31EEAC0D156AB27B00714D05 /* tract.c */, 31EEAC0D156AB27B00714D05 /* tract.c */,
311F2F7A17398B8E00C15B6A /* tract.h */,
31EEAC44156AB32500714D05 /* version.c */, 31EEAC44156AB32500714D05 /* version.c */,
31EEAC0E156AB27B00714D05 /* walk.c */, 31EEAC0E156AB27B00714D05 /* walk.c */,
); );
@ -1629,7 +1726,16 @@
31EEAC5A156AB40800714D05 /* Extra pools */ = { 31EEAC5A156AB40800714D05 /* Extra pools */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
311F2F5D17398B0400C15B6A /* lo.h */,
31F6CCA91739B0CF00C48748 /* mpscamc.h */,
31CD33BB173A9F1500524741 /* mpscams.h */,
31F6CCAA1739B0CF00C48748 /* mpscawl.h */,
31F6CCAB1739B0CF00C48748 /* mpsclo.h */,
31F6CCAC1739B0CF00C48748 /* mpscmvff.h */,
31F6CCAD1739B0CF00C48748 /* mpscsnc.h */,
31EEAC5B156AB41900714D05 /* poolamc.c */, 31EEAC5B156AB41900714D05 /* poolamc.c */,
31CD33BC173A9F1500524741 /* poolams.c */,
31CD33BD173A9F1500524741 /* poolams.h */,
3124CACE156BE4CF00753214 /* poolawl.c */, 3124CACE156BE4CF00753214 /* poolawl.c */,
3124CACA156BE4A300753214 /* poollo.c */, 3124CACA156BE4A300753214 /* poollo.c */,
31EEAC5F156AB44D00714D05 /* poolmvff.c */, 31EEAC5F156AB44D00714D05 /* poolmvff.c */,

View file

@ -10,6 +10,9 @@
#include "mps.h" #include "mps.h"
extern const struct mps_key_s _mps_key_ams_support_ambiguous;
#define MPS_KEY_AMS_SUPPORT_AMBIGUOUS (&_mps_key_ams_support_ambiguous)
extern mps_class_t mps_class_ams(void); extern mps_class_t mps_class_ams(void);
extern mps_class_t mps_class_ams_debug(void); extern mps_class_t mps_class_ams_debug(void);

View file

@ -9,8 +9,13 @@
#include "mps.h" #include "mps.h"
extern const struct mps_key_s _mps_key_awl_find_dependent;
#define MPS_KEY_AWL_FIND_DEPENDENT (&_mps_key_awl_find_dependent)
extern mps_class_t mps_class_awl(void); extern mps_class_t mps_class_awl(void);
typedef mps_addr_t (*mps_awl_find_dependent_t)(mps_addr_t addr);
#endif /* mpscawl_h */ #endif /* mpscawl_h */

View file

@ -9,6 +9,11 @@
#include "mps.h" #include "mps.h"
extern const struct mps_key_s _mps_mfs_extend_by;
#define MPS_KEY_MFS_EXTEND_BY (&_mps_mfs_extend_by)
extern const struct mps_key_s _mps_mfs_unit_size;
#define MPS_KEY_MFS_UNIT_SIZE (&_mps_mfs_unit_size)
extern mps_class_t mps_class_mfs(void); extern mps_class_t mps_class_mfs(void);
#endif /* mpscmfs_h */ #endif /* mpscmfs_h */

View file

@ -9,6 +9,13 @@
#include "mps.h" #include "mps.h"
extern const struct mps_key_s _mps_key_mv_extend_by;
#define MPS_KEY_MV_EXTEND_BY (&_mps_key_mv_extend_by)
extern const struct mps_key_s _mps_key_mv_avg_size;
#define MPS_KEY_MV_AVG_SIZE (&_mps_key_mv_avg_size)
extern const struct mps_key_s _mps_key_mv_max_size;
#define MPS_KEY_MV_MAX_SIZE (&_mps_key_mv_max_size)
extern size_t mps_mv_free_size(mps_pool_t mps_pool); extern size_t mps_mv_free_size(mps_pool_t mps_pool);
extern size_t mps_mv_size(mps_pool_t mps_pool); extern size_t mps_mv_size(mps_pool_t mps_pool);
extern mps_class_t mps_class_mv(void); extern mps_class_t mps_class_mv(void);

View file

@ -321,7 +321,7 @@ mps_res_t mps_arena_create(mps_arena_t *mps_arena_o,
va_start(args[0].val.varargs, mps_arena_class); va_start(args[0].val.varargs, mps_arena_class);
args[1].key = MPS_KEY_ARGS_END; args[1].key = MPS_KEY_ARGS_END;
res = mps_arena_create_args(mps_arena_o, mps_arena_class, args); res = mps_arena_create_args(mps_arena_o, mps_arena_class, args);
va_end(args[0].val.varargs); /* FIXME: Can't va_end? */
return res; return res;
} }
@ -633,15 +633,31 @@ mps_res_t mps_pool_create(mps_pool_t *mps_pool_o, mps_arena_t arena,
mps_class_t mps_class, ...) mps_class_t mps_class, ...)
{ {
mps_res_t res; mps_res_t res;
va_list args; mps_arg_s args[2];
va_start(args, mps_class); args[0].key = MPS_KEY_VARARGS;
res = mps_pool_create_v(mps_pool_o, arena, mps_class, args); va_start(args[0].val.varargs, mps_class);
va_end(args); args[1].key = MPS_KEY_ARGS_END;
res = mps_pool_create_k(mps_pool_o, arena, mps_class, args);
/* FIXME: Can't va_end? */
return res; return res;
} }
mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena, mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena,
mps_class_t class, va_list args) mps_class_t class, va_list varargs)
{
mps_arg_s args[2];
args[0].key = MPS_KEY_VARARGS;
/* FIXME: va_copy not available in C89 */
memcpy(&args[0].val.varargs, &varargs, sizeof(va_list));
args[1].key = MPS_KEY_ARGS_END;
return mps_pool_create_k(mps_pool_o, arena, class, args);
}
mps_res_t mps_pool_create_k(mps_pool_t *mps_pool_o, mps_arena_t arena,
mps_class_t class, mps_arg_s args[])
{ {
Pool pool; Pool pool;
Res res; Res res;
@ -651,8 +667,9 @@ mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena,
AVER(mps_pool_o != NULL); AVER(mps_pool_o != NULL);
AVERT(Arena, arena); AVERT(Arena, arena);
AVERT(PoolClass, class); AVERT(PoolClass, class);
AVER(ArgListCheck(args));
res = PoolCreateV(&pool, arena, class, args); res = PoolCreate(&pool, arena, class, args);
ArenaLeave(arena); ArenaLeave(arena);

View file

@ -105,22 +105,18 @@ Bool PoolCheck(Pool pool)
} }
/* PoolInit, PoolInitV -- initialize a pool /* Common keywords to PoolInit */
const KeyStruct _mps_key_format = {KeySig, "AMS_FORMAT", ArgCheckCant}; /* FIXME: ArgCheckFormat */
const KeyStruct _mps_key_chain = {KeySig, "AMS_CHAIN", ArgCheckCant}; /* FIXME: ArgCheckChain */
/* PoolInit -- initialize a pool
* *
* Initialize the generic fields of the pool and calls class-specific * Initialize the generic fields of the pool and calls class-specific
* init. See <design/pool/#align>. */ * init. See <design/pool/#align>. */
Res PoolInit(Pool pool, Arena arena, PoolClass class, ...) Res PoolInit(Pool pool, Arena arena, PoolClass class, ArgList args)
{
Res res;
va_list args;
va_start(args, class);
res = PoolInitV(pool, arena, class, args);
va_end(args);
return res;
}
Res PoolInitV(Pool pool, Arena arena, PoolClass class, va_list args)
{ {
Res res; Res res;
Word classId; Word classId;
@ -185,18 +181,7 @@ failInit:
/* PoolCreate, PoolCreateV: Allocate and initialise pool */ /* PoolCreate, PoolCreateV: Allocate and initialise pool */
Res PoolCreate(Pool *poolReturn, Arena arena, Res PoolCreate(Pool *poolReturn, Arena arena,
PoolClass class, ...) PoolClass class, ArgList args)
{
Res res;
va_list args;
va_start(args, class);
res = PoolCreateV(poolReturn, arena, class, args);
va_end(args);
return res;
}
Res PoolCreateV(Pool *poolReturn, Arena arena,
PoolClass class, va_list args)
{ {
Res res; Res res;
Pool pool; Pool pool;
@ -219,7 +204,7 @@ Res PoolCreateV(Pool *poolReturn, Arena arena,
pool = (Pool)PointerAdd(base, class->offset); pool = (Pool)PointerAdd(base, class->offset);
/* Initialize the pool. */ /* Initialize the pool. */
res = PoolInitV(pool, arena, class, args); res = PoolInit(pool, arena, class, args);
if (res != ResOK) if (res != ResOK)
goto failPoolInit; goto failPoolInit;

View file

@ -194,9 +194,10 @@ void PoolTrivFinish(Pool pool)
NOOP; NOOP;
} }
Res PoolTrivInit(Pool pool, va_list args) Res PoolTrivInit(Pool pool, ArgList args)
{ {
AVERT(Pool, pool); AVERT(Pool, pool);
AVER(ArgListCheck(args));
UNUSED(args); UNUSED(args);
return ResOK; return ResOK;
} }

View file

@ -933,7 +933,7 @@ static Bool amcNailRangeIsMarked(Seg seg, Addr base, Addr limit)
* See <design/poolamc/#init>. * See <design/poolamc/#init>.
* Shared by AMCInit and AMCZinit. * Shared by AMCInit and AMCZinit.
*/ */
static Res amcInitComm(Pool pool, RankSet rankSet, va_list arg) static Res amcInitComm(Pool pool, RankSet rankSet, ArgList args)
{ {
AMC amc; AMC amc;
Res res; Res res;
@ -943,6 +943,7 @@ static Res amcInitComm(Pool pool, RankSet rankSet, va_list arg)
Index i; Index i;
size_t genArraySize; size_t genArraySize;
size_t genCount; size_t genCount;
ArgStruct arg;
/* Suppress a warning about this structure not being used when there /* Suppress a warning about this structure not being used when there
are no statistics. Note that simply making the declaration conditional are no statistics. Note that simply making the declaration conditional
@ -959,11 +960,27 @@ static Res amcInitComm(Pool pool, RankSet rankSet, va_list arg)
amc = Pool2AMC(pool); amc = Pool2AMC(pool);
arena = PoolArena(pool); arena = PoolArena(pool);
pool->format = va_arg(arg, Format); if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
pool->format = va_arg(arg.val.varargs, Format);
amc->chain = va_arg(arg.val.varargs, Chain);
} else {
if (ArgPick(&arg, args, MPS_KEY_FORMAT))
pool->format = arg.val.format;
else {
res = ResPARAM;
goto failParam;
}
if (ArgPick(&arg, args, MPS_KEY_CHAIN))
amc->chain = arg.val.chain;
else {
res = ResPARAM;
goto failParam;
}
}
AVERT(Format, pool->format); AVERT(Format, pool->format);
pool->alignment = pool->format->alignment;
amc->chain = va_arg(arg, Chain);
AVERT(Chain, amc->chain); AVERT(Chain, amc->chain);
pool->alignment = pool->format->alignment;
amc->rankSet = rankSet; amc->rankSet = rankSet;
RingInit(&amc->genRing); RingInit(&amc->genRing);
@ -1035,17 +1052,18 @@ failGenAlloc:
} }
ControlFree(arena, amc->gen, genArraySize); ControlFree(arena, amc->gen, genArraySize);
failGensAlloc: failGensAlloc:
failParam:
return res; return res;
} }
static Res AMCInit(Pool pool, va_list arg) static Res AMCInit(Pool pool, ArgList args)
{ {
return amcInitComm(pool, RankSetSingle(RankEXACT), arg); return amcInitComm(pool, RankSetSingle(RankEXACT), args);
} }
static Res AMCZInit(Pool pool, va_list arg) static Res AMCZInit(Pool pool, ArgList args)
{ {
return amcInitComm(pool, RankSetEMPTY, arg); return amcInitComm(pool, RankSetEMPTY, args);
} }

View file

@ -733,18 +733,47 @@ static void AMSSegsDestroy(AMS ams)
* Takes one additional argument: the format of the objects * Takes one additional argument: the format of the objects
* allocated in the pool. See <design/poolams/#init>. * allocated in the pool. See <design/poolams/#init>.
*/ */
static Res AMSInit(Pool pool, va_list args)
const KeyStruct _mps_key_ams_support_ambiguous = {
KeySig, "AMS_SUPPORT_AMBIGUOUS", ArgCheckCant /* FIXME: ArgCheckBool */
};
static Res AMSInit(Pool pool, ArgList args)
{ {
Res res; Res res;
Format format; Format format;
Chain chain; Chain chain;
Bool supportAmbiguous; Bool supportAmbiguous;
ArgStruct arg;
AVERT(Pool, pool); AVERT(Pool, pool);
AVER(ArgListCheck(args));
if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
format = va_arg(arg.val.varargs, Format);
chain = va_arg(arg.val.varargs, Chain);
supportAmbiguous = va_arg(arg.val.varargs, Bool);
} else {
if (ArgPick(&arg, args, MPS_KEY_CHAIN))
chain = arg.val.chain;
else {
res = ResPARAM;
goto failParam;
}
if (ArgPick(&arg, args, MPS_KEY_FORMAT))
format = arg.val.format;
else {
res = ResPARAM;
goto failParam;
}
if (ArgPick(&arg, args, MPS_KEY_AMS_SUPPORT_AMBIGUOUS))
supportAmbiguous = arg.val.b;
else {
res = ResPARAM;
goto failParam;
}
}
format = va_arg(args, Format);
chain = va_arg(args, Chain);
supportAmbiguous = va_arg(args, Bool);
/* .ambiguous.noshare: If the pool is required to support ambiguous */ /* .ambiguous.noshare: If the pool is required to support ambiguous */
/* references, the alloc and white tables cannot be shared. */ /* references, the alloc and white tables cannot be shared. */
res = AMSInitInternal(Pool2AMS(pool), format, chain, !supportAmbiguous); res = AMSInitInternal(Pool2AMS(pool), format, chain, !supportAmbiguous);
@ -752,6 +781,9 @@ static Res AMSInit(Pool pool, va_list args)
EVENT3(PoolInitAMS, pool, PoolArena(pool), format); EVENT3(PoolInitAMS, pool, PoolArena(pool), format);
} }
return res; return res;
failParam:
return res;
} }

View file

@ -13,6 +13,7 @@
#include "mpmst.h" #include "mpmst.h"
#include "ring.h" #include "ring.h"
#include "bt.h" #include "bt.h"
#include "mpscams.h"
#include <stdarg.h> #include <stdarg.h>

View file

@ -511,7 +511,11 @@ static Bool AWLSegAlloc(Addr *baseReturn, Addr *limitReturn,
/* AWLInit -- initialize an AWL pool */ /* AWLInit -- initialize an AWL pool */
static Res AWLInit(Pool pool, va_list arg) const KeyStruct _mps_key_awl_find_dependent = {
KeySig, "AWL_FIND_DEPENDENT", ArgCheckCant /* FIXME: ArgCheckFun */
};
static Res AWLInit(Pool pool, ArgList args)
{ {
AWL awl; AWL awl;
Format format; Format format;
@ -519,17 +523,34 @@ static Res AWLInit(Pool pool, va_list arg)
Chain chain; Chain chain;
Res res; Res res;
static GenParamStruct genParam = { SizeMAX, 0.5 /* dummy */ }; static GenParamStruct genParam = { SizeMAX, 0.5 /* dummy */ };
ArgStruct arg;
/* Weak check, as half-way through initialization. */ /* Weak check, as half-way through initialization. */
AVER(pool != NULL); AVER(pool != NULL);
awl = Pool2AWL(pool); awl = Pool2AWL(pool);
if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
format = va_arg(arg.val.varargs, Format);
findDependent = va_arg(arg.val.varargs, FindDependentMethod);
} else {
if (ArgPick(&arg, args, MPS_KEY_FORMAT))
format = arg.val.format;
else {
res = ResPARAM;
goto failParam;
}
if (ArgPick(&arg, args, MPS_KEY_AWL_FIND_DEPENDENT))
findDependent = (FindDependentMethod)arg.val.addr_method;
else {
res = ResPARAM;
goto failParam;
}
}
format = va_arg(arg, Format);
AVERT(Format, format); AVERT(Format, format);
pool->format = format; pool->format = format;
findDependent = va_arg(arg, FindDependentMethod);
AVER(FUNCHECK(findDependent)); AVER(FUNCHECK(findDependent));
awl->findDependent = findDependent; awl->findDependent = findDependent;
@ -557,6 +578,7 @@ static Res AWLInit(Pool pool, va_list arg)
failGenInit: failGenInit:
ChainDestroy(chain); ChainDestroy(chain);
failParam:
return res; return res;
} }

View file

@ -469,19 +469,30 @@ static void LOWalk(Pool pool, Seg seg,
/* LOInit -- initialize an LO pool */ /* LOInit -- initialize an LO pool */
static Res LOInit(Pool pool, va_list arg) static Res LOInit(Pool pool, ArgList args)
{ {
Format format; Format format;
LO lo; LO lo;
Arena arena; Arena arena;
Res res; Res res;
static GenParamStruct loGenParam = { 1024, 0.2 }; static GenParamStruct loGenParam = { 1024, 0.2 };
ArgStruct arg;
AVERT(Pool, pool); AVERT(Pool, pool);
arena = PoolArena(pool); arena = PoolArena(pool);
format = va_arg(arg, Format); if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
format = va_arg(arg.val.varargs, Format);
} else {
if (ArgPick(&arg, args, MPS_KEY_FORMAT))
format = arg.val.format;
else {
res = ResPARAM;
goto failParam;
}
}
AVERT(Format, format); AVERT(Format, format);
lo = PoolPoolLO(pool); lo = PoolPoolLO(pool);
@ -507,6 +518,7 @@ static Res LOInit(Pool pool, va_list arg)
failGenInit: failGenInit:
ChainDestroy(lo->chain); ChainDestroy(lo->chain);
failParam:
return res; return res;
} }

View file

@ -77,16 +77,38 @@ Pool (MFSPool)(MFS mfs)
} }
static Res MFSInit(Pool pool, va_list arg) const KeyStruct _mps_mfs_extend_by = {KeySig, "MFS_EXTEND_BY", ArgCheckCant};
const KeyStruct _mps_mfs_unit_size = {KeySig, "MFS_UNIT_SIZE", ArgCheckCant};
static Res MFSInit(Pool pool, ArgList args)
{ {
Res res;
Size extendBy, unitSize; Size extendBy, unitSize;
MFS mfs; MFS mfs;
Arena arena; Arena arena;
ArgStruct arg;
AVER(pool != NULL); AVER(pool != NULL);
AVER(ArgListCheck(args));
extendBy = va_arg(arg, Size);
unitSize = va_arg(arg, Size); if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
extendBy = va_arg(arg.val.varargs, Size);
unitSize = va_arg(arg.val.varargs, Size);
} else {
if (ArgPick(&arg, args, MPS_KEY_MFS_UNIT_SIZE))
unitSize = arg.val.size;
else {
res = ResPARAM;
goto failParam;
}
if (ArgPick(&arg, args, MPS_KEY_MFS_EXTEND_BY))
extendBy = arg.val.size;
else {
extendBy = MFS_EXTEND_BY_DEFAULT;
if (extendBy < unitSize)
extendBy = unitSize;
}
}
AVER(unitSize >= UNIT_MIN); AVER(unitSize >= UNIT_MIN);
AVER(extendBy >= unitSize); AVER(extendBy >= unitSize);
@ -109,6 +131,9 @@ static Res MFSInit(Pool pool, va_list arg)
AVERT(MFS, mfs); AVERT(MFS, mfs);
EVENT4(PoolInitMFS, pool, arena, extendBy, unitSize); EVENT4(PoolInitMFS, pool, arena, extendBy, unitSize);
return ResOK; return ResOK;
failParam:
return res;
} }

View file

@ -29,6 +29,7 @@
#define poolmfs_h #define poolmfs_h
#include "mpm.h" #include "mpm.h"
#include "mpscmfs.h"
typedef struct MFSStruct *MFS; typedef struct MFSStruct *MFS;

View file

@ -616,11 +616,12 @@ static Res MRGRefSegScan(ScanState ss, MRGRefSeg refseg, MRG mrg)
/* MRGInit -- init method for MRG */ /* MRGInit -- init method for MRG */
static Res MRGInit(Pool pool, va_list args) static Res MRGInit(Pool pool, ArgList args)
{ {
MRG mrg; MRG mrg;
AVER(pool != NULL); /* Can't check more; see pool contract @@@@ */ AVER(pool != NULL); /* Can't check more; see pool contract @@@@ */
AVER(ArgListCheck(args));
UNUSED(args); UNUSED(args);
mrg = Pool2MRG(pool); mrg = Pool2MRG(pool);

View file

@ -184,16 +184,33 @@ static Bool MVSpanCheck(MVSpan span)
/* MVInit -- init method for class MV */ /* MVInit -- init method for class MV */
static Res MVInit(Pool pool, va_list arg) const KeyStruct _mps_key_mv_extend_by = {KeySig, "MV_EXTEND_BY", ArgCheckCant};
const KeyStruct _mps_key_mv_avg_size = {KeySig, "MV_AVG_SIZE", ArgCheckCant};
const KeyStruct _mps_key_mv_max_size = {KeySig, "MV_MAX_SIZE", ArgCheckCant};
static Res MVInit(Pool pool, ArgList args)
{ {
Size extendBy, avgSize, maxSize, blockExtendBy, spanExtendBy; Size extendBy = MV_EXTEND_BY_DEFAULT;
Size avgSize = MV_AVG_SIZE_DEFAULT;
Size maxSize = MV_MAX_SIZE_DEFAULT;
Size blockExtendBy, spanExtendBy;
MV mv; MV mv;
Arena arena; Arena arena;
Res res; Res res;
ArgStruct arg;
extendBy = va_arg(arg, Size); ArgStruct piArgs[3];
avgSize = va_arg(arg, Size);
maxSize = va_arg(arg, Size); if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
extendBy = va_arg(arg.val.varargs, Size);
avgSize = va_arg(arg.val.varargs, Size);
maxSize = va_arg(arg.val.varargs, Size);
}
if (ArgPick(&arg, args, MPS_KEY_MV_EXTEND_BY))
extendBy = arg.val.size;
if (ArgPick(&arg, args, MPS_KEY_MV_AVG_SIZE))
avgSize = arg.val.size;
if (ArgPick(&arg, args, MPS_KEY_MV_MAX_SIZE))
maxSize = arg.val.size;
AVER(extendBy > 0); AVER(extendBy > 0);
AVER(avgSize > 0); AVER(avgSize > 0);
@ -211,17 +228,23 @@ static Res MVInit(Pool pool, va_list arg)
blockExtendBy = sizeof(MVBlockStruct); blockExtendBy = sizeof(MVBlockStruct);
} }
res = PoolInit(&mv->blockPoolStruct.poolStruct, piArgs[0].key = MPS_KEY_MFS_EXTEND_BY;
arena, PoolClassMFS(), piArgs[0].val.size = blockExtendBy;
blockExtendBy, sizeof(MVBlockStruct)); piArgs[1].key = MPS_KEY_MFS_UNIT_SIZE;
piArgs[1].val.size = sizeof(MVBlockStruct);
piArgs[2].key = MPS_KEY_ARGS_END;
res = PoolInit(&mv->blockPoolStruct.poolStruct, arena, PoolClassMFS(), piArgs);
if(res != ResOK) if(res != ResOK)
return res; return res;
spanExtendBy = sizeof(MVSpanStruct) * (maxSize/extendBy); spanExtendBy = sizeof(MVSpanStruct) * (maxSize/extendBy);
res = PoolInit(&mv->spanPoolStruct.poolStruct, piArgs[0].key = MPS_KEY_MFS_EXTEND_BY;
arena, PoolClassMFS(), piArgs[0].val.size = spanExtendBy;
spanExtendBy, sizeof(MVSpanStruct)); piArgs[1].key = MPS_KEY_MFS_UNIT_SIZE;
piArgs[1].val.size = sizeof(MVSpanStruct);
piArgs[2].key = MPS_KEY_ARGS_END;
res = PoolInit(&mv->spanPoolStruct.poolStruct, arena, PoolClassMFS(), piArgs);
if(res != ResOK) if(res != ResOK)
return res; return res;

View file

@ -43,6 +43,7 @@
#include "mpmtypes.h" #include "mpmtypes.h"
#include "mpscmv.h"
typedef struct MVStruct *MV; typedef struct MVStruct *MV;

View file

@ -27,7 +27,7 @@ SRCID(poolmv2, "$Id$");
/* Private prototypes */ /* Private prototypes */
typedef struct MVTStruct *MVT; typedef struct MVTStruct *MVT;
static Res MVTInit(Pool pool, va_list arg); static Res MVTInit(Pool pool, ArgList arg);
static Bool MVTCheck(MVT mvt); static Bool MVTCheck(MVT mvt);
static void MVTFinish(Pool pool); static void MVTFinish(Pool pool);
static Res MVTBufferFill(Addr *baseReturn, Addr *limitReturn, static Res MVTBufferFill(Addr *baseReturn, Addr *limitReturn,
@ -194,38 +194,46 @@ static SegPref MVTSegPref(MVT mvt)
* Parameters are: * Parameters are:
* minSize, meanSize, maxSize, reserveDepth, fragLimit * minSize, meanSize, maxSize, reserveDepth, fragLimit
*/ */
static Res MVTInit(Pool pool, va_list arg) static Res MVTInit(Pool pool, ArgList args)
{ {
Arena arena; Arena arena;
Size minSize, meanSize, maxSize, reuseSize, fillSize; Size minSize, meanSize, maxSize, reuseSize, fillSize;
Count reserveDepth, abqDepth, fragLimit; Count reserveDepth, abqDepth, fragLimit;
MVT mvt; MVT mvt;
Res res; Res res;
ArgStruct arg;
AVERT(Pool, pool); AVERT(Pool, pool);
mvt = Pool2MVT(pool); mvt = Pool2MVT(pool);
/* can't AVERT mvt, yet */ /* can't AVERT mvt, yet */
arena = PoolArena(pool); arena = PoolArena(pool);
AVERT(Arena, arena); AVERT(Arena, arena);
/* --- Should there be a ResBADARG ? */ if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
minSize = va_arg(arg, Size); /* FIXME: Inconsistent reporting of bad arguments. Elsewhere we assert or return ResPARAM. */
unless (minSize > 0) /* --- Should there be a ResBADARG ? */
return ResLIMIT; minSize = va_arg(arg.val.varargs, Size);
meanSize = va_arg(arg, Size); unless (minSize > 0)
unless (meanSize >= minSize) return ResLIMIT;
return ResLIMIT; meanSize = va_arg(arg.val.varargs, Size);
maxSize = va_arg(arg, Size); unless (meanSize >= minSize)
unless (maxSize >= meanSize) return ResLIMIT;
return ResLIMIT; maxSize = va_arg(arg.val.varargs, Size);
/* --- check that maxSize is not too large */ unless (maxSize >= meanSize)
reserveDepth = va_arg(arg, Count); return ResLIMIT;
unless (reserveDepth > 0) /* --- check that maxSize is not too large */
return ResLIMIT; reserveDepth = va_arg(arg.val.varargs, Count);
/* --- check that reserveDepth is not too large or small */ unless (reserveDepth > 0)
fragLimit = va_arg(arg, Count); return ResLIMIT;
unless (fragLimit <= 100) /* --- check that reserveDepth is not too large or small */
return ResLIMIT; fragLimit = va_arg(arg.val.varargs, Count);
unless (fragLimit <= 100)
return ResLIMIT;
} else {
/* FIXME: Keywords not yet supported. */
res = ResPARAM;
goto failParam;
}
/* see <design/poolmvt/#arch.parameters> */ /* see <design/poolmvt/#arch.parameters> */
fillSize = SizeAlignUp(maxSize, ArenaAlign(arena)); fillSize = SizeAlignUp(maxSize, ArenaAlign(arena));
@ -319,6 +327,7 @@ static Res MVTInit(Pool pool, va_list arg)
failABQ: failABQ:
CBSFinish(MVTCBS(mvt)); CBSFinish(MVTCBS(mvt));
failCBS: failCBS:
failParam:
AVER(res != ResOK); AVER(res != ResOK);
return res; return res;
} }

View file

@ -409,7 +409,7 @@ static void MVFFBufferEmpty(Pool pool, Buffer buffer,
/* MVFFInit -- initialize method for MVFF */ /* MVFFInit -- initialize method for MVFF */
static Res MVFFInit(Pool pool, va_list arg) static Res MVFFInit(Pool pool, ArgList args)
{ {
Size extendBy, avgSize, align; Size extendBy, avgSize, align;
Bool slotHigh, arenaHigh, firstFit; Bool slotHigh, arenaHigh, firstFit;
@ -418,6 +418,7 @@ static Res MVFFInit(Pool pool, va_list arg)
Res res; Res res;
void *p; void *p;
ZoneSet zones; ZoneSet zones;
ArgStruct arg;
AVERT(Pool, pool); AVERT(Pool, pool);
@ -425,12 +426,20 @@ static Res MVFFInit(Pool pool, va_list arg)
/* <design/poolmvff/#method.init> */ /* <design/poolmvff/#method.init> */
/* .arg.check: we do the same checks here and in MVFFCheck */ /* .arg.check: we do the same checks here and in MVFFCheck */
/* except for arenaHigh, which is stored only in the segPref. */ /* except for arenaHigh, which is stored only in the segPref. */
extendBy = va_arg(arg, Size);
avgSize = va_arg(arg, Size); if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
align = va_arg(arg, Size); extendBy = va_arg(arg.val.varargs, Size);
slotHigh = va_arg(arg, Bool); avgSize = va_arg(arg.val.varargs, Size);
arenaHigh = va_arg(arg, Bool); align = va_arg(arg.val.varargs, Size);
firstFit = va_arg(arg, Bool); slotHigh = va_arg(arg.val.varargs, Bool);
arenaHigh = va_arg(arg.val.varargs, Bool);
firstFit = va_arg(arg.val.varargs, Bool);
} else {
/* FIXME: Accept keywords! */
res = ResPARAM;
goto failParam;
}
AVER(extendBy > 0); /* .arg.check */ AVER(extendBy > 0); /* .arg.check */
AVER(avgSize > 0); /* .arg.check */ AVER(avgSize > 0); /* .arg.check */
AVER(avgSize <= extendBy); /* .arg.check */ AVER(avgSize <= extendBy); /* .arg.check */
@ -479,6 +488,7 @@ static Res MVFFInit(Pool pool, va_list arg)
failInit: failInit:
ControlFree(arena, p, sizeof(SegPrefStruct)); ControlFree(arena, p, sizeof(SegPrefStruct));
failParam:
return res; return res;
} }

View file

@ -30,7 +30,7 @@ typedef struct PoolNStruct {
/* NInit -- init method for class N */ /* NInit -- init method for class N */
static Res NInit(Pool pool, va_list args) static Res NInit(Pool pool, ArgList args)
{ {
PoolN poolN = PoolPoolN(pool); PoolN poolN = PoolPoolN(pool);

View file

@ -19,7 +19,7 @@ static void testit(ArenaClass class, ArgList args)
die(ArenaCreate(&arena, class, args), "ArenaCreate"); die(ArenaCreate(&arena, class, args), "ArenaCreate");
die(PoolCreate(&pool, arena, PoolClassN()), "PoolNCreate"); die(PoolCreate(&pool, arena, PoolClassN(), argsNone), "PoolNCreate");
res = PoolAlloc(&p, pool, 1, /* withReservoirPermit */ FALSE); res = PoolAlloc(&p, pool, 1, /* withReservoirPermit */ FALSE);
if (res == ResOK) { if (res == ResOK) {
error("Error: Unexpectedly succeeded in" error("Error: Unexpectedly succeeded in"

View file

@ -361,17 +361,28 @@ static Bool sncFindFreeSeg(Seg *segReturn, SNC snc, Size size)
/* SNCInit -- initialize an SNC pool */ /* SNCInit -- initialize an SNC pool */
static Res SNCInit(Pool pool, va_list arg) static Res SNCInit(Pool pool, ArgList args)
{ {
Res res;
SNC snc; SNC snc;
Format format; Format format;
ArgStruct arg;
/* weak check, as half-way through initialization */ /* weak check, as half-way through initialization */
AVER(pool != NULL); AVER(pool != NULL);
snc = Pool2SNC(pool); snc = Pool2SNC(pool);
format = va_arg(arg, Format); if (ArgPick(&arg, args, MPS_KEY_VARARGS))
format = va_arg(arg.val.varargs, Format);
else {
if (ArgPick(&arg, args, MPS_KEY_FORMAT))
format = arg.val.format;
else {
res = ResPARAM;
goto failParam;
}
}
AVERT(Format, format); AVERT(Format, format);
pool->format = format; pool->format = format;
@ -384,6 +395,9 @@ static Res SNCInit(Pool pool, va_list arg)
AVERT(SNC, snc); AVERT(SNC, snc);
EVENT2(PoolInitSNC, pool, format); EVENT2(PoolInitSNC, pool, format);
return ResOK; return ResOK;
failParam:
return res;
} }

View file

@ -35,7 +35,7 @@ SRCID(reserv, "$Id$");
/* ResPoolInit -- Reservoir pool init method */ /* ResPoolInit -- Reservoir pool init method */
static Res ResPoolInit(Pool pool, va_list arg) static Res ResPoolInit(Pool pool, ArgList arg)
{ {
AVER(pool != NULL); AVER(pool != NULL);
@ -388,7 +388,7 @@ Res ReservoirInit(Reservoir reservoir, Arena arena)
reservoir->sig = ReservoirSig; reservoir->sig = ReservoirSig;
/* initialize the reservoir pool, <design/reservoir/> */ /* initialize the reservoir pool, <design/reservoir/> */
res = PoolInit(&reservoir->poolStruct, res = PoolInit(&reservoir->poolStruct,
arena, EnsureReservoirPoolClass()); arena, EnsureReservoirPoolClass(), argsNone);
if (res == ResOK) { if (res == ResOK) {
AVERT(Reservoir, reservoir); AVERT(Reservoir, reservoir);
} }

View file

@ -330,17 +330,24 @@ static Res AMSTSegSizePolicy(Size *sizeReturn,
/* AMSTInit -- the pool class initialization method */ /* AMSTInit -- the pool class initialization method */
static Res AMSTInit(Pool pool, va_list args) static Res AMSTInit(Pool pool, ArgList args)
{ {
AMST amst; AMS ams; AMST amst; AMS ams;
Format format; Format format;
Chain chain; Chain chain;
Res res; Res res;
static GenParamStruct genParam = { 1024, 0.2 }; static GenParamStruct genParam = { 1024, 0.2 };
ArgStruct arg;
AVERT(Pool, pool); AVERT(Pool, pool);
format = va_arg(args, Format); if (ArgPick(&arg, args, MPS_KEY_FORMAT))
format = arg.val.format;
else {
res = ResPARAM;
goto failParam;
}
res = ChainCreate(&chain, pool->arena, 1, &genParam); res = ChainCreate(&chain, pool->arena, 1, &genParam);
if (res != ResOK) if (res != ResOK)
return res; return res;
@ -362,6 +369,10 @@ static Res AMSTInit(Pool pool, va_list args)
amst->sig = AMSTSig; amst->sig = AMSTSig;
AVERT(AMST, amst); AVERT(AMST, amst);
return ResOK; return ResOK;
failParam:
AVER(res != ResOK);
return res;
} }
@ -755,13 +766,17 @@ static void *test(void *arg, size_t s)
mps_ap_t busy_ap; mps_ap_t busy_ap;
mps_addr_t busy_init; mps_addr_t busy_init;
char *indent = " "; char *indent = " ";
mps_arg_s args[2];
arena = (mps_arena_t)arg; arena = (mps_arena_t)arg;
(void)s; /* unused */ (void)s; /* unused */
die(mps_fmt_create_A(&format, arena, dylan_fmt_A()), "fmt_create"); die(mps_fmt_create_A(&format, arena, dylan_fmt_A()), "fmt_create");
die(mps_pool_create(&pool, arena, mps_class_amst(), format), args[0].key = MPS_KEY_FORMAT;
args[0].val.format = format;
args[1].key = MPS_KEY_ARGS_END;
die(mps_pool_create_k(&pool, arena, mps_class_amst(), args),
"pool_create(amst)"); "pool_create(amst)");
die(mps_ap_create(&ap, pool, mps_rank_exact()), "BufferCreate"); die(mps_ap_create(&ap, pool, mps_rank_exact()), "BufferCreate");

View file

@ -73,6 +73,19 @@ the way that they acquire the memory to be managed.
The type of :term:`arena classes`. The type of :term:`arena classes`.
.. c:function:: mps_res_t mps_arena_create_k(mps_arena_t *arena_o, mps_arena_class_t arena_class, mps_arg_s args[])
Create an :term:`arena`.
``arena_o`` points to a location that will hold a pointer to the new
arena.
``arena_class`` is the :term:`arena class`.
``args`` are :ref:`topic-interface-keywords` specific to the arena
class. See the documentation for the arena class.
.. c:function:: mps_res_t mps_arena_create(mps_arena_t *arena_o, mps_arena_class_t arena_class, ...) .. c:function:: mps_res_t mps_arena_create(mps_arena_t *arena_o, mps_arena_class_t arena_class, ...)
Create an :term:`arena`. Create an :term:`arena`.
@ -142,18 +155,29 @@ Client arenas
A client arena gets its managed memory from the :term:`client A client arena gets its managed memory from the :term:`client
program`. This memory chunk is passed when the arena is created. program`. This memory chunk is passed when the arena is created.
When creating a client arena, :c:func:`mps_arena_create` takes two When creating a client arena, :c:func:`mps_arena_create_k` requires two
extra arguments:: :ref:`topic-interface-keywords`:
* ``MPS_KEY_ARENA_CL_BASE`` (type ``mps_addr_t``) is the
:term:`address` of the chunk of memory that will be managed by the
arena.
* ``MPS_KEY_ARENA_SIZE`` (type ``size_t``) is its size.
For example (in C99)::
res = mps_arena_create_k(&arena, mps_arena_class_cl(),
(mps_arg_s[]){{MPS_KEY_ARENA_CL_BASE, .val.addr = base},
{MPS_KEY_ARENA_SIZE, .val.size = size},
{MPS_KEY_ARGS_END}});
When creating a client arena, :c:func:`mps_arena_create` takes the
these arguments like this::
mps_res_t mps_arena_create(mps_arena_t *arena_o, mps_res_t mps_arena_create(mps_arena_t *arena_o,
mps_arena_class_t mps_arena_class_cl, mps_arena_class_t mps_arena_class_cl,
size_t size, mps_addr_t base) size_t size, mps_addr_t base)
``base`` is the :term:`address` of the chunk of memory that will
be managed by the arena.
``size`` is its :term:`size`.
If the chunk is too small to hold the internal arena structures, If the chunk is too small to hold the internal arena structures,
:c:func:`mps_arena_create` returns :c:macro:`MPS_RES_MEMORY`. In :c:func:`mps_arena_create` returns :c:macro:`MPS_RES_MEMORY`. In
this case, you need to use a (much) larger chunk. this case, you need to use a (much) larger chunk.
@ -204,12 +228,17 @@ Virtual memory arenas
:term:`fragmentation` and helps make :term:`garbage collection` :term:`fragmentation` and helps make :term:`garbage collection`
more efficient. more efficient.
When creating a virtual memory arena, :c:func:`mps_arena_create` When creating a virtual memory arena, :c:func:`mps_arena_create_k`
takes one extra argument:: requires one
:ref:`topic-interface-keywords`:
mps_res_t mps_arena_create(mps_arena_t *arena_o,
mps_arena_class_t arena_class_vm(), * ``MPS_KEY_ARENA_SIZE`` (type ``size_t``)
size_t size)
For example (in C99)::
res = mps_arena_create_k(&arena, mps_arena_class_cl(),
(mps_arg_s[]){{MPS_KEY_ARENA_SIZE, .val.size = size},
{MPS_KEY_ARGS_END}});
``size`` is the initial amount of virtual address space, in ``size`` is the initial amount of virtual address space, in
:term:`bytes (1)`, that the arena will reserve (this space is :term:`bytes (1)`, that the arena will reserve (this space is
@ -227,6 +256,28 @@ Virtual memory arenas
more times it has to extend its address space, the less more times it has to extend its address space, the less
efficient garbage collection will become. efficient garbage collection will become.
An optional :ref:`topic-interface-keywords` may be passed, but is
only used on the Windows operating system:
* ``MPS_KEY_VM_W3_TOP_DOWN`` (type ``mps_bool_t``)
If true, the arena will allocate address space starting at the
highest possible address and working downwards through memory.
.. note::
This causes the arena to pass the ``MEM_TOP_DOWN`` flag to
`VirtualAlloc`_.
.. _VirtualAlloc: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887%28v=vs.85%29.aspx
When creating a virtual memory arena, :c:func:`mps_arena_create`
takes one extra argument::
mps_res_t mps_arena_create(mps_arena_t *arena_o,
mps_arena_class_t arena_class_vm(),
size_t size)
If the MPS fails to reserve adequate address space to place the If the MPS fails to reserve adequate address space to place the
arena in, :c:func:`mps_arena_create` returns arena in, :c:func:`mps_arena_create` returns
:c:macro:`MPS_RES_RESOURCE`. Possibly this means that other parts :c:macro:`MPS_RES_RESOURCE`. Possibly this means that other parts

View file

@ -258,6 +258,45 @@ Macros
separately. separately.
.. _topic-interface-keywords:
Keyword arguments
-----------------
Some functions take :term:`keyword arguments` in order to pass values
that might be optional, or are only required in some circumstances. For
example, :ref:`client arenas <topic-arena-client>` require a base address. These
arguments are passed in a keyword argument array, like this::
mps_res_t res;
mps_arena_t arena;
mps_arg_s args[3];
args[0].key = MPS_KEY_ARENA_SIZE;
args[0].val.size = 6553600;
args[1].key = MPS_KEY_ARENA_CL_BASE;
args[1].val.addr = base_address;
args[2].key = MPS_KEY_ARGS_END;
res = mps_arena_create_k(&arena, mps_arena_class_cl(), args);
If you are writing C99, you can write this more concisely as::
mps_res_t res;
mps_arena_t arena;
res = mps_arena_create_k(&arena, mps_arena_class_cl(),
(mps_arg_s[]){{MPS_KEY_ARENA_SIZE, .val.size = 6553600},
{MPS_KEY_ARENA_CL_BASE, .val.addr = base_address},
{MPS_KEY_ARGS_END}});
The argument array must not be ``NULL``, and must end with
``MPS_KEY_ARGS_END``.
On return, the keyword argument array will be *modified* to remove any
arguments that have been used. If all arguments have been used the
first element key will be MPS_KEY_ARGS_END.
If you don't want to pass any arguments, you can either call the equivalent function that does not take
.. _topic-interface-general: .. _topic-interface-general:
General types General types

Binary file not shown.

File diff suppressed because one or more lines are too long

View file

@ -265,7 +265,7 @@ Keyword arguments
Some functions take :term:`keyword arguments` in order to pass values Some functions take :term:`keyword arguments` in order to pass values
that might be optional, or are only required in some circumstances. For that might be optional, or are only required in some circumstances. For
example, :ref:`topic-arena-client` require a base address. These example, :term:`client arenas` require a base address. These
arguments are passed in a keyword argument array, like this:: arguments are passed in a keyword argument array, like this::
mps_res_t res; mps_res_t res;
@ -288,12 +288,14 @@ If you are writing C99, you can write this more concisely as::
{MPS_KEY_ARGS_END}}); {MPS_KEY_ARGS_END}});
The argument array must not be ``NULL``, and must end with The argument array must not be ``NULL``, and must end with
``MPS_KEY_ARGS_END``. ``MPS_KEY_ARGS_END``. If you don't want to pass any arguments, you can
either call the equivalent function that does not take keyword arguments
(named without the ``_k``) or pass ``mps_args_none``.
On return, the keyword argument array will be *modified* to remove any On return, the keyword argument array will be *modified* to remove any
arguments that have been used. If all arguments have been used the arguments that have been used. If all arguments have been used the
first element key will be MPS_KEY_ARGS_END. first element key will be ``MPS_KEY_ARGS_END``.
.. _topic-interface-general: .. _topic-interface-general: