Skip to content

Commit

Permalink
Enable compressible address encoding for off-heap mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
JoshRosen committed May 5, 2015
1 parent 7ee918e commit 69232fd
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
Expand Up @@ -175,12 +175,8 @@ public void free(MemoryBlock memory) {
* This address will remain valid as long as the corresponding page has not been freed.
*/
public long encodePageNumberAndOffset(MemoryBlock page, long offsetInPage) {
if (inHeap) {
assert (page.pageNumber != -1) : "encodePageNumberAndOffset called with invalid page";
return (((long) page.pageNumber) << 51) | (offsetInPage & MASK_LONG_LOWER_51_BITS);
} else {
return offsetInPage;
}
assert (page.pageNumber != -1) : "encodePageNumberAndOffset called with invalid page";
return (((long) page.pageNumber) << 51) | (offsetInPage & MASK_LONG_LOWER_51_BITS);
}

/**
Expand All @@ -204,10 +200,13 @@ public Object getPage(long pagePlusOffsetAddress) {
* {@link TaskMemoryManager#encodePageNumberAndOffset(MemoryBlock, long)}
*/
public long getOffsetInPage(long pagePlusOffsetAddress) {
final long offsetInPage = (pagePlusOffsetAddress & MASK_LONG_LOWER_51_BITS);
if (inHeap) {
return (pagePlusOffsetAddress & MASK_LONG_LOWER_51_BITS);
return offsetInPage;
} else {
return pagePlusOffsetAddress;
final int pageNumber = (int) ((pagePlusOffsetAddress & MASK_LONG_UPPER_13_BITS) >>> 51);
assert (pageNumber >= 0 && pageNumber < PAGE_TABLE_SIZE);
return pageTable[pageNumber].getBaseOffset() + offsetInPage;
}
}

Expand Down
Expand Up @@ -38,4 +38,24 @@ public void leakedPageMemoryIsDetected() {
Assert.assertEquals(4096, manager.cleanUpAllAllocatedMemory());
}

@Test
public void encodePageNumberAndOffsetOffHeap() {
final TaskMemoryManager manager =
new TaskMemoryManager(new ExecutorMemoryManager(MemoryAllocator.UNSAFE));
final MemoryBlock dataPage = manager.allocatePage(256);
final long encodedAddress = manager.encodePageNumberAndOffset(dataPage, 64);
Assert.assertEquals(null, manager.getPage(encodedAddress));
Assert.assertEquals(dataPage.getBaseOffset() + 64, manager.getOffsetInPage(encodedAddress));
}

@Test
public void encodePageNumberAndOffsetOnHeap() {
final TaskMemoryManager manager =
new TaskMemoryManager(new ExecutorMemoryManager(MemoryAllocator.HEAP));
final MemoryBlock dataPage = manager.allocatePage(256);
final long encodedAddress = manager.encodePageNumberAndOffset(dataPage, 64);
Assert.assertEquals(dataPage.getBaseObject(), manager.getPage(encodedAddress));
Assert.assertEquals(64, manager.getOffsetInPage(encodedAddress));
}

}

0 comments on commit 69232fd

Please sign in to comment.