|
SWC-DB
v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
|
Go to the documentation of this file.
7 #ifndef swcdb_common_sys_Resources_Mem_h
8 #define swcdb_common_sys_Resources_Mem_h
11 #if defined(__MINGW64__) || defined(_WIN32)
12 #include <sysinfoapi.h>
14 #include <sys/sysinfo.h>
19 #if defined TCMALLOC_MINIMAL || defined TCMALLOC
20 #include <gperftools/malloc_extension.h>
22 #elif defined MIMALLOC
25 #elif defined JEMALLOC
26 #include <jemalloc/jemalloc.h>
35 namespace SWC {
namespace System {
78 #if !defined(__MINGW64__) && !defined(_WIN32)
82 #if defined TCMALLOC_MINIMAL || defined TCMALLOC
83 release_rate_default = MallocExtension::instance()->GetMemoryReleaseRate();
84 if(release_rate_default < 0)
85 release_rate_default = 0;
99 uint64_t
check(uint64_t ts) noexcept {
162 return _releasable > need ? need : _releasable;
172 return _allowed > 0 ? _allowed : 0;
234 void print(std::ostream& out,
size_t base = 1048576)
const {
235 out <<
"Res(total=" << (
total/base)
236 <<
" free=" << (
free/base)
238 <<
" allowed=" << (
allowed/base)
239 <<
" reserved=" << (
reserved/base) <<
')';
244 SWC_SHOULD_NOT_INLINE
249 #if defined(__MINGW64__) || defined(_WIN32)
250 MEMORYSTATUSEX statex;
251 statex.dwLength =
sizeof (statex);
252 if(!GlobalMemoryStatusEx (&statex) || !statex.ullTotalPhys || !statex.ullAvailPhys)
258 std::ifstream buffer(
"/proc/meminfo");
259 if(!buffer.is_open())
268 if(tmp.length() == 9 &&
272 if(tmp.length() == 13 &&
279 sz * (tmp.front() ==
'k'
281 : (tmp.front() ==
'm' ? 1048576 : 0))
286 }
while (looking && !buffer.eof());
302 SWC_SHOULD_NOT_INLINE
305 #if defined(__MINGW64__) || defined(_WIN32)
306 MEMORYSTATUSEX statex;
307 statex.dwLength =
sizeof (statex);
308 if(!GlobalMemoryStatusEx (&statex) || !statex.ullTotalPhys || !statex.ullAvailPhys)
310 rss = statex.ullTotalPhys - statex.ullAvailPhys;
313 std::ifstream buffer(
"/proc/self/statm");
314 if(!buffer.is_open())
328 SWC_SHOULD_NOT_INLINE
331 #if defined TCMALLOC_MINIMAL || defined TCMALLOC
333 if(!MallocExtension::instance()->GetNumericProperty(
334 "generic.current_allocated_bytes", &bytes))
355 #elif defined JEMALLOC
356 if(mallctl(
"epoch", NULL, NULL, &ts,
sizeof(ts)))
359 size_t sz =
sizeof(size_t);
360 if(mallctl(
"stats.active", &_bytes, &sz, NULL, 0))
363 if(mallctl(
"stats.metadata", &_bytes, &sz, NULL, 0))
367 #elif defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 33
372 #elif defined(__MINGW64__) || defined(_WIN32)
373 MEMORYSTATUSEX statex;
374 statex.dwLength =
sizeof (statex);
375 if(!GlobalMemoryStatusEx (&statex) || !statex.ullTotalPhys || !statex.ullAvailPhys)
377 bytes = statex.ullTotalPhys - statex.ullAvailPhys;
379 #elif defined(SWC_ENABLE_SANITIZER)
385 sizeof(mi.uordblks) ==
sizeof(
size_t),
386 "Unsupported mallinfo size-type"
397 SWC_SHOULD_NOT_INLINE
411 #if defined TCMALLOC_MINIMAL || defined TCMALLOC
413 auto inst = MallocExtension::instance();
415 inst->ReleaseFreeMemory();
416 inst->SetMemoryReleaseRate(release_rate_default);
419 #elif defined MIMALLOC
424 #elif defined JEMALLOC
427 #elif defined(__MINGW64__) || defined(_WIN32)
440 ::malloc_trim(keep > 0 ? keep : 0);
448 #if !defined(__MINGW64__) && !defined(_WIN32)
457 #if defined TCMALLOC_MINIMAL || defined TCMALLOC
458 double release_rate_default = {};
466 #endif // swcdb_common_sys_Resources_Mem_h
Config::Property::Value_int32_g::Ptr cfg_percent_reserved
SWC_CAN_INLINE size_t avail_ram() const noexcept
std::function< size_t(size_t)> ReleaseCall_t
static const uint32_t FAIL_MS
Core::Atomic< size_t > used
virtual void rss_used(size_t) noexcept=0
#define SWC_LOG_OUT(pr, _code_)
virtual void rss_used_reg(size_t) noexcept=0
Core::Atomic< size_t > free
SWC_CAN_INLINE uint32_t available_mem_mb() const noexcept
SWC_SHOULD_NOT_INLINE bool _check_statm()
Mem & operator=(Mem &&)=delete
Core::Atomic< size_t > allowed
SWC_CAN_INLINE void more_mem_releasable(size_t sz) noexcept
SWC_SHOULD_NOT_INLINE void _release()
SWC_CAN_INLINE int32_t get() const noexcept
Mem & operator=(const Mem &)=delete
SWC_SHOULD_NOT_INLINE Mem(Config::Property::Value_int32_g::Ptr ram_percent_allowed, Config::Property::Value_int32_g::Ptr ram_percent_reserved, Config::Property::Value_int32_g::Ptr ram_release_rate, Notifier *a_notifier, ReleaseCall_t &&a_release_call=nullptr) noexcept
Core::Atomic< size_t > used_reg
static const uint32_t BASE_MS
bool str_eq(const char *s1, const char *s2) noexcept SWC_ATTRIBS((SWC_ATTRIB_O3))
static const uint32_t RELEASE_URGENT_MS
constexpr SWC_CAN_INLINE void store(T v) noexcept
Core::Atomic< size_t > total
uint64_t chk_low_state_ts
The SWC-DB C++ namespace 'SWC'.
Config::Property::Value_int32_g::Ptr cfg_release_rate
SWC_SHOULD_NOT_INLINE bool _check_malloc(uint64_t ts)
SWC_CAN_INLINE void less_mem_future(size_t sz) noexcept
SWC_CAN_INLINE bool need_ram(uint32_t sz) const noexcept
SWC_CAN_INLINE void more_mem_future(size_t sz) noexcept
Core::Atomic< size_t > used_future
SWC_CAN_INLINE size_t need_ram() const noexcept
void print(std::ostream &out, size_t base=1048576) const
const ReleaseCall_t release_call
static const uint32_t RELEASE_NORMAL_MS
Config::Property::Value_int32_g::Ptr cfg_percent_allowed
SWC_SHOULD_NOT_INLINE bool _check_stat()
SWC_SHOULD_NOT_INLINE uint64_t check(uint64_t ts) noexcept
Core::Atomic< size_t > mem_buff_ms
SWC_CAN_INLINE void adj_mem_releasable(ssize_t sz) noexcept
SWC_CAN_INLINE void less_mem_releasable(size_t sz) noexcept
SWC_CAN_INLINE bool is_low_mem_state() const noexcept
virtual void rss_free(size_t) noexcept=0
constexpr SWC_CAN_INLINE T fetch_sub(T v) noexcept
Core::Atomic< size_t > used_releasable
static const uint32_t MAX_MS
constexpr SWC_CAN_INLINE T fetch_add(T v) noexcept
Core::Atomic< size_t > reserved
#define SWC_LOG_CURRENT_EXCEPTION(_s_)
static const uint32_t URGENT_MS