File tree Expand file tree Collapse file tree 2 files changed +27
-8
lines changed
main/java/org/apache/spark/unsafe/memory
test/java/org/apache/spark/unsafe/memory Expand file tree Collapse file tree 2 files changed +27
-8
lines changed Original file line number Diff line number Diff line change @@ -175,12 +175,8 @@ public void free(MemoryBlock memory) {
175175 * This address will remain valid as long as the corresponding page has not been freed.
176176 */
177177 public long encodePageNumberAndOffset (MemoryBlock page , long offsetInPage ) {
178- if (inHeap ) {
179- assert (page .pageNumber != -1 ) : "encodePageNumberAndOffset called with invalid page" ;
180- return (((long ) page .pageNumber ) << 51 ) | (offsetInPage & MASK_LONG_LOWER_51_BITS );
181- } else {
182- return offsetInPage ;
183- }
178+ assert (page .pageNumber != -1 ) : "encodePageNumberAndOffset called with invalid page" ;
179+ return (((long ) page .pageNumber ) << 51 ) | (offsetInPage & MASK_LONG_LOWER_51_BITS );
184180 }
185181
186182 /**
@@ -204,10 +200,13 @@ public Object getPage(long pagePlusOffsetAddress) {
204200 * {@link TaskMemoryManager#encodePageNumberAndOffset(MemoryBlock, long)}
205201 */
206202 public long getOffsetInPage (long pagePlusOffsetAddress ) {
203+ final long offsetInPage = (pagePlusOffsetAddress & MASK_LONG_LOWER_51_BITS );
207204 if (inHeap ) {
208- return ( pagePlusOffsetAddress & MASK_LONG_LOWER_51_BITS ) ;
205+ return offsetInPage ;
209206 } else {
210- return pagePlusOffsetAddress ;
207+ final int pageNumber = (int ) ((pagePlusOffsetAddress & MASK_LONG_UPPER_13_BITS ) >>> 51 );
208+ assert (pageNumber >= 0 && pageNumber < PAGE_TABLE_SIZE );
209+ return pageTable [pageNumber ].getBaseOffset () + offsetInPage ;
211210 }
212211 }
213212
Original file line number Diff line number Diff line change @@ -38,4 +38,24 @@ public void leakedPageMemoryIsDetected() {
3838 Assert .assertEquals (4096 , manager .cleanUpAllAllocatedMemory ());
3939 }
4040
41+ @ Test
42+ public void encodePageNumberAndOffsetOffHeap () {
43+ final TaskMemoryManager manager =
44+ new TaskMemoryManager (new ExecutorMemoryManager (MemoryAllocator .UNSAFE ));
45+ final MemoryBlock dataPage = manager .allocatePage (256 );
46+ final long encodedAddress = manager .encodePageNumberAndOffset (dataPage , 64 );
47+ Assert .assertEquals (null , manager .getPage (encodedAddress ));
48+ Assert .assertEquals (dataPage .getBaseOffset () + 64 , manager .getOffsetInPage (encodedAddress ));
49+ }
50+
51+ @ Test
52+ public void encodePageNumberAndOffsetOnHeap () {
53+ final TaskMemoryManager manager =
54+ new TaskMemoryManager (new ExecutorMemoryManager (MemoryAllocator .HEAP ));
55+ final MemoryBlock dataPage = manager .allocatePage (256 );
56+ final long encodedAddress = manager .encodePageNumberAndOffset (dataPage , 64 );
57+ Assert .assertEquals (dataPage .getBaseObject (), manager .getPage (encodedAddress ));
58+ Assert .assertEquals (64 , manager .getOffsetInPage (encodedAddress ));
59+ }
60+
4161}
You can’t perform that action at this time.
0 commit comments