summaryrefslogtreecommitdiff
path: root/random.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-11-28 04:39:09 +0900
committerKoichi Sasada <ko1@atdot.net>2020-12-01 09:39:30 +0900
commit67693d8d806e67d6e50b303dd0be6ec06b81c853 (patch)
treeb0947049393400f046ac554b7f3573cd73b80af0 /random.c
parente79f1941b29738d95b42f8cb5bdb159e7138cf49 (diff)
ractor local storage C-API
To manage ractor-local data for C extension, the following APIs are defined. * rb_ractor_local_storage_value_newkey * rb_ractor_local_storage_value * rb_ractor_local_storage_value_set * rb_ractor_local_storage_ptr_newkey * rb_ractor_local_storage_ptr * rb_ractor_local_storage_ptr_set At first, you need to create a key of storage by rb_ractor_local_(value|ptr)_newkey(). For ptr storage, it accepts the type of storage, how to mark and how to free with ractor's lifetime. rb_ractor_local_storage_value/set are used to access a VALUE and rb_ractor_local_storage_ptr/set are used to access a pointer. random.c uses this API.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3822
Diffstat (limited to 'random.c')
-rw-r--r--random.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/random.c b/random.c
index 6b26e2b..79210fe 100644
--- a/random.c
+++ b/random.c
@@ -63,6 +63,7 @@
#include "internal/sanitizers.h"
#include "ruby_atomic.h"
#include "ruby/random.h"
+#include "ruby/ractor.h"
typedef int int_must_be_32bit_at_least[sizeof(int) * CHAR_BIT < 32 ? -1 : 1];
@@ -146,23 +147,31 @@ rand_start(rb_random_mt_t *r)
return &rand_mt_start(r)->base;
}
+static rb_ractor_local_key_t default_rand_key;
+
+static void
+default_rand_mark(void *ptr)
+{
+ rb_random_mt_t *rnd = (rb_random_mt_t *)ptr;
+ rb_gc_mark(rnd->base.seed);
+}
+
+static const struct rb_ractor_local_storage_type default_rand_key_storage_type = {
+ default_rand_mark,
+ ruby_xfree,
+};
+
static rb_random_mt_t *
default_rand(void)
{
- rb_random_t *rb_ractor_default_rand(rb_random_t *); // ractor.c
- rb_random_mt_t *rnd = (rb_random_mt_t *)rb_ractor_default_rand(NULL);
- if (rnd == NULL) {
+ rb_random_mt_t *rnd;
+
+ if ((rnd = rb_ractor_local_storage_ptr(default_rand_key)) == NULL) {
rnd = ZALLOC(rb_random_mt_t);
- rb_ractor_default_rand(&rnd->base);
+ rb_ractor_local_storage_ptr_set(default_rand_key, rnd);
}
- return rnd;
-}
-void
-rb_default_rand_mark(void *ptr)
-{
- rb_random_mt_t *rnd = (rb_random_mt_t *)ptr;
- rb_gc_mark(rnd->base.seed);
+ return rnd;
}
static rb_random_mt_t *
@@ -1727,6 +1736,8 @@ InitVM_Random(void)
rb_define_method(m, "random_number", rand_random_number, -1);
rb_define_method(m, "rand", rand_random_number, -1);
}
+
+ default_rand_key = rb_ractor_local_storage_ptr_newkey(&default_rand_key_storage_type);
}
#undef rb_intern