CeCILL headers added
[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 * @TODO (Sylvestre Ledru)
18 * This file needs some work because the Linux Kernel is caching many memory
19 * therefor, the free memory value is pretty wrong
20 */
21 #include "getmemory.h"
22
23 int getfreememory()
24 {
25 #define kooctet 1024
26 #undef MEMOK
27
28 #if defined(_MSC_VER)
29   {
30     #define MEMOK 1
31     MEMORYSTATUS stat;
32     GlobalMemoryStatus (&stat);
33     return (int)(stat.dwAvailPhys/kooctet);
34   }
35 #endif
36
37 #if defined(hpux)
38 #define MEMOK 1
39
40  {
41    struct pst_static pst;
42   /*    pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0);
43         memorysizeKO=(pst.psd_free)/kooctet;*/
44   return 0;
45  }
46
47 #endif
48 #if defined(__APPLE__) 
49 #define MEMOK 1
50       {
51         vm_statistics_data_t page_info;
52         vm_size_t pagesize;
53         mach_msg_type_number_t count;
54         kern_return_t kret;
55     
56         pagesize = 0;
57         kret = host_page_size (mach_host_self(), &pagesize);
58         count = HOST_VM_INFO_COUNT;
59     
60         kret = host_statistics (mach_host_self(), HOST_VM_INFO,(host_info_t)&page_info, &count);
61         return page_info.free_count*pagesize / 1024;
62       }
63 #endif
64
65 #if HAVE_TABLE && defined TBL_VMSTATS
66 #define MEMOK 1
67    { /* This works on Tru64 UNIX V4/5.  */
68      struct tbl_vmstats vmstats;
69
70      if (table (TBL_VMSTATS, 0, &vmstats, 1, sizeof (vmstats)) == 1)
71        {
72          double pages = vmstats.free_count;
73          double pagesize = vmstats.pagesize;
74
75          if (0 <= pages && 0 <= pagesize)
76            return pages * pagesize;
77          else
78            return 0;
79        }
80    }
81 #endif
82
83 #ifndef  MEMOK
84 /* Linux ,Solaris and others assumed*/
85       return (sysconf(_SC_AVPHYS_PAGES)*sysconf(_SC_PAGESIZE))/kooctet;
86 #endif
87
88 }
89 /*--------------------------------------------------------------------------*/ 
90 int getmemorysize()
91 {
92 #define kooctet 1024
93 #undef MEMOK
94
95
96 #if defined(_MSC_VER)
97 #define MEMOK 1
98   {
99     MEMORYSTATUS stat;
100     GlobalMemoryStatus (&stat);
101     return (int)(stat.dwTotalPhys/kooctet);
102   }
103 #endif
104
105 #if defined(hpux)
106 #define MEMOK 1
107   {
108     struct pst_static pst;
109     pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0);
110     return (int)((pst.physical_memory)/kooctet);
111   }
112 #endif
113
114 #if defined(__APPLE__) 
115 #define MEMOK 1
116   {
117     size_t len;
118     int total;
119     int mib[2];
120
121     mib[0] = CTL_HW;
122     mib[1] = HW_PHYSMEM;
123     len = sizeof (total);
124  
125     sysctl(mib, 2, &total, &len, NULL, 0);
126     return  total/1024;
127   }
128 #endif
129
130 #if HAVE_GETSYSINFO && defined GSI_PHYSMEM
131 #define MEMOK 1
132    { /* This works on Tru64 UNIX V4/5.  */
133      int physmem;
134
135      if (getsysinfo (GSI_PHYSMEM, (caddr_t) &physmem, sizeof (physmem),
136                     NULL, NULL, NULL) == 1)
137        {
138         double kbytes = physmem;
139
140         if (0 <= kbytes)
141           return kbytes * 1024.0;
142         else
143           return 0;
144        }
145    }
146 #endif
147
148 #ifndef  MEMOK
149   /* Linux ,Solaris and others */
150   return (sysconf(_SC_PHYS_PAGES)*sysconf(_SC_PAGESIZE))/kooctet;
151 #endif
152 }
153 /*--------------------------------------------------------------------------*/