blob: 02198e842bebd4972eb099a75984b704241128fd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#include <open/vm_gc.h>
#include <jni.h>
#include "open/vm_util.h"
#include "environment.h"
#include "../thread/gc_thread.h"
#include "../gen/gen.h"
#include "java_support.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_apache_harmony_drlvm_gc_gen_GCHelper
* Method: TLSFreeOffset
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_TLSGCOffset(JNIEnv *e, jclass c)
{
return (jint)tls_gc_offset;
}
JNIEXPORT jobject JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getNosBoundary(JNIEnv *e, jclass c)
{
return (jobject)nos_boundary;
}
JNIEXPORT jboolean JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getGenMode(JNIEnv *e, jclass c)
{
return (jboolean)gc_is_gen_mode();
}
JNIEXPORT void JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_helperCallback(JNIEnv *e, jclass c)
{
java_helper_inlined = TRUE;
POINTER_SIZE_INT obj = *(POINTER_SIZE_INT*)c;
/* a trick to get the GCHelper_class j.l.c in order to manipulate its
fields in GC native code */
Class_Handle *vm_class_ptr = (Class_Handle *)(obj + VM_Global_State::loader_env->vm_class_offset);
GCHelper_clss = *vm_class_ptr;
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getZeroingSize(JNIEnv *e, jclass c)
{
#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
return (jint)ZEROING_SIZE;
#else
return (jint)0;
#endif
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getPrefetchDist(JNIEnv *e, jclass c)
{
#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
return (jint)PREFETCH_DISTANCE;
#else
return (jint)0;
#endif
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getPrefetchStride(JNIEnv *e, jclass c)
{
#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
return (jint)PREFETCH_STRIDE;
#else
return (jint)0;
#endif
}
JNIEXPORT jboolean JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_isPrefetchEnabled(JNIEnv *, jclass)
{
#if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH)
return (jboolean) PREFETCH_ENABLED;
#else
return (jboolean)JNI_FALSE;
#endif
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getTlaFreeOffset(JNIEnv *, jclass)
{
return (jint)((POINTER_SIZE_INT) &(((Allocator*)0)->free));
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getTlaCeilingOffset(JNIEnv *, jclass)
{
return (jint)((POINTER_SIZE_INT) &(((Allocator*)0)->ceiling));
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getTlaEndOffset(JNIEnv *, jclass)
{
return (jint)((POINTER_SIZE_INT) &(((Allocator*)0)->end));
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getGCObjectAlignment(JNIEnv *, jclass)
{
return (jint) GC_OBJECT_ALIGNMENT;
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getLargeObjectSize(JNIEnv *, jclass)
{
return (jint) GC_LOS_OBJ_SIZE_THRESHOLD;
}
#define OFFSET(structure, member) ((int)(POINTER_SIZE_INT) &((structure *)0)->member)
JNIEXPORT jlong JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getVTBase(JNIEnv *e, jclass c)
{
return (jlong)vtable_base;
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getArrayElemSizeOffsetInGCVT(JNIEnv *e, jclass c)
{
return (jint)OFFSET(GC_VTable_Info,array_elem_size);
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getArrayFirstElemOffsetInGCVT(JNIEnv *e, jclass c)
{
return (jint)OFFSET(GC_VTable_Info,array_first_elem_offset);
}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1gen_GCHelper_getGCAllocatedSizeOffsetInGCVT(JNIEnv *e, jclass c)
{
return (jint)OFFSET(GC_VTable_Info,gc_allocated_size);
}
#ifdef __cplusplus
}
#endif