if (VM.VerifyAssertions) VM.assert(current_block.nextblock == 0);
if (VM.VerifyAssertions) VM._assert(current_block.nextblock == 0);
    getnewblock (int ndx) {	VM_Processor st = VM_Processor.getCurrentProcessor();	VM_SizeControl this_size = st.sizes[ndx];	VM_BlockControl current_block = blocks[this_size.current_block];    	// FIX BUG: if the same size appears > 1 time in the array (see caller)	// blocks assigned before the last time are lost 	// if (current_block.nextblock != 0) return 0;	// dfb: Huh?  I don't understand the above if/return statement, so for now assume it never happens.	if (VM.VerifyAssertions) VM.assert(current_block.nextblock == 0);	/// NEW LOGIC; trigger gc when no more blocks are available	/// if (--blocks_available <= 2) {	///   gc_collect_now = true;	///   if (GC_TRIGGERGC)    VM_Scheduler.trace(" gc triggered by small object alloc \n", "XX");	/// }	//  NEW LOGIC; return -1 to indicate small object triggered gc.	sysLockSmall.lock();	if (first_freeblock == OUT_OF_BLOCKS) {	    needToFreeBlocks = true;	    sysLockSmall.release();	    gc1();	    freeBlocks(st);	// free locally and hope this tides us over	    if (first_freeblock == OUT_OF_BLOCKS) {		VM.sysWrite("$$$$ Out of free blocks\n");		// VM.sysExit(1300);	    }	    return -1;	}	int newblock = first_freeblock;	VM_BlockControl alloc_block = blocks[newblock];	first_freeblock = alloc_block.nextblock;	// new first_freeblock	blocks_available--;	if (--blocksCountDown == 0) {	    if (VM_Scheduler.allProcessorsInitialized) {		gc_collect_now = true;	    }	    blocksCountDown = num_blocks >> 5;	}	sysLockSmall.unlock();	alloc_block.nextblock = 0;	// this is last block in list for thissize	alloc_block.slotsize  = GC_SIZEVALUES[ndx];	int size = GC_BLOCKSIZE/GC_SIZEVALUES[ndx] ;		// Get space for alloc arrays from AIX.	int mark_array_size = getByteArrayInstanceSize(size);	VM_Address location = mallocHeap.allocateZeroedMemory(2*mark_array_size);	// zero the array bytes used for allocation (mark is zeroed at	// beginning of gc)	VM_Memory.zero(location, location.add(mark_array_size));	alloc_block.Alloc1 = makeByteArrayFromStorage(location, size, mark_array_size);	alloc_block.Alloc2 = makeByteArrayFromStorage(location.add(mark_array_size), size, mark_array_size);	alloc_block.alloc  = alloc_block.Alloc1;	alloc_block.mark   = alloc_block.Alloc2;	current_block.nextblock = newblock;	this_size.current_block = newblock;	return 0;    }