/** * Demand zero mmaps an area of virtual memory. * * @param start the address of the start of the area to be mapped * @param size the size, in bytes, of the area to be mapped * @return 0 if successful, otherwise the system errno */ public final int dzmmap(Address start, int size) { Address result = org.jikesrvm.runtime.Memory.dzmmap(start, Extent.fromIntZeroExtend(size)); if (result.EQ(start)) return 0; if (result.GT(Address.fromIntZeroExtend(127))) { VM.sysWrite("demand zero mmap with MAP_FIXED on ", start); VM.sysWriteln(" returned some other address", result); VM.sysFail("mmap with MAP_FIXED has unexpected behavior"); } return result.toInt(); }
/** * Allocate space for a new object. This is frequently executed code and the coding is * deliberaetly sensitive to the optimizing compiler. After changing this, always check the IR/MC * that is generated. * * @param bytes The number of bytes allocated * @param align The requested alignment * @param offset The offset from the alignment * @return The address of the first byte of the allocated region */ @Inline public final Address alloc(int bytes, int align, int offset) { /* establish how much we need */ Address start = alignAllocationNoFill(cursor, align, offset); Address end = start.plus(bytes); /* check whether we've exceeded the limit */ if (end.GT(limit)) { if (bytes > BYTES_IN_LINE) return overflowAlloc(bytes, align, offset); else return allocSlowHot(bytes, align, offset); } /* sufficient memory is available, so we can finish performing the allocation */ fillAlignmentGap(cursor, start); cursor = end; return start; }
/** * Allocate space for a new object. This is frequently executed code and the coding is * deliberaetly sensitive to the optimizing compiler. After changing this, always check the IR/MC * that is generated. * * @param bytes The number of bytes allocated * @param align The requested alignment * @param offset The offset from the alignment * @return The address of the first byte of the allocated region */ public final Address overflowAlloc(int bytes, int align, int offset) { /* establish how much we need */ Address start = alignAllocationNoFill(largeCursor, align, offset); Address end = start.plus(bytes); /* check whether we've exceeded the limit */ if (end.GT(largeLimit)) { requestForLarge = true; Address rtn = allocSlowInline(bytes, align, offset); requestForLarge = false; return rtn; } /* sufficient memory is available, so we can finish performing the allocation */ fillAlignmentGap(largeCursor, start); largeCursor = end; return start; }