blob: 048d1f0e1047c8a75a23ae56d0d83839e87fb93e [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 <common.h>
/******************************************************************************
** Generally-useful functions for JNI programming.
*****************************************************************************/
/**
* Throws a RuntimeException, with either an explicit message or the message
* corresponding to the current system error value.
*/
inline void
throw(JNIEnv* env, const char* msg) {
if (msg == NULL)
msg = strerror(errno);
jclass xklass = (*env)->FindClass(env, "java/lang/RuntimeException");
(*env)->ThrowNew(env, xklass, msg);
}
inline void*
addr_from_java(jlong addr) {
// This assert fails in a variety of ways on 32-bit systems.
// It is impossible to predict whether native code that converts
// pointers to longs will sign-extend or zero-extend the addresses.
//assert(addr == (uintptr_t)addr, "must not be odd high bits");
return (void*) (uintptr_t) addr;
}
inline jlong
addr_to_java(void* p) {
assert(p == (void*) (uintptr_t) p);
return (long) (uintptr_t) p;
}
inline void *
vrealloc(VMPool *pool, void *p, size_t size, int initzero) {
void *ret = NULL;
void *nativebuf = NULL;
if (NULL == p) {
if (initzero) {
nativebuf = memkind_calloc(pool->kind, 1, sizeof(uint8_t) * size + PMBHSZ);
} else {
nativebuf = memkind_malloc(pool->kind, sizeof(uint8_t) * size + PMBHSZ);
}
} else {
nativebuf = memkind_realloc(pool->kind, p, sizeof(uint8_t) * size + PMBHSZ);
}
if (NULL != nativebuf) {
((PMBHeader *) nativebuf)->size = size + PMBHSZ;
ret = nativebuf + PMBHSZ;
}
return ret;
}
inline void
vfree(VMPool *pool, void *p) {
if (p != NULL) {
memkind_free(pool->kind, p);
}
}
inline size_t
vsize(VMPool *pool, void *p) {
size_t ret = 0;
void* nativebuf;
if (p != NULL) {
nativebuf = p - PMBHSZ;
ret = ((PMBHeader *) nativebuf)->size - PMBHSZ;
}
return ret;
}