1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

check multi_ractor mode at main_p

rb_ractor_main_p() need to access to the ractor pointer in TLS.
However it is slow operation so that we need to skip this check
if it is not multi-ractor mode (!ruby_multi_ractor).

This performance regression is pointed at
https://bugs.ruby-lang.org/issues/17100#note-27
This commit is contained in:
Koichi Sasada 2020-09-04 05:51:55 +09:00
parent 169b1d1aca
commit 3b0bcaf287
Notes: git 2020-09-04 14:19:14 +09:00
3 changed files with 26 additions and 6 deletions

View file

@ -15,9 +15,12 @@ static VALUE rb_eRactorMovedError;
static VALUE rb_eRactorClosedError;
static VALUE rb_cRactorMovedObject;
RUBY_SYMBOL_EXPORT_BEGIN
// to share with MJIT
bool ruby_multi_ractor;
static void vm_ractor_blocking_cnt_inc(rb_vm_t *vm, rb_ractor_t *r, const char *file, int line);
RUBY_SYMBOL_EXPORT_END
static void vm_ractor_blocking_cnt_inc(rb_vm_t *vm, rb_ractor_t *r, const char *file, int line);
static void
ASSERT_ractor_unlocking(rb_ractor_t *r)
@ -1423,9 +1426,10 @@ rb_ractor_self(const rb_ractor_t *r)
return r->self;
}
MJIT_FUNC_EXPORTED int
rb_ractor_main_p(void)
MJIT_FUNC_EXPORTED bool
rb_ractor_main_p_(void)
{
VM_ASSERT(rb_multi_ractor_p());
rb_execution_context_t *ec = GET_EC();
return rb_ec_ractor_ptr(ec) == rb_ec_vm_ptr(ec)->ractor.main_ractor;
}

View file

@ -1,5 +1,20 @@
#ifndef RACTOR_PUB_INCLUDED
#define RACTOR_PUB_INCLUDED
int rb_ractor_main_p(void);
RUBY_EXTERN bool ruby_multi_ractor;
bool rb_ractor_main_p_(void);
static inline bool
rb_ractor_main_p(void)
{
if (!ruby_multi_ractor) {
return true;
}
else {
return rb_ractor_main_p_();
}
}
bool rb_ractor_shareable_p_continue(VALUE obj);
@ -31,3 +46,5 @@ void rb_ractor_stdout_set(VALUE);
void rb_ractor_stderr_set(VALUE);
RUBY_SYMBOL_EXPORT_END
#endif

View file

@ -4,6 +4,7 @@
#include "vm_core.h"
#include "vm_debug.h"
#include "ractor_pub.h"
#if USE_RUBY_DEBUG_LOG
#define LOCATION_ARGS const char *file, int line
@ -26,8 +27,6 @@ void rb_vm_barrier(void);
void rb_vm_cond_wait(rb_vm_t *vm, rb_nativethread_cond_t *cond);
void rb_vm_cond_timedwait(rb_vm_t *vm, rb_nativethread_cond_t *cond, unsigned long msec);
extern bool ruby_multi_ractor;
static inline bool
rb_multi_ractor_p(void)
{