| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | //  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).//// This file implements the callback "bridge" between Java and C++ for// ROCKSDB_NAMESPACE::TraceWriter.#include "rocksjni/trace_writer_jnicallback.h"#include "rocksjni/portal.h"namespace ROCKSDB_NAMESPACE {TraceWriterJniCallback::TraceWriterJniCallback(    JNIEnv* env, jobject jtrace_writer)    : JniCallback(env, jtrace_writer) {  m_jwrite_proxy_methodid =      AbstractTraceWriterJni::getWriteProxyMethodId(env);  if(m_jwrite_proxy_methodid == nullptr) {    // exception thrown: NoSuchMethodException or OutOfMemoryError    return;  }  m_jclose_writer_proxy_methodid =      AbstractTraceWriterJni::getCloseWriterProxyMethodId(env);  if(m_jclose_writer_proxy_methodid == nullptr) {    // exception thrown: NoSuchMethodException or OutOfMemoryError    return;  }  m_jget_file_size_methodid =      AbstractTraceWriterJni::getGetFileSizeMethodId(env);  if(m_jget_file_size_methodid == nullptr) {    // exception thrown: NoSuchMethodException or OutOfMemoryError    return;  }}Status TraceWriterJniCallback::Write(const Slice& data) {  jboolean attached_thread = JNI_FALSE;  JNIEnv* env = getJniEnv(&attached_thread);  if (env == nullptr) {    return Status::IOError("Unable to attach JNI Environment");  }  jshort jstatus = env->CallShortMethod(m_jcallback_obj,      m_jwrite_proxy_methodid,      &data);  if(env->ExceptionCheck()) {    // exception thrown from CallShortMethod    env->ExceptionDescribe();  // print out exception to stderr    releaseJniEnv(attached_thread);    return Status::IOError("Unable to call AbstractTraceWriter#writeProxy(long)");  }  // unpack status code and status sub-code from jstatus  jbyte jcode_value = (jstatus >> 8) & 0xFF;  jbyte jsub_code_value = jstatus & 0xFF;  std::unique_ptr<Status> s = StatusJni::toCppStatus(jcode_value, jsub_code_value);  releaseJniEnv(attached_thread);  return Status(*s);}Status TraceWriterJniCallback::Close() {  jboolean attached_thread = JNI_FALSE;  JNIEnv* env = getJniEnv(&attached_thread);  if (env == nullptr) {    return Status::IOError("Unable to attach JNI Environment");  }  jshort jstatus = env->CallShortMethod(m_jcallback_obj,      m_jclose_writer_proxy_methodid);  if(env->ExceptionCheck()) {    // exception thrown from CallShortMethod    env->ExceptionDescribe();  // print out exception to stderr    releaseJniEnv(attached_thread);    return Status::IOError("Unable to call AbstractTraceWriter#closeWriterProxy()");  }  // unpack status code and status sub-code from jstatus  jbyte code_value = (jstatus >> 8) & 0xFF;  jbyte sub_code_value = jstatus & 0xFF;  std::unique_ptr<Status> s = StatusJni::toCppStatus(code_value, sub_code_value);  releaseJniEnv(attached_thread);  return Status(*s);}uint64_t TraceWriterJniCallback::GetFileSize() {  jboolean attached_thread = JNI_FALSE;  JNIEnv* env = getJniEnv(&attached_thread);  if (env == nullptr) {    return 0;  }  jlong jfile_size = env->CallLongMethod(m_jcallback_obj,      m_jget_file_size_methodid);  if(env->ExceptionCheck()) {    // exception thrown from CallLongMethod    env->ExceptionDescribe();  // print out exception to stderr    releaseJniEnv(attached_thread);    return 0;  }  releaseJniEnv(attached_thread);  return static_cast<uint64_t>(jfile_size);}}  // namespace ROCKSDB_NAMESPACE
 |