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
This commit is contained in:
Kenny Root 2011-06-15 20:41:15 -07:00
parent ef89038109
commit 111280a8de
2 changed files with 16 additions and 1 deletions

View File

@ -82,6 +82,9 @@ private:
BlobCache(const BlobCache&); BlobCache(const BlobCache&);
void operator=(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 // 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. // the total size of all remaining entries is less than mMaxTotalSize/2.
void clean(); void clean();

View File

@ -31,9 +31,13 @@ BlobCache::BlobCache(size_t maxKeySize, size_t maxValueSize, size_t maxTotalSize
mMaxTotalSize(maxTotalSize), mMaxTotalSize(maxTotalSize),
mTotalSize(0) { mTotalSize(0) {
nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
#ifdef _WIN32
srand(now);
#else
mRandState[0] = (now >> 0) & 0xFFFF; mRandState[0] = (now >> 0) & 0xFFFF;
mRandState[1] = (now >> 16) & 0xFFFF; mRandState[1] = (now >> 16) & 0xFFFF;
mRandState[2] = (now >> 32) & 0xFFFF; mRandState[2] = (now >> 32) & 0xFFFF;
#endif
LOGV("initializing random seed using %lld", now); 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; return valueBlobSize;
} }
long int BlobCache::blob_random() {
#ifdef _WIN32
return rand();
#else
return nrand48(mRandState);
#endif
}
void BlobCache::clean() { void BlobCache::clean() {
// Remove a random cache entry until the total cache size gets below half // Remove a random cache entry until the total cache size gets below half
// the maximum total cache size. // the maximum total cache size.
while (mTotalSize > mMaxTotalSize / 2) { 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]); const CacheEntry& entry(mCacheEntries[i]);
mTotalSize -= entry.getKey()->getSize() + entry.getValue()->getSize(); mTotalSize -= entry.getKey()->getSize() + entry.getValue()->getSize();
mCacheEntries.removeAt(i); mCacheEntries.removeAt(i);