@Override public byte[] compress(Compressor compressor) throws MemoryException, IOException {
if (UnsafeMemoryManager.isOffHeap() && compressor.supportUnsafe()) {
int inputSize = totalLength;
long compressedMaxSize = compressor.maxCompressedLength(inputSize);
MemoryBlock compressed =
UnsafeMemoryManager.allocateMemoryWithRetry(taskId, compressedMaxSize);
long outSize = compressor.rawCompress(baseOffset, inputSize, compressed.getBaseOffset());
assert outSize < Integer.MAX_VALUE;
byte[] output = new byte[(int) outSize];
CarbonUnsafe.getUnsafe()
.copyMemory(compressed.getBaseObject(), compressed.getBaseOffset(), output,
CarbonUnsafe.BYTE_ARRAY_OFFSET, outSize);
UnsafeMemoryManager.INSTANCE.freeMemory(taskId, compressed);
return output;
} else {
return super.compress(compressor);
}
}