summaryrefslogtreecommitdiff
path: root/lib/util/genrand_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/util/genrand_util.c')
-rw-r--r--lib/util/genrand_util.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/util/genrand_util.c b/lib/util/genrand_util.c
index 05d1f3ef6e5..26b52a1c814 100644
--- a/lib/util/genrand_util.c
+++ b/lib/util/genrand_util.c
@@ -47,7 +47,30 @@ _PUBLIC_ uint64_t generate_random_u64(void)
return BVAL(v, 0);
}
+static struct generate_unique_u64_state {
+ uint64_t next_value;
+ int pid;
+} generate_unique_u64_state;
+_PUBLIC_ uint64_t generate_unique_u64(uint64_t veto_value)
+{
+ int pid = getpid();
+
+ if (unlikely(pid != generate_unique_u64_state.pid)) {
+ generate_unique_u64_state = (struct generate_unique_u64_state) {
+ .pid = pid,
+ .next_value = veto_value,
+ };
+ }
+
+ while (unlikely(generate_unique_u64_state.next_value == veto_value)) {
+ generate_nonce_buffer(
+ (void *)&generate_unique_u64_state.next_value,
+ sizeof(generate_unique_u64_state.next_value));
+ }
+
+ return generate_unique_u64_state.next_value++;
+}
/**
Microsoft composed the following rules (among others) for quality