summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2011-06-15 20:41:15 -0700
committerAlex Ray <aray@google.com>2013-07-30 13:56:57 -0700
commit967ad860da30d09c2003274389cb53abe165b6cc (patch)
tree6ad64c4c8be1d7e9889a3101d9f0116cc779d22e
parent9c8fa9ed4111c69c82ace01c8a7ac3beeacdce78 (diff)
downloadsystem_core-967ad860da30d09c2003274389cb53abe165b6cc.tar.gz
system_core-967ad860da30d09c2003274389cb53abe165b6cc.tar.bz2
system_core-967ad860da30d09c2003274389cb53abe165b6cc.zip
Use rand() for MinGW
The version of MinGW we use doesn't have nrand48() which is really lame, but we need to use libutils in the Windows SDK. Change-Id: If854c03dbf02bc29e79f49e4539f08c2bf057517
-rw-r--r--include/utils/BlobCache.h3
-rw-r--r--libs/utils/BlobCache.cpp14
2 files changed, 16 insertions, 1 deletions
diff --git a/include/utils/BlobCache.h b/include/utils/BlobCache.h
index 8f76d72c1..dc45ff0f3 100644
--- a/include/utils/BlobCache.h
+++ b/include/utils/BlobCache.h
@@ -82,6 +82,9 @@ private:
BlobCache(const BlobCache&);
void operator=(const BlobCache&);
+ // A random function helper to get around MinGW not having nrand48()
+ long int blob_random();
+
// clean evicts a randomly chosen set of entries from the cache such that
// the total size of all remaining entries is less than mMaxTotalSize/2.
void clean();
diff --git a/libs/utils/BlobCache.cpp b/libs/utils/BlobCache.cpp
index 1298fa733..590576a8d 100644
--- a/libs/utils/BlobCache.cpp
+++ b/libs/utils/BlobCache.cpp
@@ -31,9 +31,13 @@ BlobCache::BlobCache(size_t maxKeySize, size_t maxValueSize, size_t maxTotalSize
mMaxTotalSize(maxTotalSize),
mTotalSize(0) {
nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
+#ifdef _WIN32
+ srand(now);
+#else
mRandState[0] = (now >> 0) & 0xFFFF;
mRandState[1] = (now >> 16) & 0xFFFF;
mRandState[2] = (now >> 32) & 0xFFFF;
+#endif
LOGV("initializing random seed using %lld", now);
}
@@ -148,11 +152,19 @@ size_t BlobCache::get(const void* key, size_t keySize, void* value,
return valueBlobSize;
}
+long int BlobCache::blob_random() {
+#ifdef _WIN32
+ return rand();
+#else
+ return nrand48(mRandState);
+#endif
+}
+
void BlobCache::clean() {
// Remove a random cache entry until the total cache size gets below half
// the maximum total cache size.
while (mTotalSize > mMaxTotalSize / 2) {
- size_t i = size_t(nrand48(mRandState) % (mCacheEntries.size()));
+ size_t i = size_t(blob_random() % (mCacheEntries.size()));
const CacheEntry& entry(mCacheEntries[i]);
mTotalSize -= entry.getKey()->getSize() + entry.getValue()->getSize();
mCacheEntries.removeAt(i);