Skip to content

Instantly share code, notes, and snippets.

@ztmr
Created January 19, 2014 20:11
Show Gist options
  • Select an option

  • Save ztmr/8510363 to your computer and use it in GitHub Desktop.

Select an option

Save ztmr/8510363 to your computer and use it in GitHub Desktop.

Revisions

  1. ztmr created this gist Jan 19, 2014.
    67 changes: 67 additions & 0 deletions free.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,67 @@
    /*
    * $Id: $
    *
    * Module: free -- description
    * Created: 15-SEP-2008 17:56
    * Author: tmr
    */

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/param.h>
    #include <sys/sysctl.h>

    typedef struct {
    unsigned pages;
    unsigned kbytes;
    } MemSizeItem;

    typedef struct {
    MemSizeItem free;
    MemSizeItem used;
    MemSizeItem total;
    } MemInfo;

    unsigned page2kbyte (unsigned pageCnt)
    { return (pageCnt * getpagesize ()) >> 10; }

    void getMemInfo (MemInfo * mem) {

    /* statistics about the UVM memory *
    * management system. */
    int mib [] = { CTL_VM, VM_UVMEXP };
    const int pagesize = getpagesize ();
    struct uvmexp our_uvmexp;
    size_t size = sizeof (our_uvmexp);

    if (sysctl (mib, 2, &our_uvmexp, &size, NULL, 0) < 0) {
    fprintf (stderr, "cannot get memory info!");
    return;
    }

    mem->total.pages = our_uvmexp.npages;
    mem->free.pages = our_uvmexp.free +our_uvmexp.inactive;
    mem->used.pages = mem->total.pages -mem->free.pages;

    mem->total.kbytes = page2kbyte (mem->total.pages);
    mem->used.kbytes = page2kbyte (mem->used.pages);
    mem->free.kbytes = page2kbyte (mem->free.pages);
    }

    #define FORMAT(name,item) \
    printf ("%8s: %8d pages ~=%8d kBytes\n", \
    name, item.pages, item.kbytes);

    int main (int argc, char * argv []) {

    MemInfo mem;
    getMemInfo (&mem);

    FORMAT ("Total", mem.total);
    FORMAT ("Used", mem.used);
    FORMAT ("Free", mem.free);

    return (0);
    }

    // vim: fdm=syntax:fdn=1:tw=74:ts=2:syn=c