|
Packit |
807167 |
/*************************************************************************************************
|
|
Packit |
807167 |
* Utility functions
|
|
Packit |
807167 |
* Copyright (C) 2009-2012 FAL Labs
|
|
Packit |
807167 |
* This file is part of Kyoto Cabinet.
|
|
Packit |
807167 |
* This program is free software: you can redistribute it and/or modify it under the terms of
|
|
Packit |
807167 |
* the GNU General Public License as published by the Free Software Foundation, either version
|
|
Packit |
807167 |
* 3 of the License, or any later version.
|
|
Packit |
807167 |
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
Packit |
807167 |
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
807167 |
* See the GNU General Public License for more details.
|
|
Packit |
807167 |
* You should have received a copy of the GNU General Public License along with this program.
|
|
Packit |
807167 |
* If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
807167 |
*************************************************************************************************/
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
#include "kcutil.h"
|
|
Packit |
807167 |
#include "myconf.h"
|
|
Packit |
807167 |
|
|
Packit |
807167 |
namespace kyotocabinet { // common namespace
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The package version. */
|
|
Packit |
807167 |
const char* const VERSION = _KC_VERSION;
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The library version. */
|
|
Packit |
807167 |
const int32_t LIBVER = _KC_LIBVER;
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The library revision. */
|
|
Packit |
807167 |
const int32_t LIBREV = _KC_LIBREV;
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The database format version. */
|
|
Packit |
807167 |
const int32_t FMTVER = _KC_FMTVER;
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The system name. */
|
|
Packit |
807167 |
const char* const OSNAME = _KC_OSNAME;
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The flag for big endian environments. */
|
|
Packit |
807167 |
const bool BIGEND = _KC_BIGEND ? true : false;
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The clock tick of interruption. */
|
|
Packit |
807167 |
#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
|
|
Packit |
807167 |
const int32_t CLOCKTICK = 100;
|
|
Packit |
807167 |
#else
|
|
Packit |
807167 |
const int32_t CLOCKTICK = sysconf(_SC_CLK_TCK);
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The size of a page. */
|
|
Packit |
807167 |
#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
|
|
Packit |
807167 |
static int32_t win_getpagesize() {
|
|
Packit |
807167 |
::SYSTEM_INFO ibuf;
|
|
Packit |
807167 |
::GetSystemInfo(&ibuf);
|
|
Packit |
807167 |
return ibuf.dwPageSize;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
const int32_t PAGESIZ = win_getpagesize();
|
|
Packit |
807167 |
#else
|
|
Packit |
807167 |
const int32_t PAGESIZ = sysconf(_SC_PAGESIZE);
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/** The extra feature list. */
|
|
Packit |
807167 |
const char* const FEATURES = ""
|
|
Packit |
807167 |
#if _KC_GCCATOMIC
|
|
Packit |
807167 |
"(atomic)"
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
#if _KC_ZLIB
|
|
Packit |
807167 |
"(zlib)"
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
#if _KC_LZO
|
|
Packit |
807167 |
"(lzo)"
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
#if _KC_LZMA
|
|
Packit |
807167 |
"(lzma)"
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
;
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// get the levenshtein distance of two arrays
|
|
Packit |
807167 |
template<class CHARTYPE, class CNTTYPE>
|
|
Packit |
807167 |
static size_t levdist(const CHARTYPE* abuf, size_t asiz, const CHARTYPE* bbuf, size_t bsiz) {
|
|
Packit |
807167 |
size_t dsiz = bsiz + 1;
|
|
Packit |
807167 |
size_t tsiz = (asiz + 1) * dsiz;
|
|
Packit |
807167 |
CNTTYPE tblstack[2048/sizeof(CNTTYPE)];
|
|
Packit |
807167 |
CNTTYPE* tbl = tsiz > sizeof(tblstack) / sizeof(*tblstack) ? new CNTTYPE[tsiz] : tblstack;
|
|
Packit |
807167 |
tbl[0] = 0;
|
|
Packit |
807167 |
for (size_t i = 1; i <= asiz; i++) {
|
|
Packit |
807167 |
tbl[i*dsiz] = i;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
for (size_t i = 1; i <= bsiz; i++) {
|
|
Packit |
807167 |
tbl[i] = i;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
abuf--;
|
|
Packit |
807167 |
bbuf--;
|
|
Packit |
807167 |
for (size_t i = 1; i <= asiz; i++) {
|
|
Packit |
807167 |
for (size_t j = 1; j <= bsiz; j++) {
|
|
Packit |
807167 |
uint32_t ac = tbl[(i-1)*dsiz+j] + 1;
|
|
Packit |
807167 |
uint32_t bc = tbl[i*dsiz+j-1] + 1;
|
|
Packit |
807167 |
uint32_t cc = tbl[(i-1)*dsiz+j-1] + (abuf[i] != bbuf[j]);
|
|
Packit |
807167 |
ac = ac < bc ? ac : bc;
|
|
Packit |
807167 |
tbl[i*dsiz+j] = ac < cc ? ac : cc;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
size_t ed = tbl[asiz*dsiz+bsiz];
|
|
Packit |
807167 |
if (tbl != tblstack) delete[] tbl;
|
|
Packit |
807167 |
return ed;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Calculate the levenshtein distance of two regions in bytes.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
size_t memdist(const void* abuf, size_t asiz, const void* bbuf, size_t bsiz) {
|
|
Packit |
807167 |
_assert_(abuf && asiz <= MEMMAXSIZ && bbuf && bsiz <= MEMMAXSIZ);
|
|
Packit |
807167 |
return asiz > UINT8MAX || bsiz > UINT8MAX ?
|
|
Packit |
807167 |
levdist<const char, uint32_t>((const char*)abuf, asiz, (const char*)bbuf, bsiz) :
|
|
Packit |
807167 |
levdist<const char, uint8_t>((const char*)abuf, asiz, (const char*)bbuf, bsiz);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Calculate the levenshtein distance of two UTF-8 strings.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
size_t strutfdist(const char* astr, const char* bstr) {
|
|
Packit |
807167 |
_assert_(astr && bstr);
|
|
Packit |
807167 |
size_t anum = strutflen(astr);
|
|
Packit |
807167 |
uint32_t astack[128];
|
|
Packit |
807167 |
uint32_t* aary = anum > sizeof(astack) / sizeof(*astack) ? new uint32_t[anum] : astack;
|
|
Packit |
807167 |
strutftoucs(astr, aary, &anum);
|
|
Packit |
807167 |
size_t bnum = strutflen(bstr);
|
|
Packit |
807167 |
uint32_t bstack[128];
|
|
Packit |
807167 |
uint32_t* bary = bnum > sizeof(bstack) / sizeof(*bstack) ? new uint32_t[bnum] : bstack;
|
|
Packit |
807167 |
strutftoucs(bstr, bary, &bnum);
|
|
Packit |
807167 |
size_t dist = strucsdist(aary, anum, bary, bnum);
|
|
Packit |
807167 |
if (bary != bstack) delete[] bary;
|
|
Packit |
807167 |
if (aary != astack) delete[] aary;
|
|
Packit |
807167 |
return dist;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Calculate the levenshtein distance of two UCS-4 arrays.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
size_t strucsdist(const uint32_t* aary, size_t anum, const uint32_t* bary, size_t bnum) {
|
|
Packit |
807167 |
_assert_(aary && anum <= MEMMAXSIZ && bary && bnum <= MEMMAXSIZ);
|
|
Packit |
807167 |
return anum > UINT8MAX || bnum > UINT8MAX ?
|
|
Packit |
807167 |
levdist<const uint32_t, uint32_t>(aary, anum, bary, bnum) :
|
|
Packit |
807167 |
levdist<const uint32_t, uint8_t>(aary, anum, bary, bnum);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Allocate a nullified region on memory.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
void* mapalloc(size_t size) {
|
|
Packit |
807167 |
#if defined(_SYS_LINUX_)
|
|
Packit |
807167 |
_assert_(size > 0 && size <= MEMMAXSIZ);
|
|
Packit |
807167 |
void* ptr = ::mmap(0, sizeof(size) + size,
|
|
Packit |
807167 |
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
|
Packit |
807167 |
if (ptr == MAP_FAILED) throw std::bad_alloc();
|
|
Packit |
807167 |
*(size_t*)ptr = size;
|
|
Packit |
807167 |
return (char*)ptr + sizeof(size);
|
|
Packit |
807167 |
#else
|
|
Packit |
807167 |
_assert_(size > 0 && size <= MEMMAXSIZ);
|
|
Packit |
807167 |
void* ptr = std::calloc(size, 1);
|
|
Packit |
807167 |
if (!ptr) throw std::bad_alloc();
|
|
Packit |
807167 |
return ptr;
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Free a region on memory.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
void mapfree(void* ptr) {
|
|
Packit |
807167 |
#if defined(_SYS_LINUX_)
|
|
Packit |
807167 |
_assert_(ptr);
|
|
Packit |
807167 |
size_t size = *((size_t*)ptr - 1);
|
|
Packit |
807167 |
::munmap((char*)ptr - sizeof(size), sizeof(size) + size);
|
|
Packit |
807167 |
#else
|
|
Packit |
807167 |
_assert_(ptr);
|
|
Packit |
807167 |
std::free(ptr);
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Get the time of day in seconds.
|
|
Packit |
807167 |
* @return the time of day in seconds. The accuracy is in microseconds.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
double time() {
|
|
Packit |
807167 |
#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
|
|
Packit |
807167 |
_assert_(true);
|
|
Packit |
807167 |
::FILETIME ft;
|
|
Packit |
807167 |
::GetSystemTimeAsFileTime(&ft;;
|
|
Packit |
807167 |
::LARGE_INTEGER li;
|
|
Packit |
807167 |
li.LowPart = ft.dwLowDateTime;
|
|
Packit |
807167 |
li.HighPart = ft.dwHighDateTime;
|
|
Packit |
807167 |
return li.QuadPart / 10000000.0;
|
|
Packit |
807167 |
#else
|
|
Packit |
807167 |
_assert_(true);
|
|
Packit |
807167 |
struct ::timeval tv;
|
|
Packit |
807167 |
if (::gettimeofday(&tv, NULL) != 0) return 0.0;
|
|
Packit |
807167 |
return tv.tv_sec + tv.tv_usec / 1000000.0;
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Get the process ID.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
int64_t getpid() {
|
|
Packit |
807167 |
#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
|
|
Packit |
807167 |
_assert_(true);
|
|
Packit |
807167 |
return ::GetCurrentProcessId();
|
|
Packit |
807167 |
#else
|
|
Packit |
807167 |
_assert_(true);
|
|
Packit |
807167 |
return ::getpid();
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Get the value of an environment variable.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
const char* getenv(const char* name) {
|
|
Packit |
807167 |
_assert_(name);
|
|
Packit |
807167 |
return ::getenv(name);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Get system information of the environment.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
void getsysinfo(std::map<std::string, std::string>* strmap) {
|
|
Packit |
807167 |
#if defined(_SYS_LINUX_)
|
|
Packit |
807167 |
_assert_(strmap);
|
|
Packit |
807167 |
struct ::rusage rbuf;
|
|
Packit |
807167 |
std::memset(&rbuf, 0, sizeof(rbuf));
|
|
Packit |
807167 |
if (::getrusage(RUSAGE_SELF, &rbuf) == 0) {
|
|
Packit |
807167 |
(*strmap)["ru_utime"] = strprintf("%0.6f",
|
|
Packit |
807167 |
rbuf.ru_utime.tv_sec + rbuf.ru_utime.tv_usec / 1000000.0);
|
|
Packit |
807167 |
(*strmap)["ru_stime"] = strprintf("%0.6f",
|
|
Packit |
807167 |
rbuf.ru_stime.tv_sec + rbuf.ru_stime.tv_usec / 1000000.0);
|
|
Packit |
807167 |
if (rbuf.ru_maxrss > 0) {
|
|
Packit |
807167 |
int64_t size = rbuf.ru_maxrss * 1024LL;
|
|
Packit |
807167 |
(*strmap)["mem_peak"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
(*strmap)["mem_size"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
(*strmap)["mem_rss"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
std::ifstream ifs;
|
|
Packit |
807167 |
ifs.open("/proc/self/status", std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (ifs) {
|
|
Packit |
807167 |
std::string line;
|
|
Packit |
807167 |
while (getline(ifs, line)) {
|
|
Packit |
807167 |
size_t idx = line.find(':');
|
|
Packit |
807167 |
if (idx != std::string::npos) {
|
|
Packit |
807167 |
const std::string& name = line.substr(0, idx);
|
|
Packit |
807167 |
idx++;
|
|
Packit |
807167 |
while (idx < line.size() && line[idx] >= '\0' && line[idx] <= ' ') {
|
|
Packit |
807167 |
idx++;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
const std::string& value = line.substr(idx);
|
|
Packit |
807167 |
if (name == "VmPeak") {
|
|
Packit |
807167 |
int64_t size = atoix(value.c_str());
|
|
Packit |
807167 |
if (size > 0) (*strmap)["mem_peak"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
} else if (name == "VmSize") {
|
|
Packit |
807167 |
int64_t size = atoix(value.c_str());
|
|
Packit |
807167 |
if (size > 0) (*strmap)["mem_size"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
} else if (name == "VmRSS") {
|
|
Packit |
807167 |
int64_t size = atoix(value.c_str());
|
|
Packit |
807167 |
if (size > 0) (*strmap)["mem_rss"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
ifs.close();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
ifs.open("/proc/meminfo", std::ios_base::in | std::ios_base::binary);
|
|
Packit |
807167 |
if (ifs) {
|
|
Packit |
807167 |
std::string line;
|
|
Packit |
807167 |
while (getline(ifs, line)) {
|
|
Packit |
807167 |
size_t idx = line.find(':');
|
|
Packit |
807167 |
if (idx != std::string::npos) {
|
|
Packit |
807167 |
const std::string& name = line.substr(0, idx);
|
|
Packit |
807167 |
idx++;
|
|
Packit |
807167 |
while (idx < line.size() && line[idx] >= '\0' && line[idx] <= ' ') {
|
|
Packit |
807167 |
idx++;
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
const std::string& value = line.substr(idx);
|
|
Packit |
807167 |
if (name == "MemTotal") {
|
|
Packit |
807167 |
int64_t size = atoix(value.c_str());
|
|
Packit |
807167 |
if (size > 0) (*strmap)["mem_total"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
} else if (name == "MemFree") {
|
|
Packit |
807167 |
int64_t size = atoix(value.c_str());
|
|
Packit |
807167 |
if (size > 0) (*strmap)["mem_free"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
} else if (name == "Cached") {
|
|
Packit |
807167 |
int64_t size = atoix(value.c_str());
|
|
Packit |
807167 |
if (size > 0) (*strmap)["mem_cached"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
ifs.close();
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
#elif defined(_SYS_MACOSX_)
|
|
Packit |
807167 |
_assert_(strmap);
|
|
Packit |
807167 |
struct ::rusage rbuf;
|
|
Packit |
807167 |
std::memset(&rbuf, 0, sizeof(rbuf));
|
|
Packit |
807167 |
if (::getrusage(RUSAGE_SELF, &rbuf) == 0) {
|
|
Packit |
807167 |
(*strmap)["ru_utime"] = strprintf("%0.6f",
|
|
Packit |
807167 |
rbuf.ru_utime.tv_sec + rbuf.ru_utime.tv_usec / 1000000.0);
|
|
Packit |
807167 |
(*strmap)["ru_stime"] = strprintf("%0.6f",
|
|
Packit |
807167 |
rbuf.ru_stime.tv_sec + rbuf.ru_stime.tv_usec / 1000000.0);
|
|
Packit |
807167 |
if (rbuf.ru_maxrss > 0) {
|
|
Packit |
807167 |
int64_t size = rbuf.ru_maxrss;
|
|
Packit |
807167 |
(*strmap)["mem_peak"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
(*strmap)["mem_size"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
(*strmap)["mem_rss"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
#elif defined(_SYS_FREEBSD_) || defined(_SYS_SUNOS_)
|
|
Packit |
807167 |
_assert_(strmap);
|
|
Packit |
807167 |
struct ::rusage rbuf;
|
|
Packit |
807167 |
std::memset(&rbuf, 0, sizeof(rbuf));
|
|
Packit |
807167 |
if (::getrusage(RUSAGE_SELF, &rbuf) == 0) {
|
|
Packit |
807167 |
(*strmap)["ru_utime"] = strprintf("%0.6f",
|
|
Packit |
807167 |
rbuf.ru_utime.tv_sec + rbuf.ru_utime.tv_usec / 1000000.0);
|
|
Packit |
807167 |
(*strmap)["ru_stime"] = strprintf("%0.6f",
|
|
Packit |
807167 |
rbuf.ru_stime.tv_sec + rbuf.ru_stime.tv_usec / 1000000.0);
|
|
Packit |
807167 |
if (rbuf.ru_maxrss > 0) {
|
|
Packit |
807167 |
int64_t size = rbuf.ru_maxrss * 1024LL;
|
|
Packit |
807167 |
(*strmap)["mem_peak"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
(*strmap)["mem_size"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
(*strmap)["mem_rss"] = strprintf("%lld", (long long)size);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
#elif defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
|
|
Packit |
807167 |
_assert_(strmap);
|
|
Packit |
807167 |
::DWORD pid = ::GetCurrentProcessId();
|
|
Packit |
807167 |
::HANDLE ph = ::OpenProcess(PROCESS_QUERY_INFORMATION, false, pid);
|
|
Packit |
807167 |
if (ph) {
|
|
Packit |
807167 |
::FILETIME ct, et, kt, ut;
|
|
Packit |
807167 |
if (::GetProcessTimes(ph, &ct, &et, &kt, &ut)) {
|
|
Packit |
807167 |
::LARGE_INTEGER li;
|
|
Packit |
807167 |
li.LowPart = ut.dwLowDateTime;
|
|
Packit |
807167 |
li.HighPart = ut.dwHighDateTime;
|
|
Packit |
807167 |
(*strmap)["ru_utime"] = strprintf("%0.6f", li.QuadPart / 10000000.0);
|
|
Packit |
807167 |
li.LowPart = kt.dwLowDateTime;
|
|
Packit |
807167 |
li.HighPart = kt.dwHighDateTime;
|
|
Packit |
807167 |
(*strmap)["ru_stime"] = strprintf("%0.6f", li.QuadPart / 10000000.0);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
::CloseHandle(ph);
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
::MEMORYSTATUSEX msbuf;
|
|
Packit |
807167 |
msbuf.dwLength = sizeof(msbuf);
|
|
Packit |
807167 |
::GlobalMemoryStatusEx(&msbuf);
|
|
Packit |
807167 |
(*strmap)["mem_total"] = strprintf("%lld", (long long)msbuf.ullTotalPhys);
|
|
Packit |
807167 |
(*strmap)["mem_free"] = strprintf("%lld", (long long)msbuf.ullAvailPhys);
|
|
Packit |
807167 |
int64_t cached = msbuf.ullTotalPhys - msbuf.ullAvailPhys;
|
|
Packit |
807167 |
(*strmap)["mem_cached"] = strprintf("%lld", (long long)cached);
|
|
Packit |
807167 |
#else
|
|
Packit |
807167 |
_assert_(strmap);
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
/**
|
|
Packit |
807167 |
* Set the standard streams into the binary mode.
|
|
Packit |
807167 |
*/
|
|
Packit |
807167 |
void setstdiobin() {
|
|
Packit |
807167 |
#if defined(_SYS_MSVC_) || defined(_SYS_MINGW_)
|
|
Packit |
807167 |
_assert_(true);
|
|
Packit |
807167 |
_setmode(_fileno(stdin), O_BINARY);
|
|
Packit |
807167 |
_setmode(_fileno(stdout), O_BINARY);
|
|
Packit |
807167 |
_setmode(_fileno(stderr), O_BINARY);
|
|
Packit |
807167 |
#else
|
|
Packit |
807167 |
_assert_(true);
|
|
Packit |
807167 |
#endif
|
|
Packit |
807167 |
}
|
|
Packit |
807167 |
|
|
Packit |
807167 |
|
|
Packit |
807167 |
} // common namespace
|
|
Packit |
807167 |
|
|
Packit |
807167 |
// END OF FILE
|