--- /dev/null
+#include "muscle.h"\r
+\r
+#if defined(__linux__)\r
+#include <sys/time.h>\r
+#include <sys/resource.h>\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <stdio.h>\r
+#include <fcntl.h>\r
+\r
+const int ONE_MB = 1000000;\r
+const int MEM_WARNING_THRESHOLD = 20*ONE_MB;\r
+\r
+double GetNAN()\r
+ {\r
+ static unsigned long nan[2]={0xffffffff, 0x7fffffff};\r
+ double dNAN = *( double* )nan;\r
+ return dNAN;\r
+ }\r
+\r
+double g_dNAN = GetNAN();\r
+\r
+void chkmem(const char szMsg[])\r
+ {\r
+ //assert(_CrtCheckMemory());\r
+ }\r
+\r
+void Break()\r
+ {\r
+ //DebugBreak();\r
+ }\r
+\r
+static char szCmdLine[4096];\r
+\r
+void *ptrStartBreak = sbrk(0);\r
+\r
+const char *GetCmdLine()\r
+ {\r
+ return szCmdLine;\r
+ }\r
+\r
+double GetMemUseMB()\r
+ {\r
+ static char statm[64];\r
+ static int PageSize;\r
+ if (0 == statm[0])\r
+ {\r
+ PageSize = sysconf(_SC_PAGESIZE);\r
+ pid_t pid = getpid();\r
+ sprintf(statm, "/proc/%d/statm", (int) pid);\r
+ }\r
+\r
+ int fd = open(statm, O_RDONLY);\r
+ if (-1 == fd)\r
+ return -1;\r
+ char Buffer[64];\r
+ int n = read(fd, Buffer, sizeof(Buffer) - 1);\r
+ close(fd);\r
+ fd = -1;\r
+\r
+ if (n <= 0)\r
+ {\r
+ static bool Warned = false;\r
+ if (!Warned)\r
+ {\r
+ Warned = true;\r
+ Warning("*Warning* Cannot read %s errno=%d %s",\r
+ statm, errno, strerror(errno));\r
+ }\r
+ return 0;\r
+ }\r
+ Buffer[n] = 0;\r
+ int Pages = atoi(Buffer);\r
+\r
+ return ((double) Pages * (double) PageSize)/1e6;\r
+ }\r
+\r
+void SaveCmdLine(int argc, char *argv[])\r
+ {\r
+ for (int i = 0; i < argc; ++i)\r
+ {\r
+ if (i > 0)\r
+ strcat(szCmdLine, " ");\r
+ strcat(szCmdLine, argv[i]);\r
+ }\r
+ }\r
+\r
+double dPeakMemUseMB = 0;\r
+\r
+double GetPeakMemUseMB()\r
+ {\r
+ CheckMemUse();\r
+ return dPeakMemUseMB;\r
+ }\r
+\r
+double GetCPUGHz()\r
+ {\r
+ double dGHz = 2.5;\r
+ const char *e = getenv("CPUGHZ");\r
+ if (0 != e)\r
+ dGHz = atof(e);\r
+ return dGHz;\r
+ }\r
+\r
+void CheckMemUse()\r
+ {\r
+ double dMB = GetMemUseMB();\r
+ if (dMB > dPeakMemUseMB)\r
+ dPeakMemUseMB = dMB;\r
+ }\r
+\r
+double GetRAMSizeMB()\r
+ {\r
+ const double DEFAULT_RAM = 500;\r
+ static double RAMMB = 0;\r
+ if (RAMMB != 0)\r
+ return RAMMB;\r
+\r
+ int fd = open("/proc/meminfo", O_RDONLY);\r
+ if (-1 == fd)\r
+ {\r
+ static bool Warned = false;\r
+ if (!Warned)\r
+ {\r
+ Warned = true;\r
+ Warning("*Warning* Cannot open /proc/meminfo errno=%d %s",\r
+ errno, strerror(errno));\r
+ }\r
+ return DEFAULT_RAM;\r
+ }\r
+ char Buffer[1024];\r
+ int n = read(fd, Buffer, sizeof(Buffer) - 1);\r
+ close(fd);\r
+ fd = -1;\r
+\r
+ if (n <= 0)\r
+ {\r
+ static bool Warned = false;\r
+ if (!Warned)\r
+ {\r
+ Warned = true;\r
+ Warning("*Warning* Cannot read /proc/meminfo errno=%d %s",\r
+ errno, strerror(errno));\r
+ }\r
+ return DEFAULT_RAM;\r
+ }\r
+ Buffer[n] = 0;\r
+ char *pMem = strstr(Buffer, "MemTotal: ");\r
+ if (0 == pMem)\r
+ {\r
+ static bool Warned = false;\r
+ if (!Warned)\r
+ {\r
+ Warned = true;\r
+ Warning("*Warning* 'MemTotal:' not found in /proc/meminfo");\r
+ }\r
+ return DEFAULT_RAM;\r
+ }\r
+ int Bytes = atoi(pMem+9)*1000;\r
+ return ((double) Bytes)/1e6;\r
+ }\r
+\r
+#endif // !WIN32\r