Github user cloud-fan commented on a diff in the pull request:
https://github.com/apache/spark/pull/19222#discussion_r175604820
--- Diff:
common/unsafe/src/main/java/org/apache/spark/unsafe/memory/UnsafeMemoryAllocator.java
---
@@ -36,22 +42,34 @@ public MemoryBlock allocate(long size) throws
OutOfMemoryError {
@Override
public void free(MemoryBlock memory) {
- assert (memory.obj == null) :
- "baseObject not null; are you trying to use the off-heap allocator
to free on-heap memory?";
- assert (memory.pageNumber !=
MemoryBlock.FREED_IN_ALLOCATOR_PAGE_NUMBER) :
+ assert(memory instanceof OffHeapMemoryBlock) :
+ "UnsafeMemoryAllocator can only free OffHeapMemoryBlock.";
+ if (memory == OffHeapMemoryBlock.NULL) return;
+ assert (memory.getPageNumber() !=
MemoryBlock.FREED_IN_ALLOCATOR_PAGE_NUMBER) :
"page has already been freed";
- assert ((memory.pageNumber == MemoryBlock.NO_PAGE_NUMBER)
- || (memory.pageNumber ==
MemoryBlock.FREED_IN_TMM_PAGE_NUMBER)) :
+ assert ((memory.getPageNumber() == MemoryBlock.NO_PAGE_NUMBER)
+ || (memory.getPageNumber() ==
MemoryBlock.FREED_IN_TMM_PAGE_NUMBER)) :
"TMM-allocated pages must be freed via TMM.freePage(), not directly
in allocator free()";
if (MemoryAllocator.MEMORY_DEBUG_FILL_ENABLED) {
memory.fill(MemoryAllocator.MEMORY_DEBUG_FILL_FREED_VALUE);
}
+
Platform.freeMemory(memory.offset);
+
// As an additional layer of defense against use-after-free bugs, we
mutate the
// MemoryBlock to reset its pointer.
- memory.offset = 0;
+ memory.resetObjAndOffset();
// Mark the page as freed (so we can detect double-frees).
- memory.pageNumber = MemoryBlock.FREED_IN_ALLOCATOR_PAGE_NUMBER;
+ memory.setPageNumber(MemoryBlock.FREED_IN_ALLOCATOR_PAGE_NUMBER);
+ }
+
+ public OffHeapMemoryBlock reallocate(OffHeapMemoryBlock block, long
oldSize, long newSize) {
--- End diff --
no one is calling it.
---
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]