env.cc 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. //
  6. // This file implements the "bridge" between Java and C++ and enables
  7. // calling c++ ROCKSDB_NAMESPACE::Env methods from Java side.
  8. #include "rocksdb/env.h"
  9. #include <jni.h>
  10. #include <vector>
  11. #include "include/org_rocksdb_Env.h"
  12. #include "include/org_rocksdb_RocksEnv.h"
  13. #include "include/org_rocksdb_RocksMemEnv.h"
  14. #include "include/org_rocksdb_TimedEnv.h"
  15. #include "portal.h"
  16. #include "rocksjni/cplusplus_to_java_convert.h"
  17. /*
  18. * Class: org_rocksdb_Env
  19. * Method: getDefaultEnvInternal
  20. * Signature: ()J
  21. */
  22. jlong Java_org_rocksdb_Env_getDefaultEnvInternal(JNIEnv*, jclass) {
  23. return GET_CPLUSPLUS_POINTER(ROCKSDB_NAMESPACE::Env::Default());
  24. }
  25. /*
  26. * Class: org_rocksdb_RocksEnv
  27. * Method: disposeInternal
  28. * Signature: (J)V
  29. */
  30. void Java_org_rocksdb_RocksEnv_disposeInternal(JNIEnv*, jclass, jlong jhandle) {
  31. auto* e = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  32. assert(e != nullptr);
  33. delete e;
  34. }
  35. /*
  36. * Class: org_rocksdb_Env
  37. * Method: setBackgroundThreads
  38. * Signature: (JIB)V
  39. */
  40. void Java_org_rocksdb_Env_setBackgroundThreads(JNIEnv*, jclass, jlong jhandle,
  41. jint jnum,
  42. jbyte jpriority_value) {
  43. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  44. rocks_env->SetBackgroundThreads(
  45. static_cast<int>(jnum),
  46. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  47. }
  48. /*
  49. * Class: org_rocksdb_Env
  50. * Method: getBackgroundThreads
  51. * Signature: (JB)I
  52. */
  53. jint Java_org_rocksdb_Env_getBackgroundThreads(JNIEnv*, jclass, jlong jhandle,
  54. jbyte jpriority_value) {
  55. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  56. const int num = rocks_env->GetBackgroundThreads(
  57. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  58. return static_cast<jint>(num);
  59. }
  60. /*
  61. * Class: org_rocksdb_Env
  62. * Method: getThreadPoolQueueLen
  63. * Signature: (JB)I
  64. */
  65. jint Java_org_rocksdb_Env_getThreadPoolQueueLen(JNIEnv*, jclass, jlong jhandle,
  66. jbyte jpriority_value) {
  67. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  68. const int queue_len = rocks_env->GetThreadPoolQueueLen(
  69. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  70. return static_cast<jint>(queue_len);
  71. }
  72. /*
  73. * Class: org_rocksdb_Env
  74. * Method: incBackgroundThreadsIfNeeded
  75. * Signature: (JIB)V
  76. */
  77. void Java_org_rocksdb_Env_incBackgroundThreadsIfNeeded(JNIEnv*, jclass,
  78. jlong jhandle, jint jnum,
  79. jbyte jpriority_value) {
  80. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  81. rocks_env->IncBackgroundThreadsIfNeeded(
  82. static_cast<int>(jnum),
  83. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  84. }
  85. /*
  86. * Class: org_rocksdb_Env
  87. * Method: lowerThreadPoolIOPriority
  88. * Signature: (JB)V
  89. */
  90. void Java_org_rocksdb_Env_lowerThreadPoolIOPriority(JNIEnv*, jclass,
  91. jlong jhandle,
  92. jbyte jpriority_value) {
  93. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  94. rocks_env->LowerThreadPoolIOPriority(
  95. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  96. }
  97. /*
  98. * Class: org_rocksdb_Env
  99. * Method: lowerThreadPoolCPUPriority
  100. * Signature: (JB)V
  101. */
  102. void Java_org_rocksdb_Env_lowerThreadPoolCPUPriority(JNIEnv*, jclass,
  103. jlong jhandle,
  104. jbyte jpriority_value) {
  105. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  106. rocks_env->LowerThreadPoolCPUPriority(
  107. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  108. }
  109. /*
  110. * Class: org_rocksdb_Env
  111. * Method: getThreadList
  112. * Signature: (J)[Lorg/rocksdb/ThreadStatus;
  113. */
  114. jobjectArray Java_org_rocksdb_Env_getThreadList(JNIEnv* env, jclass,
  115. jlong jhandle) {
  116. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  117. std::vector<ROCKSDB_NAMESPACE::ThreadStatus> thread_status;
  118. ROCKSDB_NAMESPACE::Status s = rocks_env->GetThreadList(&thread_status);
  119. if (!s.ok()) {
  120. // error, throw exception
  121. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  122. return nullptr;
  123. }
  124. // object[]
  125. const jsize len = static_cast<jsize>(thread_status.size());
  126. jobjectArray jthread_status = env->NewObjectArray(
  127. len, ROCKSDB_NAMESPACE::ThreadStatusJni::getJClass(env), nullptr);
  128. if (jthread_status == nullptr) {
  129. // an exception occurred
  130. return nullptr;
  131. }
  132. for (jsize i = 0; i < len; ++i) {
  133. jobject jts =
  134. ROCKSDB_NAMESPACE::ThreadStatusJni::construct(env, &(thread_status[i]));
  135. env->SetObjectArrayElement(jthread_status, i, jts);
  136. if (env->ExceptionCheck()) {
  137. // exception occurred
  138. env->DeleteLocalRef(jthread_status);
  139. return nullptr;
  140. }
  141. }
  142. return jthread_status;
  143. }
  144. /*
  145. * Class: org_rocksdb_RocksMemEnv
  146. * Method: createMemEnv
  147. * Signature: (J)J
  148. */
  149. jlong Java_org_rocksdb_RocksMemEnv_createMemEnv(JNIEnv*, jclass,
  150. jlong jbase_env_handle) {
  151. auto* base_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jbase_env_handle);
  152. return GET_CPLUSPLUS_POINTER(ROCKSDB_NAMESPACE::NewMemEnv(base_env));
  153. }
  154. /*
  155. * Class: org_rocksdb_RocksMemEnv
  156. * Method: disposeInternal
  157. * Signature: (J)V
  158. */
  159. void Java_org_rocksdb_RocksMemEnv_disposeInternalJni(JNIEnv*, jclass,
  160. jlong jhandle) {
  161. auto* e = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  162. assert(e != nullptr);
  163. delete e;
  164. }
  165. /*
  166. * Class: org_rocksdb_TimedEnv
  167. * Method: createTimedEnv
  168. * Signature: (J)J
  169. */
  170. jlong Java_org_rocksdb_TimedEnv_createTimedEnv(JNIEnv*, jclass,
  171. jlong jbase_env_handle) {
  172. auto* base_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jbase_env_handle);
  173. return GET_CPLUSPLUS_POINTER(ROCKSDB_NAMESPACE::NewTimedEnv(base_env));
  174. }
  175. /*
  176. * Class: org_rocksdb_TimedEnv
  177. * Method: disposeInternal
  178. * Signature: (J)V
  179. */
  180. void Java_org_rocksdb_TimedEnv_disposeInternalJni(JNIEnv*, jclass,
  181. jlong jhandle) {
  182. auto* e = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  183. assert(e != nullptr);
  184. delete e;
  185. }