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