public EntityFactoryProxyHelper(Class<D> clazz, int shiftnum, ReclaimContext rctx) throws ClassNotFoundException, NoSuchMethodException { if (shiftnum < 0) { throw new OutOfBoundsException("Shift number cannot be negative"); } this.shiftnum = shiftnum; this.rcontext = rctx; Class c = Class.forName(clazz.getName() + "Factory"); Method[] fmtds = c.getDeclaredMethods(); for (int i = 0; i < fmtds.length; ++i) { if (fmtds[i].getName().equals("create") && fmtds[i].getParameterCount() == 5) { fcreatemtd = fmtds[i]; break; } } if (null == fcreatemtd) { throw new NoSuchMethodException("Not found proper factory create(...) method"); } for (int i = 0; i < fmtds.length; ++i) { if (fmtds[i].getName().equals("restore") && fmtds[i].getParameterCount() == 6) { frestoremtd = fmtds[i]; break; } } if (null == frestoremtd) { throw new NoSuchMethodException("Not found proper factory restore(...) method"); } }
public ChunkBuffer(DurableChunk<A> dchunk, long offset, int size) { Field address, capacity; m_dchunk = dchunk; if (null != dchunk && size > 0 && offset >= 0 && offset + size <= dchunk.getSize()) { ByteBuffer bb = ByteBuffer.allocateDirect(0).order(ByteOrder.nativeOrder()); try { address = Buffer.class.getDeclaredField("address"); address.setAccessible(true); capacity = Buffer.class.getDeclaredField("capacity"); capacity.setAccessible(true); address.setLong(bb, dchunk.get() + offset); capacity.setInt(bb, size); bb.limit(size); m_buffer = bb; m_offset = offset; m_size = size; } catch (NoSuchFieldException e) { throw new ConfigurationException("Buffer fields not found."); } catch (IllegalAccessException e) { throw new ConfigurationException("Buffer fields cannot be accessed."); } } else { throw new OutOfBoundsException("The ChunkBuffer is out of bounds of its backed DurableChunk."); } }
public void syncToNonVolatileMemory(long offset, int length) { if (offset < 0 || length < 0 || offset + length > this.m_size) { throw new OutOfBoundsException("The requested offset and length are out of bounds for this buffer: length = " + length + " , offset = " + offset); } if (m_dchunk.getAllocator() instanceof NonVolatileMemAllocator) { NonVolatileMemAllocator alloc = (NonVolatileMemAllocator) m_dchunk.getAllocator(); alloc.syncToNonVolatileMemory(m_dchunk.get() + m_offset + offset, length, false); } else { throw new UnsupportedOperationException("The ChunkBuffer does not backed by a non-volatile allocator"); } }
public void syncToVolatileMemory(long offset, int length) { if (offset < 0 || length < 0 || offset + length > this.m_size) { throw new OutOfBoundsException("The requested offset and length are out of bounds for this buffer: length = " + length + " , offset = " + offset); } m_dchunk.getAllocator().syncToVolatileMemory(m_dchunk.get() + m_offset + offset, length, false); }
public void syncToLocal(long offset, int length) { if (offset < 0 || length < 0 || offset + length > this.m_size) { throw new OutOfBoundsException("The requested offset and length are out of bounds for this buffer: length = " + length + " , offset = " + offset); } if (m_dchunk.getAllocator() instanceof NonVolatileMemAllocator) { NonVolatileMemAllocator alloc = (NonVolatileMemAllocator) m_dchunk.getAllocator(); alloc.syncToLocal(m_dchunk.get() + m_offset + offset, length, false); } else { throw new UnsupportedOperationException("The ChunkBuffer does not backed by a non-volatile allocator"); } }