rb_ext_ractor_safe() to declare ractor-safe ext

C extensions can violate the ractor-safety, so only ractor-safe
C extensions (C methods) can run on non-main ractors.
rb_ext_ractor_safe(true) declares that the successive
defined methods are ractor-safe. Otherwiwze, defined methods
checked they are invoked in main ractor and raise an error
if invoked at non-main ractors.

[Feature #17307]
This commit is contained in:
Koichi Sasada 2020-11-30 16:18:43 +09:00
parent 8247b8edde
commit 182fb73c40
Notes: git 2020-12-01 15:44:43 +09:00
7 changed files with 267 additions and 35 deletions

View file

@ -912,6 +912,10 @@ void rb_ec_initialize_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t
// @param ec the execution context to update.
void rb_ec_clear_vm_stack(rb_execution_context_t *ec);
struct rb_ext_config {
bool ractor_safe;
};
typedef struct rb_ractor_struct rb_ractor_t;
typedef struct rb_thread_struct {
@ -1000,6 +1004,8 @@ typedef struct rb_thread_struct {
/* misc */
VALUE name;
struct rb_ext_config ext_config;
#ifdef USE_SIGALTSTACK
void *altstack;
#endif
@ -1994,6 +2000,8 @@ extern void rb_reset_coverages(void);
void rb_postponed_job_flush(rb_vm_t *vm);
extern VALUE rb_eRactorUnsafeError; // ractor.c
RUBY_SYMBOL_EXPORT_END
#endif /* RUBY_VM_CORE_H */