diff options
author | Ian Rogers <irogers@google.com> | 2014-07-17 11:09:10 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-08-08 08:29:53 -0700 |
commit | 68d8b42ddec39ec0174162d90d4abaa004d1983e (patch) | |
tree | 0bb6ccf3b996bb8363c10d07aa39cde221980602 /runtime/jni_env_ext.h | |
parent | 9c522c2cbbf50dc687728747b37ad59985750b65 (diff) | |
download | art-68d8b42ddec39ec0174162d90d4abaa004d1983e.zip art-68d8b42ddec39ec0174162d90d4abaa004d1983e.tar.gz art-68d8b42ddec39ec0174162d90d4abaa004d1983e.tar.bz2 |
Wire up check JNI force copy mode.
Increase check JNI checks.
Break apart jni_internal.h in to jni_env_ext.h and java_vm_ext.h.
Fix the abuse of ScopedObjectAccess/annotalysis by ScopedCheck in the case
of VM routines.
Make class loader override and shared library class loader JNI global
references rather than mirror pointers.
Clean-ups to native bridge.
Change-Id: If7c6110b5aade7a402bfb67534af86a7b2cdeb55
Diffstat (limited to 'runtime/jni_env_ext.h')
-rw-r--r-- | runtime/jni_env_ext.h | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/runtime/jni_env_ext.h b/runtime/jni_env_ext.h new file mode 100644 index 0000000..af87cb4 --- /dev/null +++ b/runtime/jni_env_ext.h @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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. + */ + +#ifndef ART_RUNTIME_JNI_ENV_EXT_H_ +#define ART_RUNTIME_JNI_ENV_EXT_H_ + +#include <jni.h> + +#include "base/macros.h" +#include "base/mutex.h" +#include "indirect_reference_table.h" +#include "object_callbacks.h" +#include "reference_table.h" + +namespace art { + +class JavaVMExt; + +// Maximum number of local references in the indirect reference table. The value is arbitrary but +// low enough that it forces sanity checks. +static constexpr size_t kLocalsMax = 512; + +struct JNIEnvExt : public JNIEnv { + JNIEnvExt(Thread* self, JavaVMExt* vm); + ~JNIEnvExt(); + + void DumpReferenceTables(std::ostream& os) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + void SetCheckJniEnabled(bool enabled); + + void PushFrame(int capacity); + void PopFrame(); + + template<typename T> + T AddLocalReference(mirror::Object* obj) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + static Offset SegmentStateOffset(); + + static Offset LocalRefCookieOffset() { + return Offset(OFFSETOF_MEMBER(JNIEnvExt, local_ref_cookie)); + } + + static Offset SelfOffset() { + return Offset(OFFSETOF_MEMBER(JNIEnvExt, self)); + } + + jobject NewLocalRef(mirror::Object* obj) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + void DeleteLocalRef(jobject obj) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + + Thread* const self; + JavaVMExt* const vm; + + // Cookie used when using the local indirect reference table. + uint32_t local_ref_cookie; + + // JNI local references. + IndirectReferenceTable locals GUARDED_BY(Locks::mutator_lock_); + + // Stack of cookies corresponding to PushLocalFrame/PopLocalFrame calls. + // TODO: to avoid leaks (and bugs), we need to clear this vector on entry (or return) + // to a native method. + std::vector<uint32_t> stacked_local_ref_cookies; + + // Frequently-accessed fields cached from JavaVM. + bool check_jni; + + // How many nested "critical" JNI calls are we in? + int critical; + + // Entered JNI monitors, for bulk exit on thread detach. + ReferenceTable monitors; + + // Used by -Xcheck:jni. + const JNINativeInterface* unchecked_functions; +}; + +// Used to save and restore the JNIEnvExt state when not going through code created by the JNI +// compiler. +class ScopedJniEnvLocalRefState { + public: + explicit ScopedJniEnvLocalRefState(JNIEnvExt* env) : env_(env) { + saved_local_ref_cookie_ = env->local_ref_cookie; + env->local_ref_cookie = env->locals.GetSegmentState(); + } + + ~ScopedJniEnvLocalRefState() { + env_->locals.SetSegmentState(env_->local_ref_cookie); + env_->local_ref_cookie = saved_local_ref_cookie_; + } + + private: + JNIEnvExt* const env_; + uint32_t saved_local_ref_cookie_; + + DISALLOW_COPY_AND_ASSIGN(ScopedJniEnvLocalRefState); +}; + +} // namespace art + +#endif // ART_RUNTIME_JNI_ENV_EXT_H_ |