@Override public void freeDirectBuffer(ByteBuffer buffer) { journalFF.releaseBuffer(buffer); }
@Override public void flushBuffer(final ByteBuffer buffer, final boolean requestedSync, final List<IOCallback> callbacks) { buffer.flip(); if (buffer.limit() == 0) { factory.releaseBuffer(buffer); } else { writeDirect(buffer, requestedSync, new DelegateCallback(callbacks)); } }
@Override public void flushBuffer(final ByteBuffer buffer, final boolean requestedSync, final List<IOCallback> callbacks) { buffer.flip(); if (buffer.limit() == 0) { factory.releaseBuffer(buffer); } else { writeDirect(buffer, requestedSync, new DelegateCallback(callbacks)); } }
@Override public void flushBuffer(final ByteBuffer buffer, final boolean requestedSync, final List<IOCallback> callbacks) { buffer.flip(); if (buffer.limit() == 0) { try { invokeDoneOn(callbacks); } finally { factory.releaseBuffer(buffer); } } else { if (callbacks.isEmpty()) { try { sequentialFile.writeDirect(buffer, requestedSync); } catch (Exception e) { throw new IllegalStateException(e); } } else { delegateCallback.delegates = callbacks; try { sequentialFile.writeDirect(buffer, requestedSync, delegateCallback); } finally { delegateCallback.delegates = null; } } } }
@Override public void flushBuffer(final ByteBuffer buffer, final boolean requestedSync, final List<IOCallback> callbacks) { buffer.flip(); if (buffer.limit() == 0) { try { invokeDoneOn(callbacks); } finally { factory.releaseBuffer(buffer); } } else { if (callbacks.isEmpty()) { try { sequentialFile.writeDirect(buffer, requestedSync); } catch (Exception e) { throw new IllegalStateException(e); } } else { delegateCallback.delegates = callbacks; try { sequentialFile.writeDirect(buffer, requestedSync, delegateCallback); } finally { delegateCallback.delegates = null; } } } }
/** * @param bytes * @param sync * @param callback * @throws IOException * @throws Exception */ private void doInternalWrite(final ByteBuffer bytes, final boolean sync, final IOCallback callback, boolean releaseBuffer) throws IOException { try { channel.write(bytes); if (sync) { sync(); } if (callback != null) { callback.done(); } } finally { if (releaseBuffer) { //release it to recycle the write buffer if big enough this.factory.releaseBuffer(bytes); } } }
/** * @param bytes * @param sync * @param callback * @throws IOException * @throws Exception */ private void doInternalWrite(final ByteBuffer bytes, final boolean sync, final IOCallback callback, boolean releaseBuffer) throws IOException { try { channel.write(bytes); if (sync) { sync(); } if (callback != null) { callback.done(); } } finally { if (releaseBuffer) { //release it to recycle the write buffer if big enough this.factory.releaseBuffer(bytes); } } }
} finally { this.factory.releaseBuffer(zeroPage);
} finally { this.factory.releaseBuffer(zeroPage);
private void readFromSequentialFile(StorageManager storage, List<PagedMessage> messages) throws Exception { final int fileSize = (int) file.size(); //doesn't need to be a direct buffer: that case is covered using the MMAP read final ByteBuffer buffer = this.fileFactory.newBuffer(fileSize); try { file.position(0); file.read(buffer); buffer.rewind(); assert (buffer.limit() == fileSize) : "buffer doesn't contains the whole file"; ChannelBufferWrapper activeMQBuffer = wrapBuffer(fileSize, buffer); read(storage, activeMQBuffer, messages); } finally { this.fileFactory.releaseBuffer(buffer); } }
/** * @param file * @return * @throws Exception */ private JournalFileImpl readFileHeader(final SequentialFile file) throws Exception { ByteBuffer bb = fileFactory.newBuffer(JournalImpl.SIZE_HEADER); file.read(bb); int journalVersion = bb.getInt(); if (journalVersion != JournalImpl.FORMAT_VERSION) { boolean isCompatible = false; for (int v : JournalImpl.COMPATIBLE_VERSIONS) { if (v == journalVersion) { isCompatible = true; } } if (!isCompatible) { throw ActiveMQJournalBundle.BUNDLE.journalFileMisMatch(); } } int readUserVersion = bb.getInt(); if (readUserVersion != userVersion) { throw ActiveMQJournalBundle.BUNDLE.journalDifferentVersion(); } long fileID = bb.getLong(); fileFactory.releaseBuffer(bb); bb = null; return new JournalFileImpl(file, fileID, journalVersion); }
/** * @param file * @return * @throws Exception */ private JournalFileImpl readFileHeader(final SequentialFile file) throws Exception { ByteBuffer bb = fileFactory.newBuffer(JournalImpl.SIZE_HEADER); file.read(bb); int journalVersion = bb.getInt(); if (journalVersion != JournalImpl.FORMAT_VERSION) { boolean isCompatible = false; for (int v : JournalImpl.COMPATIBLE_VERSIONS) { if (v == journalVersion) { isCompatible = true; } } if (!isCompatible) { throw ActiveMQJournalBundle.BUNDLE.journalFileMisMatch(); } } int readUserVersion = bb.getInt(); if (readUserVersion != userVersion) { throw ActiveMQJournalBundle.BUNDLE.journalDifferentVersion(); } long fileID = bb.getLong(); fileFactory.releaseBuffer(bb); bb = null; return new JournalFileImpl(file, fileID, journalVersion); }
private void testBuffer(final SequentialFileFactory factory) { factory.start(); ByteBuffer buffer = factory.newBuffer(100); try { for (byte b = 0; b < 100; b++) { buffer.put(b); } buffer.rewind(); for (byte b = 0; b < 100; b++) { Assert.assertEquals(b, buffer.get()); } buffer.limit(10); factory.clearBuffer(buffer); buffer.limit(100); buffer.rewind(); for (byte b = 0; b < 100; b++) { if (b < 10) { Assert.assertEquals(0, buffer.get()); } else { Assert.assertEquals(b, buffer.get()); } } } finally { factory.releaseBuffer(buffer); factory.stop(); } }
@Test public void testBuffer() throws Exception { SequentialFile file = factory.createSequentialFile("filtetmp.log"); file.open(); ByteBuffer buff = factory.newBuffer(10); Assert.assertEquals(factory.getAlignment(), buff.limit()); file.close(); factory.releaseBuffer(buff); }