summaryrefslogtreecommitdiff
path: root/libcr_ipc
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2024-11-11 18:35:57 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2024-11-11 19:19:48 -0700
commitc08b86b1c07bc45c14393ed0d3e759faa89ea59b (patch)
tree21404cdc25798996acc2113d3ccc7806e28afdf5 /libcr_ipc
parent9f6f267cc4acb6c72872e42593ca701df1f5fdc3 (diff)
Factor out libmisc/rand.h
Diffstat (limited to 'libcr_ipc')
-rw-r--r--libcr_ipc/include/libcr_ipc/select.h13
1 files changed, 2 insertions, 11 deletions
diff --git a/libcr_ipc/include/libcr_ipc/select.h b/libcr_ipc/include/libcr_ipc/select.h
index ce14416..5e36a18 100644
--- a/libcr_ipc/include/libcr_ipc/select.h
+++ b/libcr_ipc/include/libcr_ipc/select.h
@@ -7,9 +7,9 @@
#include <alloca.h> /* for alloca() */
#include <stdarg.h> /* for va_* */
#include <stddef.h> /* for size_t */
-#include <stdlib.h> /* for random() */
#include <libmisc/assert.h>
+#include <libmisc/rand.h>
#include <libcr_ipc/chan.h>
@@ -69,15 +69,6 @@ struct cr_select_arg {
/* cr_select_v(arg_cnt, arg_vec) **********************************************/
-static inline size_t _cr_select_pickone(size_t cnt) {
- long fair_cnt = (0x80000000L / cnt) * cnt;
- long rnd;
- do {
- rnd = random();
- } while (rnd >= fair_cnt);
- return rnd % cnt;
-}
-
enum _cr_select_class {
_CR_SELECT_CLASS_DEFAULT,
_CR_SELECT_CLASS_BLOCKING,
@@ -140,7 +131,7 @@ static size_t cr_select_v(size_t arg_cnt, struct cr_select_arg arg_vec[]) {
}
if (cnt_nonblock) {
- size_t choice = _cr_select_pickone(cnt_nonblock);
+ size_t choice = rand_uint63n(cnt_nonblock);
for (size_t i = 0, seen = 0; i < arg_cnt; i++) {
if (_cr_select_getclass(arg_vec[i]) == _CR_SELECT_CLASS_NONBLOCK) {
if (seen == choice) {