/* vmrss-demo.c: membuktikan demand paging lewat VmRSS di /proc/self/status */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static long baca_vmrss_kb(void)
{
    FILE *f = fopen("/proc/self/status", "r");
    char baris[256];
    long kb = -1;

    if (f == NULL) {
        return -1;
    }
    while (fgets(baris, sizeof baris, f) != NULL) {
        if (sscanf(baris, "VmRSS: %ld kB", &kb) == 1) {
            break;
        }
    }
    fclose(f);
    return kb;
}

int main(void)
{
    const size_t ukuran = (size_t)8 * 1024 * 1024; /* 8 MiB */
    char *p = malloc(ukuran);
    long sebelum, setelah_alokasi, setelah_sentuh;

    if (p == NULL) {
        fprintf(stderr, "malloc gagal\n");
        return 1;
    }
    sebelum = baca_vmrss_kb();
    setelah_alokasi = baca_vmrss_kb();
    memset(p, 1, ukuran); /* sentuh setiap byte -> page fault per page */
    setelah_sentuh = baca_vmrss_kb();

    printf("malloc 8 MiB, belum disentuh : RSS naik >= 8192 kB? %s\n",
           (setelah_alokasi - sebelum >= 8192) ? "ya" : "tidak");
    printf("memset 8 MiB, menyentuh      : RSS naik >= 8192 kB? %s\n",
           (setelah_sentuh - setelah_alokasi >= 8192) ? "ya" : "tidak");
    free(p);
    return 0;
}
