* More feedback for debug (many memory information)
[scilab.git] / scilab / modules / core / src / c / getmemory.c
1
2 /*--------------------------------------------------------------------------*/
3 /* INRIA 2005 */
4 /* Allan CORNET */
5 /* References
6 @sa http://nixdoc.net/man-pages/Tru64/man2/getsysinfo.2.html
7 @sa http://www.opensource.apple.com/darwinsource/projects/other/gccfast-1621.1/libiberty/physmem.c
8 @sa http://lists.gnu.org/archive/html/bug-gnulib/2003-08/msg00102.html
9 * @TODO (Sylvestre Ledru)
10 * This file needs some work because the Linux Kernel is caching many memory
11 * therefor, the free memory value is pretty wrong
12 */
13 #include "getmemory.h"
14
15 int getfreememory()
16 {
17 #define kooctet 1024
18 #undef MEMOK
19
20 #if defined(_MSC_VER)
21   {
22     #define MEMOK 1
23     MEMORYSTATUS stat;
24     GlobalMemoryStatus (&stat);
25     return (int)(stat.dwAvailPhys/kooctet);
26   }
27 #endif
28
29 #if defined(hpux)
30 #define MEMOK 1
31
32  {
33    struct pst_static pst;
34   /*    pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0);
35         memorysizeKO=(pst.psd_free)/kooctet;*/
36   return 0;
37  }
38
39 #endif
40 #if defined(__APPLE__) 
41 #define MEMOK 1
42       {
43         vm_statistics_data_t page_info;
44         vm_size_t pagesize;
45         mach_msg_type_number_t count;
46         kern_return_t kret;
47     
48         pagesize = 0;
49         kret = host_page_size (mach_host_self(), &pagesize);
50         count = HOST_VM_INFO_COUNT;
51     
52         kret = host_statistics (mach_host_self(), HOST_VM_INFO,(host_info_t)&page_info, &count);
53         return page_info.free_count*pagesize / 1024;
54       }
55 #endif
56
57 #if HAVE_TABLE && defined TBL_VMSTATS
58 #define MEMOK 1
59    { /* This works on Tru64 UNIX V4/5.  */
60      struct tbl_vmstats vmstats;
61
62      if (table (TBL_VMSTATS, 0, &vmstats, 1, sizeof (vmstats)) == 1)
63        {
64          double pages = vmstats.free_count;
65          double pagesize = vmstats.pagesize;
66
67          if (0 <= pages && 0 <= pagesize)
68            return pages * pagesize;
69          else
70            return 0;
71        }
72    }
73 #endif
74
75 #ifndef  MEMOK
76 /* Linux ,Solaris and others assumed*/
77       return (sysconf(_SC_AVPHYS_PAGES)*sysconf(_SC_PAGESIZE))/kooctet;
78 #endif
79
80 }
81 /*--------------------------------------------------------------------------*/ 
82 int getmemorysize()
83 {
84 #define kooctet 1024
85 #undef MEMOK
86
87
88 #if defined(_MSC_VER)
89 #define MEMOK 1
90   {
91     MEMORYSTATUS stat;
92     GlobalMemoryStatus (&stat);
93     return (int)(stat.dwTotalPhys/kooctet);
94   }
95 #endif
96
97 #if defined(hpux)
98 #define MEMOK 1
99   {
100     struct pst_static pst;
101     pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0);
102     return (int)((pst.physical_memory)/kooctet);
103   }
104 #endif
105
106 #if defined(__APPLE__) 
107 #define MEMOK 1
108   {
109     size_t len;
110     int total;
111     int mib[2];
112
113     mib[0] = CTL_HW;
114     mib[1] = HW_PHYSMEM;
115     len = sizeof (total);
116  
117     sysctl(mib, 2, &total, &len, NULL, 0);
118     return  total/1024;
119   }
120 #endif
121
122 #if HAVE_GETSYSINFO && defined GSI_PHYSMEM
123 #define MEMOK 1
124    { /* This works on Tru64 UNIX V4/5.  */
125      int physmem;
126
127      if (getsysinfo (GSI_PHYSMEM, (caddr_t) &physmem, sizeof (physmem),
128                     NULL, NULL, NULL) == 1)
129        {
130         double kbytes = physmem;
131
132         if (0 <= kbytes)
133           return kbytes * 1024.0;
134         else
135           return 0;
136        }
137    }
138 #endif
139
140 #ifndef  MEMOK
141   /* Linux ,Solaris and others */
142   return (sysconf(_SC_PHYS_PAGES)*sysconf(_SC_PAGESIZE))/kooctet;
143 #endif
144 }
145 /*--------------------------------------------------------------------------*/