1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
/*
* Copyright (C) 2005-2018 Team Kodi
* This file is part of Kodi - https://kodi.tv
*
* SPDX-License-Identifier: GPL-2.0-or-later
* See LICENSES/README.md for more information.
*/
#include "utils/MemUtils.h"
#include <array>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <unistd.h> /* FreeBSD can't write standalone headers */
#include <sys/sysctl.h> /* FreeBSD can't write standalone headers */
#include <sys/types.h>
namespace KODI
{
namespace MEMORY
{
void* AlignedMalloc(size_t s, size_t alignTo)
{
void* p;
posix_memalign(&p, alignTo, s);
return p;
}
void AlignedFree(void* p)
{
free(p);
}
void GetMemoryStatus(MemoryStatus* buffer)
{
if (!buffer)
return;
/* sysctl hw.physmem */
size_t len = 0;
/* physmem */
size_t physmem = 0;
len = sizeof(physmem);
if (sysctlbyname("hw.physmem", &physmem, &len, NULL, 0) == 0)
{
buffer->totalPhys = physmem;
}
/* pagesize */
size_t pagesize = 0;
len = sizeof(pagesize);
if (sysctlbyname("hw.pagesize", &pagesize, &len, NULL, 0) != 0)
pagesize = 4096;
/* mem_inactive */
size_t mem_inactive = 0;
len = sizeof(mem_inactive);
if (sysctlbyname("vm.stats.vm.v_inactive_count", &mem_inactive, &len, NULL, 0) == 0)
mem_inactive *= pagesize;
/* mem_cache */
size_t mem_cache = 0;
len = sizeof(mem_cache);
if (sysctlbyname("vm.stats.vm.v_cache_count", &mem_cache, &len, NULL, 0) == 0)
mem_cache *= pagesize;
/* mem_free */
size_t mem_free = 0;
len = sizeof(mem_free);
if (sysctlbyname("vm.stats.vm.v_free_count", &mem_free, &len, NULL, 0) == 0)
mem_free *= pagesize;
/* mem_avail = mem_inactive + mem_cache + mem_free */
buffer->availPhys = mem_inactive + mem_cache + mem_free;
}
}
}
|