private void preparePerMetricBufferSlices() { for (PcpValueInfo info : metricData.values()) { TypeHandler<?> rawHandler = info.getTypeHandler(); int bufferPosition = rawHandler.requiresLargeStorage() ? info.getLargeValue() .getOffset() : info.getOffset(); // need to position the original buffer first, as the sliced buffer starts from there dataFileBuffer.position(bufferPosition); ByteBuffer metricByteBufferSlice = dataFileBuffer.slice(); metricByteBufferSlice.limit(rawHandler.getDataLength()); perMetricByteBuffers.put(info, metricByteBufferSlice); metricByteBufferSlice.order(dataFileBuffer.order()); } }
@SuppressWarnings({ "unchecked", "rawtypes" }) private void writeValueSection(ByteBuffer dataFileBuffer) { int originalPosition = dataFileBuffer.position(); TypeHandler rawHandler = getTypeHandler(); if (rawHandler.requiresLargeStorage()) { // API requires the length here but it's currently unused -- write out the maximum // possible length dataFileBuffer.putLong(STRING_BLOCK_LIMIT); dataFileBuffer.putLong(getLargeValue().getOffset()); dataFileBuffer.position(getLargeValue().getOffset()); } rawHandler.putBytes(dataFileBuffer, getInitialValue()); dataFileBuffer.position(originalPosition + DATA_VALUE_LENGTH); dataFileBuffer.putLong(getDescriptorOffset()); dataFileBuffer.putLong(getInstanceOffset()); }
private void writeValueWithGlobalLock(PcpValueInfo info, Object value, TypeHandler rawHandler) { synchronized (globalLock) { dataFileBuffer.position(rawHandler.requiresLargeStorage() ? info.getLargeValue() .getOffset() : info.getOffset()); rawHandler.putBytes(dataFileBuffer, value); } }