mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
d9d9005a3a
This solves multiple problems. First, RB_VM_LOCK_ENTER/LEAVE is a barrier. We could at least use the _NO_BARRIER variant. Second, this doesn't need to interfere with GC or other GVL users when multiple Ractors are used. This needs to be used in very few places, so the benefit of fine-grained locking would outweigh its small maintenance cost. Third, it fixes a crash for YJIT. Because YJIT is never disabled until a process exits unlike MJIT that finishes earlier, we could call jit_cont_free when EC no longer exists, which crashes RB_VM_LOCK_ENTER.
29 lines
1.3 KiB
C
29 lines
1.3 KiB
C
#ifndef INTERNAL_CONT_H /*-*-C-*-vi:se ft=c:*/
|
|
#define INTERNAL_CONT_H
|
|
/**
|
|
* @author Ruby developers <ruby-core@ruby-lang.org>
|
|
* @copyright This file is a part of the programming language Ruby.
|
|
* Permission is hereby granted, to either redistribute and/or
|
|
* modify this file, provided that the conditions mentioned in the
|
|
* file COPYING are met. Consult the file for details.
|
|
* @brief Internal header for Fiber.
|
|
*/
|
|
#include "ruby/ruby.h" /* for VALUE */
|
|
#include "iseq.h"
|
|
|
|
struct rb_thread_struct; /* in vm_core.h */
|
|
struct rb_fiber_struct; /* in cont.c */
|
|
struct rb_execution_context_struct; /* in vm_core.c */
|
|
|
|
/* cont.c */
|
|
void rb_fiber_reset_root_local_storage(struct rb_thread_struct *);
|
|
void ruby_register_rollback_func_for_ensure(VALUE (*ensure_func)(VALUE), VALUE (*rollback_func)(VALUE));
|
|
void rb_jit_cont_init(void);
|
|
void rb_jit_cont_each_iseq(rb_iseq_callback callback, void *data);
|
|
void rb_jit_cont_finish(void);
|
|
|
|
VALUE rb_fiberptr_self(struct rb_fiber_struct *fiber);
|
|
unsigned int rb_fiberptr_blocking(struct rb_fiber_struct *fiber);
|
|
struct rb_execution_context_struct * rb_fiberptr_get_ec(struct rb_fiber_struct *fiber);
|
|
|
|
#endif /* INTERNAL_CONT_H */
|