summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin/quuid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/plugin/quuid.cpp')
-rw-r--r--src/corelib/plugin/quuid.cpp67
1 files changed, 42 insertions, 25 deletions
diff --git a/src/corelib/plugin/quuid.cpp b/src/corelib/plugin/quuid.cpp
index 6c1b6e7..983d249 100644
--- a/src/corelib/plugin/quuid.cpp
+++ b/src/corelib/plugin/quuid.cpp
@@ -582,48 +582,65 @@ QT_BEGIN_INCLUDE_NAMESPACE
#include <stdlib.h> // for RAND_MAX
QT_END_INCLUDE_NAMESPACE
+#if !defined(QT_BOOTSTRAPPED) && defined(Q_OS_UNIX)
+Q_GLOBAL_STATIC(QThreadStorage<QFile *>, devUrandomStorage);
+#endif
+
QUuid QUuid::createUuid()
{
QUuid result;
uint *data = &(result.data1);
-#ifdef Q_OS_UNIX
- QFile devUrandom;
- devUrandom.setFileName(QLatin1String("/dev/urandom"));
- if (devUrandom.open(QIODevice::ReadOnly)) {
- qint64 numToRead = 4 * sizeof(uint);
- devUrandom.read((char *) data, numToRead); // should read 128-bits of data
+#if defined(Q_OS_UNIX)
+ QFile *devUrandom;
+# if !defined(QT_BOOTSTRAPPED)
+ devUrandom = devUrandomStorage()->localData();
+ if (!devUrandom) {
+ devUrandom = new QFile(QLatin1String("/dev/urandom"));
+ devUrandom->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
+ devUrandomStorage()->setLocalData(devUrandom);
+ }
+# else
+ QFile file(QLatin1String("/dev/urandom"));
+ devUrandom = &file;
+ devUrandom->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
+# endif
+ enum { AmountToRead = 4 * sizeof(uint) };
+ if (devUrandom->isOpen()
+ && devUrandom->read((char *) data, AmountToRead) == AmountToRead) {
+ // we got what we wanted, nothing more to do
+ ;
} else
#endif
{
static const int intbits = sizeof(int)*8;
static int randbits = 0;
if (!randbits) {
- int r = 0;
+ int r = 0;
int max = RAND_MAX;
do { ++r; } while ((max=max>>1));
randbits = r;
}
- // Seed the PRNG once per thread with a combination of current time, a
- // stack address and a serial counter (since thread stack addresses are
- // re-used).
+ // Seed the PRNG once per thread with a combination of current time, a
+ // stack address and a serial counter (since thread stack addresses are
+ // re-used).
#ifndef QT_BOOTSTRAPPED
- static QThreadStorage<int *> uuidseed;
- if (!uuidseed.hasLocalData())
- {
- int *pseed = new int;
- static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(2);
- qsrand(*pseed = QDateTime::currentDateTime().toTime_t()
- + quintptr(&pseed)
- + serial.fetchAndAddRelaxed(1));
- uuidseed.setLocalData(pseed);
- }
+ static QThreadStorage<int *> uuidseed;
+ if (!uuidseed.hasLocalData())
+ {
+ int *pseed = new int;
+ static QBasicAtomicInt serial = Q_BASIC_ATOMIC_INITIALIZER(2);
+ qsrand(*pseed = QDateTime::currentDateTime().toTime_t()
+ + quintptr(&pseed)
+ + serial.fetchAndAddRelaxed(1));
+ uuidseed.setLocalData(pseed);
+ }
#else
- static bool seeded = false;
- if (!seeded)
- qsrand(QDateTime::currentDateTime().toTime_t()
- + quintptr(&seeded));
+ static bool seeded = false;
+ if (!seeded)
+ qsrand(QDateTime::currentDateTime().toTime_t()
+ + quintptr(&seeded));
#endif
int chunks = 16 / sizeof(uint);
@@ -631,7 +648,7 @@ QUuid QUuid::createUuid()
uint randNumber = 0;
for (int filled = 0; filled < intbits; filled += randbits)
randNumber |= qrand()<<filled;
- *(data+chunks) = randNumber;
+ *(data+chunks) = randNumber;
}
}