Android: Avoid re-creating Random objects.

We where re-creating a Java Random object each time the seed was set,
this causes unnecessary overhead as the old objects becomes  subject
for garbage collection.

Change-Id: I7aa48f5380f86d6c0d57eaeadc71b9b2b146034d
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
bb10
Christian Strømme 2013-10-24 16:47:32 +02:00 committed by The Qt Project
parent 48dcdbe510
commit 159f086a7f
1 changed files with 20 additions and 14 deletions

View File

@ -2410,9 +2410,14 @@ void qsrand(uint seed)
srand(seed);
}
#elif defined(Q_OS_ANDROID)
QJNIObjectPrivate random = QJNIObjectPrivate("java/util/Random",
"(J)V",
jlong(seed));
if (randomTLS->hasLocalData()) {
randomTLS->localData().callMethod<void>("setSeed", "(J)V", jlong(seed));
return;
}
QJNIObjectPrivate random("java/util/Random",
"(J)V",
jlong(seed));
if (!random.isValid()) {
srand(seed);
return;
@ -2465,19 +2470,20 @@ int qrand()
if (!randomStorage)
return rand();
QJNIObjectPrivate random;
if (!randomStorage->hasLocalData()) {
random = QJNIObjectPrivate("java/util/Random",
"(J)V",
jlong(1));
if (!random.isValid())
return rand();
randomStorage->setLocalData(random);
} else {
random = randomStorage->localData();
if (randomStorage->hasLocalData()) {
return randomStorage->localData().callMethod<jint>("nextInt",
"(I)I",
RAND_MAX);
}
QJNIObjectPrivate random("java/util/Random",
"(J)V",
jlong(1));
if (!random.isValid())
return rand();
randomStorage->setLocalData(random);
return random.callMethod<jint>("nextInt", "(I)I", RAND_MAX);
#else
// On Windows srand() and rand() already use Thread-Local-Storage