7534149b8608dc8555e2bc1763709513a5251f66
[scilab.git] / scilab / modules / core / src / c / getmaxMALLOC.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2006 - INRIA - Allan CORNET
4 * Copyright (C) 2010 - DIGITEO - Allan CORNET
5 *
6 * This file must be used under the terms of the CeCILL.
7 * This source file is licensed as described in the file COPYING, which
8 * you should have received as part of this distribution.  The terms
9 * are also available at
10 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11 *
12 */
13 /*-----------------------------------------------------------------------------------*/
14 #ifdef _MSC_VER
15 #include <Windows.h>
16 #else
17 #include <sys/resource.h>
18 #include "machine.h"
19 #include "getmemory.h"
20
21 #ifdef HAVE_LIMITS_H
22 #include <limits.h>
23 #elif !defined(LONG_MAX)
24 #define LONG_MAX 2147483647L
25 #endif
26
27 #ifdef USE_DYNAMIC_STACK
28 #ifndef MAXLONG32
29 #define MAXLONG32 2147483647L
30 #endif
31 #endif
32
33 #endif
34
35 #include "getmaxMALLOC.h"
36 /*-----------------------------------------------------------------------------------*/
37 #ifdef _MSC_VER
38 unsigned long GetLargestFreeMemoryRegion(void)
39 {
40 #if _WIN64
41     /* we need to limit values to 32 bits for Scilab :( */
42
43     /* Bug 10439 JVM reserves some space in 32 bit space */
44     /* "Empiric" value for a Java Heap space to 256mb */
45     /* It is not really a good workaround :/ */
46 #define SECURITY_FREE_MEMORY 355483647
47
48     return MAXLONG32 - SECURITY_FREE_MEMORY;
49 #else
50 #define SECURITY_FREE_MEMORY 1040000
51     SYSTEM_INFO systemInfo;
52     VOID *p = 0;
53     MEMORY_BASIC_INFORMATION mbi;
54     unsigned long largestSize = 0;
55
56     GetSystemInfo(&systemInfo);
57
58     while (p < systemInfo.lpMaximumApplicationAddress)
59     {
60         SIZE_T dwRet = VirtualQuery(p, &mbi, sizeof(mbi));
61         if (dwRet > 0)
62         {
63             if (mbi.State == MEM_FREE)
64             {
65                 if (largestSize < mbi.RegionSize)
66                 {
67                     largestSize = (unsigned long) mbi.RegionSize;
68                 }
69             }
70             p = (void*) (((char*)p) + mbi.RegionSize);
71         }
72         else
73         {
74             p = (void*) (((char*)p) + systemInfo.dwPageSize);
75         }
76     }
77     /* We remove a security size to be sure that MALLOC doesn't fails */
78     if (largestSize > SECURITY_FREE_MEMORY)
79     {
80         largestSize = largestSize - SECURITY_FREE_MEMORY;
81     }
82
83     return largestSize;
84 #endif
85 }
86 /*-----------------------------------------------------------------------------------*/
87 #else
88 unsigned long GetLargestFreeMemoryRegion(void)
89 {
90 #ifdef USE_DYNAMIC_STACK
91     /* we need to limit values to 32 bits for Scilab :( */
92     return MAXLONG32;
93 #else
94     struct rlimit rlim;
95     unsigned long largestSize, freeMem;
96
97     /* HP-UX Use RLIMIT_AIO_MEM instead of RLIMIT_MEMLOCK */
98     /* FIXME -- this should be an autoconf test to see which RLIMIT_foo is defined */
99 #ifdef solaris
100     getrlimit(RLIMIT_VMEM, &rlim);
101 #elif defined(__NetBSD__) || defined(__DragonFly__)
102     getrlimit(RLIMIT_RSS, &rlim);
103 #else
104     getrlimit(RLIMIT_AS, &rlim);
105 #endif
106     if (rlim.rlim_max == RLIM_INFINITY)
107     {
108         largestSize = LONG_MAX;
109     }
110     else
111     {
112         largestSize = rlim.rlim_max;
113     }
114
115     freeMem = getfreememory() * 1024;
116     if (freeMem < largestSize)
117     {
118         return freeMem;
119     }
120     else
121     {
122         return largestSize;
123     }
124
125     return largestSize;
126 #endif /* #ifdef USE_DYNAMIC_STACK */
127 }
128 #endif
129 /*-----------------------------------------------------------------------------------*/