diff --git a/meminfo_option.sh b/meminfo_option.sh new file mode 100644 index 0000000000000000000000000000000000000000..444386811712d4fd3bd44a8dfd3224d996de64e2 --- /dev/null +++ b/meminfo_option.sh @@ -0,0 +1,48 @@ +#!bin/sh + +MEMINFO="/proc/meminfo" +COUNT=0 + +function get_meminfo_words { + printf "char *meminfo_words[] = {\n" + while read line; do + COUNT=$(expr $COUNT + 1) + word=$(echo $line | awk '{print $1}') + printf " \"${word::-1}\",\n" + done <$MEMINFO + + printf "};\n\n" +} + +function get_count { + printf "static const unsigned int meminfo_count = $COUNT;\n\n" +} + +function get_meminfo_setter { + count=0 + while [ $count -lt $COUNT ]; do + printf "void set_result_offset$count(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[$count] = (uint64_t) data; +}\n\n" + count=$(expr $count + 1) + done +} + +function get_functions { + printf "static void (*setter_functions[])(GenericPointer, GenericPointer) = {\n" + count=0 + while [ $count -lt $COUNT ]; do + printf " set_result_offset$count,\n" + count=$(expr $count + 1) + done + printf "};\n\n" +} + +DEST="./src/meminfo_option.h" +printf "#include \"inttypes.h\"\n" >$DEST +printf "#include <info_reader.h>\n\n" >>$DEST +get_meminfo_words "./text.h" >>$DEST +get_count >>$DEST +get_meminfo_setter >>$DEST +get_functions >>$DEST diff --git a/src/meminfo_option.h b/src/meminfo_option.h new file mode 100644 index 0000000000000000000000000000000000000000..f3369b8e5962d4db7deed234988887604b779675 --- /dev/null +++ b/src/meminfo_option.h @@ -0,0 +1,402 @@ +#include "inttypes.h" +#include <info_reader.h> +char *meminfo_words[] = { + "MemTotal", + "MemFree", + "MemAvailable", + "Buffers", + "Cached", + "SwapCached", + "Active", + "Inactive", + "Active(anon)", + "Inactive(anon)", + "Active(file)", + "Inactive(file)", + "Unevictable", + "Mlocked", + "SwapTotal", + "SwapFree", + "Zswap", + "Zswapped", + "Dirty", + "Writeback", + "AnonPages", + "Mapped", + "Shmem", + "KReclaimable", + "Slab", + "SReclaimable", + "SUnreclaim", + "KernelStack", + "PageTables", + "SecPageTables", + "NFS_Unstable", + "Bounce", + "WritebackTmp", + "CommitLimit", + "Committed_AS", + "VmallocTotal", + "VmallocUsed", + "VmallocChunk", + "Percpu", + "HardwareCorrupted", + "AnonHugePages", + "ShmemHugePages", + "ShmemPmdMapped", + "FileHugePages", + "FilePmdMapped", + "CmaTotal", + "CmaFree", + "HugePages_Total", + "HugePages_Free", + "HugePages_Rsvd", + "HugePages_Surp", + "Hugepagesize", + "Hugetlb", + "DirectMap4k", + "DirectMap2M", + "DirectMap1G", +}; + +static const unsigned int meminfo_count = 56; + +void set_result_offset0(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[0] = (uint64_t) data; +} + +void set_result_offset1(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[1] = (uint64_t) data; +} + +void set_result_offset2(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[2] = (uint64_t) data; +} + +void set_result_offset3(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[3] = (uint64_t) data; +} + +void set_result_offset4(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[4] = (uint64_t) data; +} + +void set_result_offset5(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[5] = (uint64_t) data; +} + +void set_result_offset6(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[6] = (uint64_t) data; +} + +void set_result_offset7(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[7] = (uint64_t) data; +} + +void set_result_offset8(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[8] = (uint64_t) data; +} + +void set_result_offset9(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[9] = (uint64_t) data; +} + +void set_result_offset10(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[10] = (uint64_t) data; +} + +void set_result_offset11(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[11] = (uint64_t) data; +} + +void set_result_offset12(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[12] = (uint64_t) data; +} + +void set_result_offset13(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[13] = (uint64_t) data; +} + +void set_result_offset14(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[14] = (uint64_t) data; +} + +void set_result_offset15(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[15] = (uint64_t) data; +} + +void set_result_offset16(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[16] = (uint64_t) data; +} + +void set_result_offset17(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[17] = (uint64_t) data; +} + +void set_result_offset18(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[18] = (uint64_t) data; +} + +void set_result_offset19(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[19] = (uint64_t) data; +} + +void set_result_offset20(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[20] = (uint64_t) data; +} + +void set_result_offset21(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[21] = (uint64_t) data; +} + +void set_result_offset22(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[22] = (uint64_t) data; +} + +void set_result_offset23(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[23] = (uint64_t) data; +} + +void set_result_offset24(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[24] = (uint64_t) data; +} + +void set_result_offset25(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[25] = (uint64_t) data; +} + +void set_result_offset26(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[26] = (uint64_t) data; +} + +void set_result_offset27(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[27] = (uint64_t) data; +} + +void set_result_offset28(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[28] = (uint64_t) data; +} + +void set_result_offset29(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[29] = (uint64_t) data; +} + +void set_result_offset30(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[30] = (uint64_t) data; +} + +void set_result_offset31(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[31] = (uint64_t) data; +} + +void set_result_offset32(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[32] = (uint64_t) data; +} + +void set_result_offset33(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[33] = (uint64_t) data; +} + +void set_result_offset34(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[34] = (uint64_t) data; +} + +void set_result_offset35(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[35] = (uint64_t) data; +} + +void set_result_offset36(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[36] = (uint64_t) data; +} + +void set_result_offset37(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[37] = (uint64_t) data; +} + +void set_result_offset38(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[38] = (uint64_t) data; +} + +void set_result_offset39(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[39] = (uint64_t) data; +} + +void set_result_offset40(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[40] = (uint64_t) data; +} + +void set_result_offset41(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[41] = (uint64_t) data; +} + +void set_result_offset42(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[42] = (uint64_t) data; +} + +void set_result_offset43(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[43] = (uint64_t) data; +} + +void set_result_offset44(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[44] = (uint64_t) data; +} + +void set_result_offset45(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[45] = (uint64_t) data; +} + +void set_result_offset46(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[46] = (uint64_t) data; +} + +void set_result_offset47(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[47] = (uint64_t) data; +} + +void set_result_offset48(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[48] = (uint64_t) data; +} + +void set_result_offset49(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[49] = (uint64_t) data; +} + +void set_result_offset50(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[50] = (uint64_t) data; +} + +void set_result_offset51(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[51] = (uint64_t) data; +} + +void set_result_offset52(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[52] = (uint64_t) data; +} + +void set_result_offset53(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[53] = (uint64_t) data; +} + +void set_result_offset54(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[54] = (uint64_t) data; +} + +void set_result_offset55(GenericPointer ptr, GenericPointer data) { + uint64_t* result = (uint64_t *) ptr; + result[55] = (uint64_t) data; +} + +static void (*setter_functions[])(GenericPointer, GenericPointer) = { + set_result_offset0, + set_result_offset1, + set_result_offset2, + set_result_offset3, + set_result_offset4, + set_result_offset5, + set_result_offset6, + set_result_offset7, + set_result_offset8, + set_result_offset9, + set_result_offset10, + set_result_offset11, + set_result_offset12, + set_result_offset13, + set_result_offset14, + set_result_offset15, + set_result_offset16, + set_result_offset17, + set_result_offset18, + set_result_offset19, + set_result_offset20, + set_result_offset21, + set_result_offset22, + set_result_offset23, + set_result_offset24, + set_result_offset25, + set_result_offset26, + set_result_offset27, + set_result_offset28, + set_result_offset29, + set_result_offset30, + set_result_offset31, + set_result_offset32, + set_result_offset33, + set_result_offset34, + set_result_offset35, + set_result_offset36, + set_result_offset37, + set_result_offset38, + set_result_offset39, + set_result_offset40, + set_result_offset41, + set_result_offset42, + set_result_offset43, + set_result_offset44, + set_result_offset45, + set_result_offset46, + set_result_offset47, + set_result_offset48, + set_result_offset49, + set_result_offset50, + set_result_offset51, + set_result_offset52, + set_result_offset53, + set_result_offset54, + set_result_offset55, +}; + diff --git a/src/memory_extra.c b/src/memory_extra.c new file mode 100644 index 0000000000000000000000000000000000000000..f6168709f734688a87aacd807e3b7a0295f5b579 --- /dev/null +++ b/src/memory_extra.c @@ -0,0 +1,95 @@ +#include "meminfo_option.h" +#include <info_reader.h> +#include <inttypes.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static const char *path = "/proc/meminfo"; + +GenericPointer long_allocator(char *s) { + long value = atol(s); + return (GenericPointer)value; +} + +KeyFinder *build_keyfinder(unsigned int count, unsigned int *indexes) { + KeyFinder *keys = (KeyFinder *)calloc(count, sizeof(KeyFinder)); + for (unsigned int i = 0; i < count; i++) { + unsigned int idx = indexes[i]; + KeyFinder key = {.key = meminfo_words[idx], + .delimiter = ":", + .copy = long_allocator, + .set = setter_functions[i]}; + memcpy(&keys[i], &key, sizeof(KeyFinder)); + } + return keys; +} + +void memory_list(char *memory_string, unsigned int *count, + unsigned int *indexes) { + char *token; + *count = 0; + + while ((token = strtok(memory_string, ",")) != NULL) { + memory_string = NULL; + + unsigned int i; + for (i = 0; i < meminfo_count; i++) { + if (strcmp(meminfo_words[i], token) == 0) { + (*count)++; + indexes[*count - 1] = i; + break; + } + } + + if (i == meminfo_count) { + fprintf(stderr, "Unknown memory counter: %s\n", token); + exit(EXIT_FAILURE); + } + + if ((*count) > meminfo_count) { + fprintf(stderr, "Too much counters, there are probably duplicates\n"); + exit(EXIT_FAILURE); + } + } +} + +int main(int argc, char **argv) { + + if (argc != 2) { + fprintf(stderr, "Usage ... [elem1,elem2...]\n"); + exit(EXIT_FAILURE); + } + + unsigned int indexes[meminfo_count]; + unsigned int count = 0; + memory_list(argv[1], &count, indexes); + + printf("%d, count \n", count); + + KeyFinder *keys = build_keyfinder(count, indexes); + uint64_t value[count]; + + // -- Init the parser + Parser parser = {.storage = (GenericPointer)&value, + .capacity = 1, + .storage_struct_size = sizeof(uint64_t) * count, + .keys = keys, + .nb_keys = count, + .file = fopen(path, "r")}; + + // -- Parse the file + while (1) { + parse(&parser); + for (unsigned int i = 0; i < count; i++) { + printf("%s: %" PRIu64 "\n", keys[i].key, value[i]); + } + } + + free(keys); + + // Print and free the results + + fclose(parser.file); + return 0; +}