env.cc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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 <jni.h>
  9. #include <vector>
  10. #include "portal.h"
  11. #include "rocksdb/env.h"
  12. #include "include/org_rocksdb_Env.h"
  13. #include "include/org_rocksdb_HdfsEnv.h"
  14. #include "include/org_rocksdb_RocksEnv.h"
  15. #include "include/org_rocksdb_RocksMemEnv.h"
  16. #include "include/org_rocksdb_TimedEnv.h"
  17. /*
  18. * Class: org_rocksdb_Env
  19. * Method: getDefaultEnvInternal
  20. * Signature: ()J
  21. */
  22. jlong Java_org_rocksdb_Env_getDefaultEnvInternal(
  23. JNIEnv*, jclass) {
  24. return reinterpret_cast<jlong>(ROCKSDB_NAMESPACE::Env::Default());
  25. }
  26. /*
  27. * Class: org_rocksdb_RocksEnv
  28. * Method: disposeInternal
  29. * Signature: (J)V
  30. */
  31. void Java_org_rocksdb_RocksEnv_disposeInternal(
  32. JNIEnv*, jobject, jlong jhandle) {
  33. auto* e = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  34. assert(e != nullptr);
  35. delete e;
  36. }
  37. /*
  38. * Class: org_rocksdb_Env
  39. * Method: setBackgroundThreads
  40. * Signature: (JIB)V
  41. */
  42. void Java_org_rocksdb_Env_setBackgroundThreads(
  43. JNIEnv*, jobject, jlong jhandle, jint jnum, jbyte jpriority_value) {
  44. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  45. rocks_env->SetBackgroundThreads(
  46. static_cast<int>(jnum),
  47. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  48. }
  49. /*
  50. * Class: org_rocksdb_Env
  51. * Method: getBackgroundThreads
  52. * Signature: (JB)I
  53. */
  54. jint Java_org_rocksdb_Env_getBackgroundThreads(
  55. JNIEnv*, jobject, jlong jhandle, jbyte jpriority_value) {
  56. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  57. const int num = rocks_env->GetBackgroundThreads(
  58. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  59. return static_cast<jint>(num);
  60. }
  61. /*
  62. * Class: org_rocksdb_Env
  63. * Method: getThreadPoolQueueLen
  64. * Signature: (JB)I
  65. */
  66. jint Java_org_rocksdb_Env_getThreadPoolQueueLen(
  67. JNIEnv*, jobject, jlong jhandle, jbyte jpriority_value) {
  68. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  69. const int queue_len = rocks_env->GetThreadPoolQueueLen(
  70. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  71. return static_cast<jint>(queue_len);
  72. }
  73. /*
  74. * Class: org_rocksdb_Env
  75. * Method: incBackgroundThreadsIfNeeded
  76. * Signature: (JIB)V
  77. */
  78. void Java_org_rocksdb_Env_incBackgroundThreadsIfNeeded(
  79. JNIEnv*, jobject, jlong jhandle, jint jnum, 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(
  91. JNIEnv*, jobject, jlong jhandle, jbyte jpriority_value) {
  92. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  93. rocks_env->LowerThreadPoolIOPriority(
  94. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  95. }
  96. /*
  97. * Class: org_rocksdb_Env
  98. * Method: lowerThreadPoolCPUPriority
  99. * Signature: (JB)V
  100. */
  101. void Java_org_rocksdb_Env_lowerThreadPoolCPUPriority(
  102. JNIEnv*, jobject, jlong jhandle, jbyte jpriority_value) {
  103. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  104. rocks_env->LowerThreadPoolCPUPriority(
  105. ROCKSDB_NAMESPACE::PriorityJni::toCppPriority(jpriority_value));
  106. }
  107. /*
  108. * Class: org_rocksdb_Env
  109. * Method: getThreadList
  110. * Signature: (J)[Lorg/rocksdb/ThreadStatus;
  111. */
  112. jobjectArray Java_org_rocksdb_Env_getThreadList(
  113. JNIEnv* env, jobject, jlong jhandle) {
  114. auto* rocks_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  115. std::vector<ROCKSDB_NAMESPACE::ThreadStatus> thread_status;
  116. ROCKSDB_NAMESPACE::Status s = rocks_env->GetThreadList(&thread_status);
  117. if (!s.ok()) {
  118. // error, throw exception
  119. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  120. return nullptr;
  121. }
  122. // object[]
  123. const jsize len = static_cast<jsize>(thread_status.size());
  124. jobjectArray jthread_status = env->NewObjectArray(
  125. len, ROCKSDB_NAMESPACE::ThreadStatusJni::getJClass(env), nullptr);
  126. if (jthread_status == nullptr) {
  127. // an exception occurred
  128. return nullptr;
  129. }
  130. for (jsize i = 0; i < len; ++i) {
  131. jobject jts =
  132. ROCKSDB_NAMESPACE::ThreadStatusJni::construct(env, &(thread_status[i]));
  133. env->SetObjectArrayElement(jthread_status, i, jts);
  134. if (env->ExceptionCheck()) {
  135. // exception occurred
  136. env->DeleteLocalRef(jthread_status);
  137. return nullptr;
  138. }
  139. }
  140. return jthread_status;
  141. }
  142. /*
  143. * Class: org_rocksdb_RocksMemEnv
  144. * Method: createMemEnv
  145. * Signature: (J)J
  146. */
  147. jlong Java_org_rocksdb_RocksMemEnv_createMemEnv(
  148. JNIEnv*, jclass, jlong jbase_env_handle) {
  149. auto* base_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jbase_env_handle);
  150. return reinterpret_cast<jlong>(ROCKSDB_NAMESPACE::NewMemEnv(base_env));
  151. }
  152. /*
  153. * Class: org_rocksdb_RocksMemEnv
  154. * Method: disposeInternal
  155. * Signature: (J)V
  156. */
  157. void Java_org_rocksdb_RocksMemEnv_disposeInternal(
  158. JNIEnv*, jobject, jlong jhandle) {
  159. auto* e = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  160. assert(e != nullptr);
  161. delete e;
  162. }
  163. /*
  164. * Class: org_rocksdb_HdfsEnv
  165. * Method: createHdfsEnv
  166. * Signature: (Ljava/lang/String;)J
  167. */
  168. jlong Java_org_rocksdb_HdfsEnv_createHdfsEnv(
  169. JNIEnv* env, jclass, jstring jfsname) {
  170. jboolean has_exception = JNI_FALSE;
  171. auto fsname =
  172. ROCKSDB_NAMESPACE::JniUtil::copyStdString(env, jfsname, &has_exception);
  173. if (has_exception == JNI_TRUE) {
  174. // exception occurred
  175. return 0;
  176. }
  177. ROCKSDB_NAMESPACE::Env* hdfs_env;
  178. ROCKSDB_NAMESPACE::Status s =
  179. ROCKSDB_NAMESPACE::NewHdfsEnv(&hdfs_env, fsname);
  180. if (!s.ok()) {
  181. // error occurred
  182. ROCKSDB_NAMESPACE::RocksDBExceptionJni::ThrowNew(env, s);
  183. return 0;
  184. }
  185. return reinterpret_cast<jlong>(hdfs_env);
  186. }
  187. /*
  188. * Class: org_rocksdb_HdfsEnv
  189. * Method: disposeInternal
  190. * Signature: (J)V
  191. */
  192. void Java_org_rocksdb_HdfsEnv_disposeInternal(
  193. JNIEnv*, jobject, jlong jhandle) {
  194. auto* e = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  195. assert(e != nullptr);
  196. delete e;
  197. }
  198. /*
  199. * Class: org_rocksdb_TimedEnv
  200. * Method: createTimedEnv
  201. * Signature: (J)J
  202. */
  203. jlong Java_org_rocksdb_TimedEnv_createTimedEnv(
  204. JNIEnv*, jclass, jlong jbase_env_handle) {
  205. auto* base_env = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jbase_env_handle);
  206. return reinterpret_cast<jlong>(ROCKSDB_NAMESPACE::NewTimedEnv(base_env));
  207. }
  208. /*
  209. * Class: org_rocksdb_TimedEnv
  210. * Method: disposeInternal
  211. * Signature: (J)V
  212. */
  213. void Java_org_rocksdb_TimedEnv_disposeInternal(
  214. JNIEnv*, jobject, jlong jhandle) {
  215. auto* e = reinterpret_cast<ROCKSDB_NAMESPACE::Env*>(jhandle);
  216. assert(e != nullptr);
  217. delete e;
  218. }