mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-14 23:29:51 +00:00
[Support] Rewrite sys::fs::unique_file to not be stupid with /dev/urandom.
- Just use sys::Process::GetRandomNumber instead of having two poor implementations. - This is ~70 times (!) faster on my OS X machine. llvm-svn: 156238
This commit is contained in:
parent
457eab2ad7
commit
6fbad750f3
@ -17,6 +17,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "Unix.h"
|
||||
#include "llvm/Support/Process.h"
|
||||
#if HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
@ -367,32 +368,17 @@ error_code unique_file(const Twine &model, int &result_fd,
|
||||
|
||||
// Replace '%' with random chars. From here on, DO NOT modify model. It may be
|
||||
// needed if the randomly chosen path already exists.
|
||||
SmallString<128> RandomPath;
|
||||
RandomPath.reserve(Model.size() + 1);
|
||||
::srand(::time(NULL));
|
||||
SmallString<128> RandomPath = Model;
|
||||
|
||||
retry_random_path:
|
||||
// This is opened here instead of above to make it easier to track when to
|
||||
// close it. Collisions should be rare enough for the possible extra syscalls
|
||||
// not to matter.
|
||||
FILE *RandomSource = ::fopen("/dev/urandom", "r");
|
||||
RandomPath.set_size(0);
|
||||
for (SmallVectorImpl<char>::const_iterator i = Model.begin(),
|
||||
e = Model.end(); i != e; ++i) {
|
||||
if (*i == '%') {
|
||||
char val = 0;
|
||||
if (RandomSource)
|
||||
val = fgetc(RandomSource);
|
||||
else
|
||||
val = ::rand();
|
||||
RandomPath.push_back("0123456789abcdef"[val & 15]);
|
||||
} else
|
||||
RandomPath.push_back(*i);
|
||||
for (unsigned i = 0, e = Model.size(); i != e; ++i) {
|
||||
if (Model[i] == '%')
|
||||
RandomPath[i] = "0123456789abcdef"[sys::Process::GetRandomNumber() & 15];
|
||||
}
|
||||
|
||||
if (RandomSource)
|
||||
::fclose(RandomSource);
|
||||
|
||||
// Try to open + create the file.
|
||||
rety_open_create:
|
||||
int RandomFD = ::open(RandomPath.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||
|
Loading…
Reference in New Issue
Block a user