Beispiel #1
0
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;
}
Beispiel #2
0
 /**
  * \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));
 }
Beispiel #3
0
 /**
  * \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));
 }
Beispiel #4
0
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;	
}
Beispiel #5
0
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;
}
Beispiel #6
0
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);
}