master ohmu/fastfetch-openbsd / src / detection / memory / memory_sunos.c
ohmu  ·  2026-10-15
 1#include "memory.h"
 2#include <unistd.h>
 3#include <kstat.h>
 4
 5static inline void kstatFreeWrap(kstat_ctl_t** pkc) {
 6    assert(pkc);
 7    if (*pkc) {
 8        kstat_close(*pkc);
 9    }
10}
11
12const char* ffDetectMemory(FFMemoryResult* ram) {
13    const uint32_t pageSizeShift = instance.state.platform.sysinfo.pageSizeShift;
14
15    ram->bytesTotal = (uint64_t) sysconf(_SC_PHYS_PAGES) << pageSizeShift;
16    ram->bytesUsed = ram->bytesTotal - ((uint64_t) sysconf(_SC_AVPHYS_PAGES) << pageSizeShift);
17
18    [[gnu::cleanup(kstatFreeWrap)]] kstat_ctl_t* kc = kstat_open();
19    if (kc != nullptr) {
20        kstat_t* ksp = kstat_lookup(kc, "zfs", -1, "arcstats");
21        if (ksp != nullptr && kstat_read(kc, ksp, nullptr) != -1) {
22            kstat_named_t* kn_size = (kstat_named_t*) kstat_data_lookup(ksp, "size");
23            kstat_named_t* kn_cmin = (kstat_named_t*) kstat_data_lookup(ksp, "c_min");
24
25            if (kn_size != nullptr && kn_cmin != nullptr &&
26                kn_size->data_type == KSTAT_DATA_UINT64 &&
27                kn_cmin->data_type == KSTAT_DATA_UINT64) {
28                uint64_t arcSize = kn_size->value.ui64;
29                uint64_t arcMin = kn_cmin->value.ui64;
30
31                if (arcSize > arcMin) {
32                    uint64_t reclaimableArc = arcSize - arcMin;
33
34                    if (ram->bytesUsed > reclaimableArc) {
35                        ram->bytesUsed -= reclaimableArc;
36                    }
37                }
38            }
39        }
40    }
41
42    return nullptr;
43}