/* * Copyright 2004 Sun Microsystems, Inc. ALL RIGHTS RESERVED * Use of this software is authorized pursuant to the terms of the * license found at http://developers.sun.com/berkeley_license.html */ #include #include #include #include #include /* * By Greg Nakhimovsky, Sun MDE, March 2004. * Returns current free physical memory in kilobytes computed as * pagesize*(system_pages.freemem - system_pages.lotsfree)/1024. * Note that the retuned value may be negative, meaning that * paging to disk is either imminent or already occurring. */ int phys_mem_avail(void) { static long pagesize=0; static kstat_ctl_t *kc; static kstat_t *sys_pagesp; static size_t lotsfree; kstat_named_t *kn; size_t freemem; if(pagesize == 0) { /* Get the constant values (pagesize and lotsfree) once */ pagesize = sysconf(_SC_PAGESIZE); if((kc=kstat_open()) == 0) perror("kstat_open"),exit(1); if((sys_pagesp=kstat_lookup(kc, "unix", 0, "system_pages")) == 0) perror("kstat_lookup(system_pages)"),exit(1); if(kstat_read(kc, sys_pagesp, 0) == -1) perror("kstat_read(syspages)"),exit(1); if((kn=kstat_data_lookup(sys_pagesp, "lotsfree")) == 0) perror("kstat_data_lookup(lotsfree)"),exit(1); lotsfree = kn->value.ul; } if(kstat_read(kc, sys_pagesp, 0) == -1) perror("kstat_read(syspages)"),exit(1); if((kn=kstat_data_lookup(sys_pagesp, "freemem")) == 0) perror("kstat_data_lookup(freemem)"),exit(1); freemem = kn->value.ul; return pagesize/1024*(freemem-lotsfree); }