extern VMRef VMalloc( int size, VMRef v ) { VMRef res; VMpage *page = &VMTable[page_(v)]; if( offset_(v) != 0 ) error("VM: VMalloc not called on base ref: %x",v); VMLRU(); size = wordlen(size); if( page->left < size ) { *(int *)&res = -1; return res; } MakeVMRef( res, page_( v ), (word)VMPageSize - page->left ); page->left -= size; page->status |= VMdirty; /* ensure it is dirtied */ return res; }
/** * \brief Return a pointer to the beginning of a boundary condition face */ BVal_t get_face(int group, int angle, Normal norm) { assert(angle < n_angle_); assert(group < n_group_); int off = bc_per_group_ * group + offset_(angle, (int)norm); return BVal_t(size_[angle][(int)norm], &data_(off)); }
/** * \brief Return a pointer to the beginning of the boundary values for * the given group and angle. Includes all faces */ BVal_t get_boundary(int group, int angle) { assert(angle < n_angle_); assert(group < n_group_); int size = size_[angle][0] + size_[angle][1] + size_[angle][2]; int off = bc_per_group_ * group + offset_(angle, 0); return BVal_t(size, &data_(off)); }
extern int VMleft( VMRef v ) { VMpage *page = &VMTable[page_(v)]; if( offset_(v) != 0 ) error("VM: VMleft not called on base ref: %x",v); VMLRU(); return page->left; }
extern VMRef VMnext( VMRef v ) { VMRef res; VMpage *page = &VMTable[page_(v)]; if( offset_(v) != 0 ) error("VM: VMnext not called on base ref: %x",v); VMLRU(); MakeVMRef( res, page_(v), (word)VMPageSize - page->left ); return res; }
extern APTR VMswap( VMRef v ) { VMpage *page = &VMTable[page_(v)]; APTR block; int filepage; int rsize; off_t pos = 0; if( (*(int *)&v < 0) || (page_(v) > VMTabUpb) || (offset_(v) > VMPageSize) ) error("VM invalid VMRef: %x",v); if( (page->status&VMswapped) == 0 ) { page->status |= VMtouched; /*fprintf(verfd,"VMswap %x -> %x\n",v,page->addr+offset_(v));*/ return page->addr+offset_(v); } VMLRU(); filepage = page->filepage; if( filepage == -1 ) error("VM: trying to swap in page without filepage"); block = VMfindblock(); /*printf("Swap in page %d from filepage %d to %x\n",page_(v),filepage,block);*/ swapins++; #ifdef NOPOSIX if( VMfile == NULL ) #else if( VMfile == -1 ) #endif error("VM: vmfile not open!!"); #ifdef NOPOSIX if( fseek(VMfile, (long)filepage * VMPageSize, SEEK_SET) != 0) { error("VM seek failure: %d %d %d",filepage,pos,errno); } else pos = filepage*VMPageSize; if( (rsize = fread(block, sizeof(char), VMPageSize, VMfile) ) != VMPageSize ) { error("VM read failure: %d %d %d",VMPageSize,rsize,errno); } #else if( (pos = lseek(VMfile,filepage * (off_t)VMPageSize, SEEK_SET)) != filepage * (off_t)VMPageSize) { error("VM seek failure: %d %d %d",filepage,pos,errno); } if( ( rsize = read(VMfile,block,VMPageSize) ) != VMPageSize ) { #ifdef __HELIOS error("VM read failure: %d %d %d %x",VMPageSize,rsize,errno,oserr); #else error("VM read failure: %d %d %d",VMPageSize,rsize,errno); #endif } #endif page->status = 0; page->addr = block; return page->addr+offset_(v); }