#include "vmhdr.h"
#if __STD_C
int vmwalk(Vmalloc_t* vm, int(*segf)(Vmalloc_t*, Void_t*, size_t, Vmdisc_t*) )
#else
int vmwalk(vm, segf)
Vmalloc_t* vm;
int(* segf)();
#endif
{
reg Seg_t* seg;
reg int rv;
if(!vm)
{ for(vm = Vmheap; vm; vm = vm->next)
{ if(!(vm->data->mode&VM_TRUST) && ISLOCK(vm->data,0) )
continue;
SETLOCK(vm->data,0);
for(seg = vm->data->seg; seg; seg = seg->next)
{ rv = (*segf)(vm, seg->addr, seg->extent, vm->disc);
if(rv < 0)
return rv;
}
CLRLOCK(vm->data,0);
}
}
else
{ if(!(vm->data->mode&VM_TRUST) && ISLOCK(vm->data,0) )
return -1;
SETLOCK(vm->data,0);
for(seg = vm->data->seg; seg; seg = seg->next)
{ rv = (*segf)(vm, seg->addr, seg->extent, vm->disc);
if(rv < 0)
return rv;
}
CLRLOCK(vm->data,0);
}
return 0;
}