summaryrefslogtreecommitdiff
path: root/runtime/utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/utils.cc')
-rw-r--r--runtime/utils.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/runtime/utils.cc b/runtime/utils.cc
index 68db7e3a73..7da56403e5 100644
--- a/runtime/utils.cc
+++ b/runtime/utils.cc
@@ -18,12 +18,14 @@
#include <inttypes.h>
#include <pthread.h>
+#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <memory>
+#include <random>
#include "art_field-inl.h"
#include "art_method-inl.h"
@@ -60,6 +62,26 @@ namespace art {
static constexpr bool kUseAddr2line = !kIsTargetBuild;
#endif
+#if defined(__BIONIC__)
+struct Arc4RandomGenerator {
+ typedef uint32_t result_type;
+ uint32_t min() { return std::numeric_limits<uint32_t>::min(); }
+ uint32_t max() { return std::numeric_limits<uint32_t>::max(); }
+ uint32_t operator() { return arc4random(); }
+};
+using RNG = Arc4RandomGenerator;
+#else
+using RNG = std::random_device;
+#endif
+
+template <typename T>
+T GetRandomNumber(T min, T max) {
+ CHECK_LT(min, max);
+ std::uniform_int_distribution<T> dist(min, max);
+ RNG rng;
+ return dist(rng);
+}
+
pid_t GetTid() {
#if defined(__APPLE__)
uint64_t owner;