mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-17 10:27:41 +00:00
Fix problems noted by rb in review <https://info.ravenbrook.com/mail/2014/06/18/14-06-43/0/>
Copied from Perforce Change: 186667 ServerID: perforce.ravenbrook.com
This commit is contained in:
parent
adb0d27e3a
commit
71c820ca54
8 changed files with 60 additions and 43 deletions
|
|
@ -293,9 +293,9 @@ static Res VMChunkCreate(Chunk *chunkReturn, VMArena vmArena, Size size)
|
|||
arena = VMArena2Arena(vmArena);
|
||||
AVER(size > 0);
|
||||
|
||||
res = VMCreate(vm, size, ArenaGrainSize(arena), vmArena->vmParams);
|
||||
res = VMInit(vm, size, ArenaGrainSize(arena), vmArena->vmParams);
|
||||
if (res != ResOK)
|
||||
goto failVMCreate;
|
||||
goto failVMInit;
|
||||
|
||||
base = VMBase(vm);
|
||||
limit = VMLimit(vm);
|
||||
|
|
@ -318,7 +318,7 @@ static Res VMChunkCreate(Chunk *chunkReturn, VMArena vmArena, Size size)
|
|||
vmChunk->overheadMappedLimit = chunkStructLimit;
|
||||
|
||||
/* Copy VM descriptor into its place in the chunk. */
|
||||
(void)mps_lib_memcpy(VMChunkVM(vmChunk), vm, sizeof vmStruct);
|
||||
VMCopy(VMChunkVM(vmChunk), vm);
|
||||
res = ChunkInit(VMChunk2Chunk(vmChunk), arena, base, limit, boot);
|
||||
if (res != ResOK)
|
||||
goto failChunkInit;
|
||||
|
|
@ -336,8 +336,8 @@ static Res VMChunkCreate(Chunk *chunkReturn, VMArena vmArena, Size size)
|
|||
failChunkMap:
|
||||
failChunkAlloc:
|
||||
failBootInit:
|
||||
VMDestroy(vm);
|
||||
failVMCreate:
|
||||
VMFinish(vm);
|
||||
failVMInit:
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
@ -441,14 +441,14 @@ static void VMChunkFinish(Chunk chunk)
|
|||
|
||||
/* Copy VM descriptor to stack-local storage so that we can continue
|
||||
* using the descriptor after the VM has been unmapped. */
|
||||
(void)mps_lib_memcpy(vm, VMChunkVM(vmChunk), sizeof *vm);
|
||||
VMCopy(vm, VMChunkVM(vmChunk));
|
||||
|
||||
vmArenaUnmap(VMChunkVMArena(vmChunk), vm,
|
||||
VMBase(vm), vmChunk->overheadMappedLimit);
|
||||
|
||||
/* No point in finishing the other fields, since they are unmapped. */
|
||||
|
||||
VMDestroy(vm);
|
||||
VMFinish(vm);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -532,14 +532,14 @@ static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args)
|
|||
don't have anywhere else to put it. It gets copied later. */
|
||||
res = VMParamFromArgs(vmParams, sizeof(vmParams), args);
|
||||
if (res != ResOK)
|
||||
goto failVMCreate;
|
||||
goto failVMInit;
|
||||
|
||||
/* Create a VM to hold the arena and map it. Store descriptor on the
|
||||
stack until we have the arena to put it in. */
|
||||
vmArenaSize = SizeAlignUp(sizeof(VMArenaStruct), MPS_PF_ALIGN);
|
||||
res = VMCreate(vm, vmArenaSize, grainSize, vmParams);
|
||||
res = VMInit(vm, vmArenaSize, grainSize, vmParams);
|
||||
if (res != ResOK)
|
||||
goto failVMCreate;
|
||||
goto failVMInit;
|
||||
res = VMMap(vm, VMBase(vm), VMLimit(vm));
|
||||
if (res != ResOK)
|
||||
goto failVMMap;
|
||||
|
|
@ -553,7 +553,7 @@ static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args)
|
|||
arena->committed = VMMapped(vm);
|
||||
|
||||
/* Copy VM descriptor into its place in the arena. */
|
||||
(void)mps_lib_memcpy(VMArenaVM(vmArena), vm, sizeof *vm);
|
||||
VMCopy(VMArenaVM(vmArena), vm);
|
||||
vmArena->spareSize = 0;
|
||||
RingInit(&vmArena->spareRing);
|
||||
|
||||
|
|
@ -601,8 +601,8 @@ static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args)
|
|||
failArenaInit:
|
||||
VMUnmap(vm, VMBase(vm), VMLimit(vm));
|
||||
failVMMap:
|
||||
VMDestroy(vm);
|
||||
failVMCreate:
|
||||
VMFinish(vm);
|
||||
failVMInit:
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
@ -638,9 +638,9 @@ static void VMArenaFinish(Arena arena)
|
|||
|
||||
/* Copy VM descriptor to stack-local storage so that we can continue
|
||||
* using the descriptor after the VM has been unmapped. */
|
||||
(void)mps_lib_memcpy(vm, VMArenaVM(vmArena), sizeof *vm);
|
||||
VMCopy(vm, VMArenaVM(vmArena));
|
||||
VMUnmap(vm, VMBase(vm), VMLimit(vm));
|
||||
VMDestroy(vm);
|
||||
VMFinish(vm);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
*/
|
||||
|
||||
#define EVENT_VERSION_MAJOR ((unsigned)1)
|
||||
#define EVENT_VERSION_MEDIAN ((unsigned)3)
|
||||
#define EVENT_VERSION_MEDIAN ((unsigned)4)
|
||||
#define EVENT_VERSION_MINOR ((unsigned)0)
|
||||
|
||||
|
||||
|
|
@ -115,8 +115,8 @@
|
|||
/* TraceScanArea{Tagged} abuses kind, see .kind.abuse */ \
|
||||
EVENT(X, TraceScanArea , 0x0029, TRUE, Seg) \
|
||||
EVENT(X, TraceScanAreaTagged, 0x002a, TRUE, Seg) \
|
||||
EVENT(X, VMCreate , 0x002b, TRUE, Arena) \
|
||||
EVENT(X, VMDestroy , 0x002c, TRUE, Arena) \
|
||||
EVENT(X, VMInit , 0x002b, TRUE, Arena) \
|
||||
EVENT(X, VMFinish , 0x002c, TRUE, Arena) \
|
||||
EVENT(X, VMMap , 0x002d, TRUE, Seg) \
|
||||
EVENT(X, VMUnmap , 0x002e, TRUE, Seg) \
|
||||
EVENT(X, ArenaExtend , 0x002f, TRUE, Arena) \
|
||||
|
|
@ -368,12 +368,12 @@
|
|||
PARAM(X, 1, P, base) \
|
||||
PARAM(X, 2, P, limit)
|
||||
|
||||
#define EVENT_VMCreate_PARAMS(PARAM, X) \
|
||||
#define EVENT_VMInit_PARAMS(PARAM, X) \
|
||||
PARAM(X, 0, P, vm) \
|
||||
PARAM(X, 1, A, base) \
|
||||
PARAM(X, 2, A, limit)
|
||||
|
||||
#define EVENT_VMDestroy_PARAMS(PARAM, X) \
|
||||
#define EVENT_VMFinish_PARAMS(PARAM, X) \
|
||||
PARAM(X, 0, P, vm)
|
||||
|
||||
#define EVENT_VMMap_PARAMS(PARAM, X) \
|
||||
|
|
|
|||
|
|
@ -565,7 +565,7 @@ void EventReplay(Event event, Word etime)
|
|||
mps_reservoir_limit_set((mps_arena_t)entry, (size_t)event->pw.w1);
|
||||
} break;
|
||||
case EventVMMap: case EventVMUnmap:
|
||||
case EventVMCreate: case EventVMDestroy:
|
||||
case EventVMInit: case EventVMFinish:
|
||||
case EventArenaWriteFaults:
|
||||
case EventArenaAlloc: case EventArenaAllocFail: case EventArenaFree:
|
||||
case EventSegAlloc: case EventSegAllocFail: case EventSegFree:
|
||||
|
|
|
|||
|
|
@ -80,6 +80,17 @@ Size (VMMapped)(VM vm)
|
|||
}
|
||||
|
||||
|
||||
/* VMCopy -- copy VM descriptor */
|
||||
|
||||
void VMCopy(VM dest, VM src)
|
||||
{
|
||||
AVER(dest != NULL);
|
||||
AVERT(VM, src);
|
||||
|
||||
(void)mps_lib_memcpy(dest, src, sizeof(VMStruct));
|
||||
}
|
||||
|
||||
|
||||
/* C. COPYRIGHT AND LICENSE
|
||||
*
|
||||
* Copyright (C) 2014 Ravenbrook Limited <http://www.ravenbrook.com/>.
|
||||
|
|
|
|||
|
|
@ -10,7 +10,12 @@
|
|||
#include "mpmtypes.h"
|
||||
|
||||
|
||||
/* VMStruct -- virtual memory structure */
|
||||
/* VMStruct -- virtual memory structure
|
||||
*
|
||||
* Unlike most other datatypes we permit this structure to be moved
|
||||
* around in memory, and in particular, allocated temporarily on the
|
||||
* stack, to help with bootstrapping. Look for uses of VMCopy.
|
||||
*/
|
||||
|
||||
#define VMSig ((Sig)0x519B3999) /* SIGnature VM */
|
||||
|
||||
|
|
@ -34,14 +39,15 @@ extern Size PageSize(void);
|
|||
extern Size (VMPageSize)(VM vm);
|
||||
extern Bool VMCheck(VM vm);
|
||||
extern Res VMParamFromArgs(void *params, size_t paramSize, ArgList args);
|
||||
extern Res VMCreate(VM vmReturn, Size size, Size grainSize, void *params);
|
||||
extern void VMDestroy(VM vm);
|
||||
extern Res VMInit(VM vmReturn, Size size, Size grainSize, void *params);
|
||||
extern void VMFinish(VM vm);
|
||||
extern Addr (VMBase)(VM vm);
|
||||
extern Addr (VMLimit)(VM vm);
|
||||
extern Res VMMap(VM vm, Addr base, Addr limit);
|
||||
extern void VMUnmap(VM vm, Addr base, Addr limit);
|
||||
extern Size (VMReserved)(VM vm);
|
||||
extern Size (VMMapped)(VM vm);
|
||||
extern void VMCopy(VM dest, VM src);
|
||||
|
||||
|
||||
#endif /* vm_h */
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@ Res VMParamFromArgs(void *params, size_t paramSize, ArgList args)
|
|||
}
|
||||
|
||||
|
||||
/* VMCreate -- reserve some virtual address space, and create a VM structure */
|
||||
/* VMInit -- reserve some virtual address space, and create a VM structure */
|
||||
|
||||
Res VMCreate(VM vm, Size size, Size grainSize, void *params)
|
||||
Res VMInit(VM vm, Size size, Size grainSize, void *params)
|
||||
{
|
||||
void *vbase;
|
||||
Size pageSize, reserved;
|
||||
|
|
@ -75,14 +75,14 @@ Res VMCreate(VM vm, Size size, Size grainSize, void *params)
|
|||
vm->sig = VMSig;
|
||||
AVERT(VM, vm);
|
||||
|
||||
EVENT3(VMCreate, vm, VMBase(vm), VMLimit(vm));
|
||||
EVENT3(VMInit, vm, VMBase(vm), VMLimit(vm));
|
||||
return ResOK;
|
||||
}
|
||||
|
||||
|
||||
/* VMDestroy -- release all address space and finish VM structure */
|
||||
/* VMFinish -- release all address space and finish VM structure */
|
||||
|
||||
void VMDestroy(VM vm)
|
||||
void VMFinish(VM vm)
|
||||
{
|
||||
AVERT(VM, vm);
|
||||
/* Descriptor must not be stored inside its own VM at this point. */
|
||||
|
|
@ -91,7 +91,7 @@ void VMDestroy(VM vm)
|
|||
/* All address space must have been unmapped. */
|
||||
AVER(VMMapped(vm) == (Size)0);
|
||||
|
||||
EVENT1(VMDestroy, vm);
|
||||
EVENT1(VMFinish, vm);
|
||||
|
||||
vm->sig = SigInvalid;
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
* a definition of MAP_ANON requires a _BSD_SOURCE to be defined prior
|
||||
* to <sys/mman.h>; see config.h.
|
||||
*
|
||||
* .assume.not-last: The implementation of VMCreate assumes that
|
||||
* .assume.not-last: The implementation of VMInit assumes that
|
||||
* mmap() will not choose a region which contains the last page
|
||||
* in the address space, so that the limit of the mapped area
|
||||
* is representable.
|
||||
|
|
@ -84,9 +84,9 @@ Res VMParamFromArgs(void *params, size_t paramSize, ArgList args)
|
|||
}
|
||||
|
||||
|
||||
/* VMCreate -- reserve some virtual address space, and create a VM structure */
|
||||
/* VMInit -- reserve some virtual address space, and create a VM structure */
|
||||
|
||||
Res VMCreate(VM vm, Size size, Size grainSize, void *params)
|
||||
Res VMInit(VM vm, Size size, Size grainSize, void *params)
|
||||
{
|
||||
Size pageSize, reserved;
|
||||
void *vbase;
|
||||
|
|
@ -134,14 +134,14 @@ Res VMCreate(VM vm, Size size, Size grainSize, void *params)
|
|||
vm->sig = VMSig;
|
||||
AVERT(VM, vm);
|
||||
|
||||
EVENT3(VMCreate, vm, VMBase(vm), VMLimit(vm));
|
||||
EVENT3(VMInit, vm, VMBase(vm), VMLimit(vm));
|
||||
return ResOK;
|
||||
}
|
||||
|
||||
|
||||
/* VMDestroy -- release all address space and finish VM structure */
|
||||
/* VMFinish -- release all address space and finish VM structure */
|
||||
|
||||
void VMDestroy(VM vm)
|
||||
void VMFinish(VM vm)
|
||||
{
|
||||
int r;
|
||||
|
||||
|
|
@ -152,7 +152,7 @@ void VMDestroy(VM vm)
|
|||
/* All address space must have been unmapped. */
|
||||
AVER(VMMapped(vm) == (Size)0);
|
||||
|
||||
EVENT1(VMDestroy, vm);
|
||||
EVENT1(VMFinish, vm);
|
||||
|
||||
vm->sig = SigInvalid;
|
||||
|
||||
|
|
|
|||
|
|
@ -90,9 +90,9 @@ Res VMParamFromArgs(void *params, size_t paramSize, ArgList args)
|
|||
}
|
||||
|
||||
|
||||
/* VMCreate -- reserve some virtual address space, and create a VM structure */
|
||||
/* VMInit -- reserve some virtual address space, and create a VM structure */
|
||||
|
||||
Res VMCreate(VM vm, Size size, Size grainSize, void *params)
|
||||
Res VMInit(VM vm, Size size, Size grainSize, void *params)
|
||||
{
|
||||
LPVOID vbase;
|
||||
Size pageSize, reserved;
|
||||
|
|
@ -144,14 +144,14 @@ Res VMCreate(VM vm, Size size, Size grainSize, void *params)
|
|||
vm->sig = VMSig;
|
||||
AVERT(VM, vm);
|
||||
|
||||
EVENT3(VMCreate, vm, VMBase(vm), VMLimit(vm));
|
||||
EVENT3(VMInit, vm, VMBase(vm), VMLimit(vm));
|
||||
return ResOK;
|
||||
}
|
||||
|
||||
|
||||
/* VMDestroy -- release address space and finish the VM structure */
|
||||
/* VMFinish -- release address space and finish the VM structure */
|
||||
|
||||
void VMDestroy(VM vm)
|
||||
void VMFinish(VM vm)
|
||||
{
|
||||
BOOL b;
|
||||
|
||||
|
|
@ -162,7 +162,7 @@ void VMDestroy(VM vm)
|
|||
/* All address space must have been unmapped. */
|
||||
AVER(VMMapped(vm) == (Size)0);
|
||||
|
||||
EVENT1(VMDestroy, vm);
|
||||
EVENT1(VMFinish, vm);
|
||||
|
||||
vm->sig = SigInvalid;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue