/**
* Copyright 2013, Landz and its contributors. All rights reserved.
*
* 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 z.offheap.zmalloc;
import z.offheap.zmalloc.Allocator;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
import static z.util.MethodHandles.LOOKUP;
import static z.util.Throwables.uncheck;
import static z.util.Throwables.uncheckTo;
/**
* wrap the private members of Allocator for testing
*
*/
public class AllocatorPrivatesBridge {
public static final long SIZE_ZMPAGE = SIZE_ZMPAGE();
// public static final int ZMPAGE_RAWCHUNK_OFFSET = SIZE_CACHE_LINE;
//============================================================================
public static int sizeClassIndex(int sizeOfBytes) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "sizeClassIndex",
MethodType.methodType(int.class,int.class)));
return (int)uncheckTo(()-> mh.invoke(sizeOfBytes));
}
public static long gp_Page_poll() {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "gp_Page_poll",
MethodType.methodType(long.class)));
return (long)uncheckTo(()-> mh.invoke());
}
public static void gp_Page_offer(long addressFreePage) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "gp_Page_offer",
MethodType.methodType(void.class,long.class)));
uncheck(() -> mh.invoke(addressFreePage));
}
public static long get_addressGP() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"addressGP",
long.class));
return (long)uncheckTo(()-> mh.invoke());
}
public static void tlp_ini(long tid) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "tlp_ini",
MethodType.methodType(void.class, long.class)));
uncheck(()-> mh.invoke(tid));
}
public static void tlp_AvailablePages_remove(long addrAvailablePageHead,
long removedPage) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "tlp_AvailablePages_remove",
MethodType.methodType(void.class,
long.class, long.class)));
uncheck(() -> mh.invoke(addrAvailablePageHead, removedPage));
}
public static void tlp_AvailablePages_addToHead(long addrAvailablePageHead,
long newAvailablePage) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "tlp_AvailablePages_addToHead",
MethodType.methodType(void.class,
long.class, long.class)));
uncheck(()-> mh.invoke(addrAvailablePageHead,newAvailablePage));
}
public static void tlp_AvailablePages_addToTail(long tid,
int sizeClassIndex,
long newAvailablePage) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "tlp_AvailablePages_addToTail",
MethodType.methodType(void.class,
long.class, int.class, long.class)));
uncheck(()-> mh.invoke(tid,sizeClassIndex,newAvailablePage));
}
public static void tlp_RemoteFreedChunksHead_add(long addrRemoteFreedChunksTail,
long addrRemoteFreedChunk) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "tlp_RemoteFreedChunksHead_add",
MethodType.methodType(void.class,
long.class, long.class)));
uncheck(()-> mh.invoke(addrRemoteFreedChunksTail,addrRemoteFreedChunk));
}
public static long tlp_RemoteFreedChunksHead_remove(long addrRemoteFreedChunksHead,
long addrRemoteFreedChunksTail,
long addrRemoteFreedChunksDummy) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "tlp_RemoteFreedChunksHead_remove",
MethodType.methodType(long.class,
long.class,long.class,long.class))
);
return (long)uncheckTo(()-> mh.invoke(addrRemoteFreedChunksHead,
addrRemoteFreedChunksTail,
addrRemoteFreedChunksDummy));
}
// public static void tlp_FreePages_push(long tid,
// long newFreePage) {
// MethodHandle mh = uncheckTo(() ->
// LOOKUP.findStatic(Allocator.class, "tlp_FreePages_push",
// MethodType.methodType(void.class,
// long.class, long.class)));
//
// uncheck(()-> mh.invoke(tid,newFreePage));
// }
//
// public static long tlp_FreePages_pop(long tid) {
// MethodHandle mh = uncheckTo(() ->
// LOOKUP.findStatic(Allocator.class, "tlp_FreePages_pop",
// MethodType.methodType(long.class,long.class)));
//
// return (long)uncheckTo(()-> mh.invoke(tid));
// }
public static void pg_setupPage(long addressPage,
int sizeClassIndex,
long tid) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "pg_setupPage",
MethodType.methodType(void.class,
long.class, int.class, long.class)));
uncheck(()-> mh.invoke(addressPage,sizeClassIndex,tid));
}
public static void pg_AvailableChunks_push(long addressPage,
long addressChunk) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "pg_AvailableChunks_push",
MethodType.methodType(void.class,
long.class, long.class)));
uncheck(()-> mh.invoke(addressPage,addressChunk));
}
public static long pg_AvailableChunks_pop(long addressPage) {
MethodHandle mh = uncheckTo(() ->
LOOKUP.findStatic(Allocator.class, "pg_AvailableChunks_pop",
MethodType.methodType(long.class,
long.class)));
return (long)uncheckTo(()-> mh.invoke(addressPage));
}
public static long addressTLPs() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"addressTLPs",
long.class));
return (long)uncheckTo(()-> mh.invoke());
}
public static long totalAvailablepages() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"totalAvailablepages",
long.class));
return (long)uncheckTo(()-> mh.invoke());
}
public static int TLP_ITEM() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"TLP_ITEM_SIZE",
int.class));
return (int)uncheckTo(()-> mh.invoke());
}
public static int TLP_AVAILABLEPAGES_OFFSET() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"TLP_AVAILABLEPAGES_OFFSET",
int.class));
return (int)uncheckTo(()-> mh.invoke());
}
public static int TLP_REMOTEFREEDCHUNKS_HEAD_OFFSET() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"TLP_REMOTEFREEDCHUNKS_HEAD_OFFSET",
int.class));
return (int)uncheckTo(()-> mh.invoke());
}
public static int TLP_REMOTEFREEDCHUNKS_TAIL_OFFSET() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"TLP_REMOTEFREEDCHUNKS_TAIL_OFFSET",
int.class));
return (int)uncheckTo(()-> mh.invoke());
}
public static int TLP_REMOTEFREEDCHUNKS_DUMMY_OFFSET() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"TLP_REMOTEFREEDCHUNKS_DUMMY_OFFSET",
int.class));
return (int)uncheckTo(()-> mh.invoke());
}
public static int SIZE_TLP_AVAILABLEPAGES_ITEM() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"TLP_AVAILABLEPAGES_ITEM_SIZE",
int.class));
return (int)uncheckTo(()-> mh.invoke());
}
public static int ZMPAGE_MAX_CHUNK_SIZE() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"ZMPAGE_MAX_CHUNK_SIZE",
int.class));
return (int)uncheckTo(()-> mh.invoke());
}
public static int ZMPAGE_TID_OFFSET() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"ZMPAGE_TID_OFFSET",
int.class));
return (int)uncheckTo(()-> mh.invoke());
}
public static long SIZE_ZMPAGE() {
MethodHandle mh =
uncheckTo(() ->
LOOKUP.findStaticGetter(
Allocator.class,
"SIZE_ZMPAGE",
long.class));
return (long)uncheckTo(()-> mh.invoke());
}
}