blob: d2619026b419f62ecfb9b2de5c5014efac99da26 [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 "JniError.h"
void gluten::JniErrorState::ensureInitialized(JNIEnv* env) {
std::lock_guard<std::mutex> lockGuard(mtx_);
if (initialized_) {
return;
}
initialize(env);
initialized_ = true;
}
void gluten::JniErrorState::assertInitialized() {
if (!initialized_) {
throw gluten::GlutenException("Fatal: JniErrorState::Initialize(...) was not called before using the utility");
}
}
jclass gluten::JniErrorState::runtimeExceptionClass() {
assertInitialized();
return runtimeExceptionClass_;
}
jclass gluten::JniErrorState::illegalAccessExceptionClass() {
assertInitialized();
return illegalAccessExceptionClass_;
}
jclass gluten::JniErrorState::glutenExceptionClass() {
assertInitialized();
return glutenExceptionClass_;
}
void gluten::JniErrorState::initialize(JNIEnv* env) {
glutenExceptionClass_ = createGlobalClassReference(env, "Lorg/apache/gluten/exception/GlutenException;");
ioExceptionClass_ = createGlobalClassReference(env, "Ljava/io/IOException;");
runtimeExceptionClass_ = createGlobalClassReference(env, "Ljava/lang/RuntimeException;");
unsupportedOperationExceptionClass_ = createGlobalClassReference(env, "Ljava/lang/UnsupportedOperationException;");
illegalAccessExceptionClass_ = createGlobalClassReference(env, "Ljava/lang/IllegalAccessException;");
illegalArgumentExceptionClass_ = createGlobalClassReference(env, "Ljava/lang/IllegalArgumentException;");
JavaVM* vm;
if (env->GetJavaVM(&vm) != JNI_OK) {
throw gluten::GlutenException("Unable to get JavaVM instance");
}
vm_ = vm;
}
void gluten::JniErrorState::close() {
std::lock_guard<std::mutex> lockGuard(mtx_);
if (closed_) {
return;
}
JNIEnv* env = nullptr;
attachCurrentThreadAsDaemonOrThrow(vm_, &env);
env->DeleteGlobalRef(glutenExceptionClass_);
env->DeleteGlobalRef(ioExceptionClass_);
env->DeleteGlobalRef(runtimeExceptionClass_);
env->DeleteGlobalRef(unsupportedOperationExceptionClass_);
env->DeleteGlobalRef(illegalAccessExceptionClass_);
env->DeleteGlobalRef(illegalArgumentExceptionClass_);
closed_ = true;
}