| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
- // This source code is licensed under both the GPLv2 (found in the
- // COPYING file in the root directory) and Apache 2.0 License
- // (found in the LICENSE.Apache file in the root directory).
- #include <jni.h>
- #include <map>
- #include <string>
- #include <unordered_set>
- #include <vector>
- #include "include/org_rocksdb_MemoryUtil.h"
- #include "rocksjni/portal.h"
- #include "rocksdb/utilities/memory_util.h"
- /*
- * Class: org_rocksdb_MemoryUtil
- * Method: getApproximateMemoryUsageByType
- * Signature: ([J[J)Ljava/util/Map;
- */
- jobject Java_org_rocksdb_MemoryUtil_getApproximateMemoryUsageByType(
- JNIEnv *env, jclass /*jclazz*/, jlongArray jdb_handles, jlongArray jcache_handles) {
- std::vector<ROCKSDB_NAMESPACE::DB *> dbs;
- jsize db_handle_count = env->GetArrayLength(jdb_handles);
- if(db_handle_count > 0) {
- jlong *ptr_jdb_handles = env->GetLongArrayElements(jdb_handles, nullptr);
- if (ptr_jdb_handles == nullptr) {
- // exception thrown: OutOfMemoryError
- return nullptr;
- }
- for (jsize i = 0; i < db_handle_count; i++) {
- dbs.push_back(
- reinterpret_cast<ROCKSDB_NAMESPACE::DB *>(ptr_jdb_handles[i]));
- }
- env->ReleaseLongArrayElements(jdb_handles, ptr_jdb_handles, JNI_ABORT);
- }
- std::unordered_set<const ROCKSDB_NAMESPACE::Cache *> cache_set;
- jsize cache_handle_count = env->GetArrayLength(jcache_handles);
- if(cache_handle_count > 0) {
- jlong *ptr_jcache_handles = env->GetLongArrayElements(jcache_handles, nullptr);
- if (ptr_jcache_handles == nullptr) {
- // exception thrown: OutOfMemoryError
- return nullptr;
- }
- for (jsize i = 0; i < cache_handle_count; i++) {
- auto *cache_ptr =
- reinterpret_cast<std::shared_ptr<ROCKSDB_NAMESPACE::Cache> *>(
- ptr_jcache_handles[i]);
- cache_set.insert(cache_ptr->get());
- }
- env->ReleaseLongArrayElements(jcache_handles, ptr_jcache_handles, JNI_ABORT);
- }
- std::map<ROCKSDB_NAMESPACE::MemoryUtil::UsageType, uint64_t> usage_by_type;
- if (ROCKSDB_NAMESPACE::MemoryUtil::GetApproximateMemoryUsageByType(
- dbs, cache_set, &usage_by_type) != ROCKSDB_NAMESPACE::Status::OK()) {
- // Non-OK status
- return nullptr;
- }
- jobject jusage_by_type = ROCKSDB_NAMESPACE::HashMapJni::construct(
- env, static_cast<uint32_t>(usage_by_type.size()));
- if (jusage_by_type == nullptr) {
- // exception occurred
- return nullptr;
- }
- const ROCKSDB_NAMESPACE::HashMapJni::FnMapKV<
- const ROCKSDB_NAMESPACE::MemoryUtil::UsageType, const uint64_t, jobject,
- jobject>
- fn_map_kv = [env](
- const std::pair<ROCKSDB_NAMESPACE::MemoryUtil::UsageType,
- uint64_t> &pair) {
- // Construct key
- const jobject jusage_type = ROCKSDB_NAMESPACE::ByteJni::valueOf(
- env, ROCKSDB_NAMESPACE::MemoryUsageTypeJni::toJavaMemoryUsageType(
- pair.first));
- if (jusage_type == nullptr) {
- // an error occurred
- return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
- }
- // Construct value
- const jobject jusage_value =
- ROCKSDB_NAMESPACE::LongJni::valueOf(env, pair.second);
- if (jusage_value == nullptr) {
- // an error occurred
- return std::unique_ptr<std::pair<jobject, jobject>>(nullptr);
- }
- // Construct and return pointer to pair of jobjects
- return std::unique_ptr<std::pair<jobject, jobject>>(
- new std::pair<jobject, jobject>(jusage_type,
- jusage_value));
- };
- if (!ROCKSDB_NAMESPACE::HashMapJni::putAll(env, jusage_by_type,
- usage_by_type.begin(),
- usage_by_type.end(), fn_map_kv)) {
- // exception occcurred
- jusage_by_type = nullptr;
- }
- return jusage_by_type;
- }
|