/* * Copyright 2014 Higher Frequency Trading * * http://www.higherfrequencytrading.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.openhft.lang.arena; import net.openhft.lang.io.*; import net.openhft.lang.io.serialization.ObjectSerializer; import java.io.File; import java.io.IOException; import java.nio.channels.FileChannel; /** * Created by peter.lawrey on 22/06/14. */ public class MappedArena implements Arena { static final byte[] MAGIC = "Arena001".getBytes(); static final int MAGIC_OFFSET = 0; static final int LOCK_OFFSET = MAGIC_OFFSET + 8; static final int ALLOCATE_SIZE_OFFSET = LOCK_OFFSET + 8; static final int ALLOCATIONS_OFFSET = ALLOCATE_SIZE_OFFSET + 4; static final int HEADER_ID_OFFSET0 = 32; static final int HEADER_ID_SIZE = 4; static final int HEADER_LENGTH = 64; final MappedArenaStores stores; private final Mode mode; private final OffHeapLock readLock; private final OffHeapLock writeLock; private final DirectBytes header; /** * The lock consists of the reading/writing mode, writer count, writers waiting, reader count, readers waiting */ public MappedArena(File file, long minSize, ObjectSerializer objectSerializer, Mode mode) throws IOException { this.mode = mode; stores = new MappedArenaStores(file, FileChannel.MapMode.READ_WRITE, minSize, objectSerializer); header = stores.acquire(0, HEADER_LENGTH); OffHeapReadWriteLock ohrwl = new OffHeapReadWriteLock(header, LOCK_OFFSET); readLock = ohrwl.readLock(); writeLock = ohrwl.writeLock(); } @Override public Mode getMode() { return mode; } @Override public OffHeapLock readLock() { return readLock; } @Override public OffHeapLock writeLock() { return writeLock; } @Override public int blockSizeBits() { return 0; } @Override public int allocate(int hash, int sizeInBlocks) { return 0; } @Override public int reallocate(int hash, int handle, int sizeInBlocks) { return 0; } @Override public void free(int hash, int handle, int sizeInBlocks) { } @Override public void copyTo(Bytes bytes, int handle) { } @Override public void copyFrom(int handle, Bytes bytes) { } @Override public void setBytes(int handle, NativeBytes bytes) throws IllegalStateException { } @Override public int firstHandleFor(int hash) { return 0; } @Override public int nextHandle() { return 0; } @Override public int handlesUsed() { return 0; } @Override public int handlesCapacity() { return 0; } @Override public int entriesUsed() { return 0; } @Override public int entriesCapacity() { return 0; } }