Mercurial > hg > svcore
diff system/System.cpp @ 168:04baa690f90d
* Start adding StorageAdviser class to determine whether caches should be
on disc or in memory
author | Chris Cannam |
---|---|
date | Mon, 25 Sep 2006 13:44:05 +0000 |
parents | 4b2ea82fd0ed |
children | 603991c63ff6 |
line wrap: on
line diff
--- a/system/System.cpp Fri Sep 22 16:46:10 2006 +0000 +++ b/system/System.cpp Mon Sep 25 13:44:05 2006 +0000 @@ -15,8 +15,14 @@ #include "System.h" +#include <QFile> +#include <QTextStream> +#include <QStringList> +#include <QString> + #ifndef _WIN32 #include <signal.h> +#include <sys/statvfs.h> #endif #include <iostream> @@ -70,6 +76,62 @@ #endif } +int +GetRealMemoryMBAvailable() +{ + // ugh + QFile meminfo("/proc/meminfo"); + if (meminfo.open(QFile::ReadOnly)) { + std::cerr << "opened meminfo" << std::endl; + QTextStream in(&meminfo); + while (!in.atEnd()) { + QString line = in.readLine(256); + std::cerr << "read: \"" << line.toStdString() << "\"" << std::endl; + if (line.startsWith("MemFree:")) { + QStringList elements = line.split(' ', QString::SkipEmptyParts); + QString unit = "kB"; + if (elements.size() > 2) unit = elements[2]; + int size = elements[1].toInt(); + std::cerr << "have size \"" << size << "\", unit \"" + << unit.toStdString() << "\"" << std::endl; + if (unit.toLower() == "gb") return size * 1024; + if (unit.toLower() == "mb") return size; + if (unit.toLower() == "kb") return size / 1024; + return size / 1048576; + } + } + } + return -1; +} + +int +GetDiscSpaceMBAvailable(const char *path) +{ +#ifdef _WIN32 + __int64 available, total, totalFree; + if (GetDiskFreeSpaceEx(path, &available, &total, &totalFree)) { + available /= 1048576; + return int(available); + } else { + std::cerr << "WARNING: GetDiskFreeSpaceEx failed: error code " + << GetLastError() << std::endl; + return -1; + } +#else + struct statvfs buf; + if (!statvfs(path, &buf)) { + // do the multiplies and divides in this order to reduce the + // likelihood of arithmetic overflow + std::cerr << "statvfs(" << path << ") says available: " << buf.f_bavail << ", block size: " << buf.f_bsize << std::endl; + return ((buf.f_bavail / 1024) * buf.f_bsize) / 1024; + } else { + perror("statvfs failed"); + return -1; + } +#endif +} + + double mod(double x, double y) { return x - (y * floor(x / y)); } float modf(float x, float y) { return x - (y * floorf(x / y)); }