@After
 public void shutdownMemoryManager() throws Exception {
   if (this.memorySize > 0) {
     MemoryManager memMan = getMemoryManager();
     if (memMan != null) {
       Assert.assertTrue(
           "Memory Manager managed memory was not completely freed.", memMan.verifyEmpty());
       memMan.shutdown();
     }
   }
 }
  @Override
  public PactRecord peek() {
    if (readNext) {
      int bytesRead =
          currentReadRecord.deserialize(segments, CURRENT_READ_SEGMENT_INDEX, currentReadOffset);
      while (bytesRead > 0) {
        if (currentReadSegment.size() - currentReadOffset > bytesRead) {
          currentReadOffset += bytesRead;
          bytesRead = 0;
        } else {
          bytesRead -= (currentReadSegment.size() - currentReadOffset);

          // Remove old read segment from list & release in memory manager
          MemorySegment unused = segments.remove(CURRENT_READ_SEGMENT_INDEX);
          memoryManager.release(unused);

          // Update reference to new read segment
          currentReadSegment = segments.get(CURRENT_READ_SEGMENT_INDEX);
          currentReadOffset = 0;
        }
      }
      readNext = false;
    }

    return currentReadRecord;
  }
 @Override
 public int size() {
   if (count == 0) {
     // A memory segment can be left if it was not completely full
     if (segments.size() == 1) {
       currentWriteSegment = null;
       memoryManager.release(segments);
     } else if (segments.size() > 1) {
       throw new RuntimeException("Too many memory segments left");
     }
   }
   return count;
 }
 public SpillingResettableIterator(
     Iterator<T> input,
     TypeSerializer<T> serializer,
     MemoryManager memoryManager,
     IOManager ioManager,
     long availableMemory,
     AbstractInvokable parentTask)
     throws MemoryAllocationException {
   this(
       input,
       serializer,
       memoryManager,
       ioManager,
       memoryManager.allocatePages(parentTask, availableMemory),
       true);
 }
  private SpillingResettableIterator(
      Iterator<T> input,
      TypeSerializer<T> serializer,
      MemoryManager memoryManager,
      IOManager ioManager,
      List<MemorySegment> memory,
      boolean releaseMemOnClose) {
    this.memoryManager = memoryManager;
    this.input = input;
    this.instance = serializer.createInstance();
    this.serializer = serializer;
    this.memorySegments = memory;
    this.releaseMemoryOnClose = releaseMemOnClose;

    if (LOG.isDebugEnabled())
      LOG.debug(
          "Creating spilling resettable iterator with " + memory.size() + " pages of memory.");

    this.buffer =
        new SpillingBuffer(
            ioManager, new ListMemorySegmentSource(memory), memoryManager.getPageSize());
  }
 /**
  * Unregisters the task from the central memory manager.
  *
  * @param memoryManager the central memory manager
  */
 public void unregisterMemoryManager(final MemoryManager memoryManager) {
   if (memoryManager != null) {
     memoryManager.releaseAll(this.environment.getInvokable());
   }
 }
 @Override
 public void clear() {
   memoryManager.release(segments);
   segments.clear();
   count = 0;
 }