3d7ffb6fb652ecb847b8d176132675cbfc18f7e0
[scilab.git] / scilab / modules / core / src / c / getmemory.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2005 - INRIA - Allan CORNET
4  * 
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at    
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 /* References
14 @sa http://nixdoc.net/man-pages/Tru64/man2/getsysinfo.2.html
15 @sa http://www.opensource.apple.com/darwinsource/projects/other/gccfast-1621.1/libiberty/physmem.c
16 @sa http://lists.gnu.org/archive/html/bug-gnulib/2003-08/msg00102.html
17 */
18 #include "getmemory.h"
19 #include <stdio.h>
20 #define kooctet 1024
21 int getfreememory(void)
22 {
23
24 #if defined(_MSC_VER)
25   {
26     MEMORYSTATUS stat;
27     GlobalMemoryStatus (&stat);
28     return (int)(stat.dwAvailPhys/kooctet);
29   }
30 #elif defined(hpux)
31  {
32    struct pst_static pst;
33   /*        pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0);
34         memorysizeKO=(pst.psd_free)/kooctet;*/
35   return 0;
36  }
37 #elif defined(__APPLE__) 
38       {
39         vm_statistics_data_t page_info;
40         vm_size_t pagesize;
41         mach_msg_type_number_t count;
42         kern_return_t kret;
43     
44         pagesize = 0;
45         kret = host_page_size (mach_host_self(), &pagesize);
46         count = HOST_VM_INFO_COUNT;
47     
48         kret = host_statistics (mach_host_self(), HOST_VM_INFO,(host_info_t)&page_info, &count);
49         return page_info.free_count*pagesize / 1024;
50       }
51 #elif HAVE_TABLE && defined TBL_VMSTATS
52    { /* This works on Tru64 UNIX V4/5.  */
53      struct tbl_vmstats vmstats;
54
55      if (table (TBL_VMSTATS, 0, &vmstats, 1, sizeof (vmstats)) == 1)
56        {
57          double pages = vmstats.free_count;
58          double pagesize = vmstats.pagesize;
59
60          if (0 <= pages && 0 <= pagesize)
61            return pages * pagesize;
62          else
63            return 0;
64        }
65    }
66 #elif defined(__linux__)
67   {
68     char field[9]  = {0};
69     long long data =  0;
70     char unit[4]   = {0};
71     
72     long long free    = -1,
73               buffers = -1,
74               cached  = -1;
75     
76     FILE *fp = fopen("/proc/meminfo", "r");
77     if(fp != NULL)
78     {
79       /* Read Cached, Buffers and MemFree from /proc/meminfo */
80       while(fscanf(fp, "%8s %lld %3s\n", field, &data, unit) != EOF)
81       {
82         if(!strncmp("MemFree:", field, 8))
83           free = data;
84         else if(!strncmp("Buffers:", field, 8))
85           buffers = data;
86         else if(!strncmp("Cached:", field, 8))
87           cached = data;
88       }
89       fclose(fp);
90       
91       /* Read successful, convert unit and return the result */
92       if(buffers >= 0 && cached >= 0 && free >= 0)
93       {
94         free += cached + buffers;
95         switch(unit[0])
96         {
97           case 'g':
98           case 'G':
99             free *= kooctet;
100           case 'm':
101           case 'M':
102             free *= kooctet;
103             break;
104           case 'o':
105           case 'O':
106             free /= kooctet;
107         }
108         return (int)free;
109       }
110     }
111     
112     /* Strange, /proc not mounted ? new and unknown format ?
113        fall back to inaccurate sysconf() */
114     return (sysconf(_SC_AVPHYS_PAGES)*sysconf(_SC_PAGESIZE))/kooctet;
115   }
116 #else
117   /* BSD, Solaris and others assumed*/
118   return (sysconf(_SC_AVPHYS_PAGES)*sysconf(_SC_PAGESIZE))/kooctet;
119 #endif
120 }
121 /*--------------------------------------------------------------------------*/ 
122 int getmemorysize()
123 {
124 #if defined(_MSC_VER)
125   {
126     MEMORYSTATUS stat;
127     GlobalMemoryStatus (&stat);
128     return (int)(stat.dwTotalPhys/kooctet);
129   }
130 #elif defined(hpux)
131   {
132     struct pst_static pst;
133     pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0);
134     return (int)((pst.physical_memory)/kooctet);
135   }
136 #elif defined(__APPLE__) 
137   {
138     size_t len;
139     int total;
140     int mib[2];
141
142     mib[0] = CTL_HW;
143     mib[1] = HW_PHYSMEM;
144     len = sizeof (total);
145  
146     sysctl(mib, 2, &total, &len, NULL, 0);
147     return  total/1024;
148   }
149 #elif HAVE_GETSYSINFO && defined GSI_PHYSMEM
150    { /* This works on Tru64 UNIX V4/5.  */
151      int physmem;
152
153      if (getsysinfo (GSI_PHYSMEM, (caddr_t) &physmem, sizeof (physmem),
154                     NULL, NULL, NULL) == 1)
155        {
156         double kbytes = physmem;
157
158         if (0 <= kbytes)
159           return kbytes * 1024.0;
160         else
161           return 0;
162        }
163    }
164 #else
165   /* Linux ,Solaris and others */
166   return (sysconf(_SC_PHYS_PAGES)*sysconf(_SC_PAGESIZE))/kooctet;
167 #endif
168 }
169 /*--------------------------------------------------------------------------*/