| // Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0. |
| |
| use crate::grpc_sys::{self, grpc_resource_quota}; |
| use std::ffi::CString; |
| use std::ptr; |
| |
| /// ResourceQuota represents a bound on memory and thread usage by the gRPC. |
| /// NOTE: The management of threads created in grpc-core don't use ResourceQuota. |
| /// TODO: Manage the poller threads created in grpc-rs with this ResourceQuota later. |
| pub struct ResourceQuota { |
| raw: *mut grpc_resource_quota, |
| } |
| |
| impl ResourceQuota { |
| /// Create a control block for resource quota. If a name is |
| /// not declared for this control block, a name is automatically |
| /// generated in grpc core. |
| pub fn new(name: Option<&str>) -> ResourceQuota { |
| match name { |
| Some(name_str) => { |
| let name_cstr = CString::new(name_str).unwrap(); |
| ResourceQuota { |
| raw: unsafe { grpc_sys::grpc_resource_quota_create(name_cstr.as_ptr() as _) }, |
| } |
| } |
| None => ResourceQuota { |
| raw: unsafe { grpc_sys::grpc_resource_quota_create(ptr::null()) }, |
| }, |
| } |
| } |
| |
| /// Resize this ResourceQuota to a new memory size. |
| pub fn resize_memory(self, new_size: usize) -> ResourceQuota { |
| unsafe { grpc_sys::grpc_resource_quota_resize(self.raw, new_size) }; |
| self |
| } |
| |
| pub(crate) fn get_ptr(&self) -> *mut grpc_resource_quota { |
| self.raw |
| } |
| } |
| |
| impl Clone for ResourceQuota { |
| fn clone(&self) -> Self { |
| unsafe { |
| grpc_sys::grpc_resource_quota_ref(self.raw); |
| } |
| Self { raw: self.raw } |
| } |
| } |
| |
| impl Drop for ResourceQuota { |
| fn drop(&mut self) { |
| unsafe { |
| grpc_sys::grpc_resource_quota_unref(self.raw); |
| } |
| } |
| } |