// 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 "bridge" between Java and C++ for RateLimiter.

#include "rocksjni/portal.h"
#include "include/org_rocksdb_RateLimiter.h"
#include "rocksdb/rate_limiter.h"

/*
 * Class:     org_rocksdb_RateLimiter
 * Method:    newRateLimiterHandle
 * Signature: (JJI)J
 */
jlong Java_org_rocksdb_RateLimiter_newRateLimiterHandle(
    JNIEnv* env, jclass jclazz, jlong jrate_bytes_per_second,
    jlong jrefill_period_micros, jint jfairness) {
  auto * sptr_rate_limiter =
      new std::shared_ptr<rocksdb::RateLimiter>(rocksdb::NewGenericRateLimiter(
          static_cast<int64_t>(jrate_bytes_per_second),
          static_cast<int64_t>(jrefill_period_micros),
          static_cast<int32_t>(jfairness)));

  return reinterpret_cast<jlong>(sptr_rate_limiter);
}

/*
 * Class:     org_rocksdb_RateLimiter
 * Method:    disposeInternal
 * Signature: (J)V
 */
void Java_org_rocksdb_RateLimiter_disposeInternal(
    JNIEnv* env, jobject jobj, jlong jhandle) {
  auto* handle =
      reinterpret_cast<std::shared_ptr<rocksdb::RateLimiter> *>(jhandle);
  delete handle;  // delete std::shared_ptr
}

/*
 * Class:     org_rocksdb_RateLimiter
 * Method:    setBytesPerSecond
 * Signature: (JJ)V
 */
void Java_org_rocksdb_RateLimiter_setBytesPerSecond(
    JNIEnv* env, jobject jobj, jlong handle,
    jlong jbytes_per_second) {
  reinterpret_cast<std::shared_ptr<rocksdb::RateLimiter> *>(handle)->get()->
      SetBytesPerSecond(jbytes_per_second);
}

/*
 * Class:     org_rocksdb_RateLimiter
 * Method:    request
 * Signature: (JJ)V
 */
void Java_org_rocksdb_RateLimiter_request(
    JNIEnv* env, jobject jobj, jlong handle,
    jlong jbytes) {
  reinterpret_cast<std::shared_ptr<rocksdb::RateLimiter> *>(handle)->get()->
      Request(jbytes, rocksdb::Env::IO_TOTAL);
}

/*
 * Class:     org_rocksdb_RateLimiter
 * Method:    getSingleBurstBytes
 * Signature: (J)J
 */
jlong Java_org_rocksdb_RateLimiter_getSingleBurstBytes(
    JNIEnv* env, jobject jobj, jlong handle) {
  return reinterpret_cast<std::shared_ptr<rocksdb::RateLimiter> *>(handle)->
      get()->GetSingleBurstBytes();
}

/*
 * Class:     org_rocksdb_RateLimiter
 * Method:    getTotalBytesThrough
 * Signature: (J)J
 */
jlong Java_org_rocksdb_RateLimiter_getTotalBytesThrough(
    JNIEnv* env, jobject jobj, jlong handle) {
  return reinterpret_cast<std::shared_ptr<rocksdb::RateLimiter> *>(handle)->
      get()->GetTotalBytesThrough();
}

/*
 * Class:     org_rocksdb_RateLimiter
 * Method:    getTotalRequests
 * Signature: (J)J
 */
jlong Java_org_rocksdb_RateLimiter_getTotalRequests(
    JNIEnv* env, jobject jobj, jlong handle) {
  return reinterpret_cast<std::shared_ptr<rocksdb::RateLimiter> *>(handle)->
      get()->GetTotalRequests();
}
