Next version of JABA
[jabaws.git] / binaries / src / muscle / globalslinux.cpp
1 #include "muscle.h"\r
2 \r
3 #if             defined(__linux__)\r
4 #include <sys/time.h>\r
5 #include <sys/resource.h>\r
6 #include <unistd.h>\r
7 #include <errno.h>\r
8 #include <stdio.h>\r
9 #include <fcntl.h>\r
10 \r
11 const int ONE_MB = 1000000;\r
12 const int MEM_WARNING_THRESHOLD = 20*ONE_MB;\r
13 \r
14 double GetNAN()\r
15         {\r
16         static unsigned long nan[2]={0xffffffff, 0x7fffffff};\r
17         double dNAN = *( double* )nan;\r
18         return dNAN;\r
19         }\r
20 \r
21 double g_dNAN = GetNAN();\r
22 \r
23 void chkmem(const char szMsg[])\r
24         {\r
25         //assert(_CrtCheckMemory());\r
26         }\r
27 \r
28 void Break()\r
29         {\r
30         //DebugBreak();\r
31         }\r
32 \r
33 static char szCmdLine[4096];\r
34 \r
35 void *ptrStartBreak = sbrk(0);\r
36 \r
37 const char *GetCmdLine()\r
38         {\r
39         return szCmdLine;\r
40         }\r
41 \r
42 double GetMemUseMB()\r
43         {\r
44         static char statm[64];\r
45         static int PageSize;\r
46         if (0 == statm[0])\r
47                 {\r
48                 PageSize = sysconf(_SC_PAGESIZE);\r
49                 pid_t pid = getpid();\r
50                 sprintf(statm, "/proc/%d/statm", (int) pid);\r
51                 }\r
52 \r
53         int fd = open(statm, O_RDONLY);\r
54         if (-1 == fd)\r
55                 return -1;\r
56         char Buffer[64];\r
57         int n = read(fd, Buffer, sizeof(Buffer) - 1);\r
58         close(fd);\r
59         fd = -1;\r
60 \r
61         if (n <= 0)\r
62                 {\r
63                 static bool Warned = false;\r
64                 if (!Warned)\r
65                         {\r
66                         Warned = true;\r
67                         Warning("*Warning* Cannot read %s errno=%d %s",\r
68                           statm, errno, strerror(errno));\r
69                         }\r
70                 return 0;\r
71                 }\r
72         Buffer[n] = 0;\r
73         int Pages = atoi(Buffer);\r
74 \r
75         return ((double) Pages * (double) PageSize)/1e6;\r
76         }\r
77 \r
78 void SaveCmdLine(int argc, char *argv[])\r
79         {\r
80         for (int i = 0; i < argc; ++i)\r
81                 {\r
82                 if (i > 0)\r
83                         strcat(szCmdLine, " ");\r
84                 strcat(szCmdLine, argv[i]);\r
85                 }\r
86         }\r
87 \r
88 double dPeakMemUseMB = 0;\r
89 \r
90 double GetPeakMemUseMB()\r
91         {\r
92         CheckMemUse();\r
93         return dPeakMemUseMB;\r
94         }\r
95 \r
96 double GetCPUGHz()\r
97         {\r
98         double dGHz = 2.5;\r
99         const char *e = getenv("CPUGHZ");\r
100         if (0 != e)\r
101                 dGHz = atof(e);\r
102         return dGHz;\r
103         }\r
104 \r
105 void CheckMemUse()\r
106         {\r
107         double dMB = GetMemUseMB();\r
108         if (dMB > dPeakMemUseMB)\r
109                 dPeakMemUseMB = dMB;\r
110         }\r
111 \r
112 double GetRAMSizeMB()\r
113         {\r
114         const double DEFAULT_RAM = 500;\r
115         static double RAMMB = 0;\r
116         if (RAMMB != 0)\r
117                 return RAMMB;\r
118 \r
119         int fd = open("/proc/meminfo", O_RDONLY);\r
120         if (-1 == fd)\r
121                 {\r
122                 static bool Warned = false;\r
123                 if (!Warned)\r
124                         {\r
125                         Warned = true;\r
126                         Warning("*Warning* Cannot open /proc/meminfo errno=%d %s",\r
127                           errno, strerror(errno));\r
128                         }\r
129                 return DEFAULT_RAM;\r
130                 }\r
131         char Buffer[1024];\r
132         int n = read(fd, Buffer, sizeof(Buffer) - 1);\r
133         close(fd);\r
134         fd = -1;\r
135 \r
136         if (n <= 0)\r
137                 {\r
138                 static bool Warned = false;\r
139                 if (!Warned)\r
140                         {\r
141                         Warned = true;\r
142                         Warning("*Warning* Cannot read /proc/meminfo errno=%d %s",\r
143                           errno, strerror(errno));\r
144                         }\r
145                 return DEFAULT_RAM;\r
146                 }\r
147         Buffer[n] = 0;\r
148         char *pMem = strstr(Buffer, "MemTotal: ");\r
149         if (0 == pMem)\r
150                 {\r
151                 static bool Warned = false;\r
152                 if (!Warned)\r
153                         {\r
154                         Warned = true;\r
155                         Warning("*Warning* 'MemTotal:' not found in /proc/meminfo");\r
156                         }\r
157                 return DEFAULT_RAM;\r
158                 }\r
159         int Bytes = atoi(pMem+9)*1000;\r
160         return ((double) Bytes)/1e6;\r
161         }\r
162 \r
163 #endif  // !WIN32\r