Ruby: internal/thread.h Source File

Ruby 4.0.5p0 (2026-05-20 revision 64336ffd0ee9e1f4c05891695a3d7b49cb709721)

thread.h
1#ifndef INTERNAL_THREAD_H /*-*-C-*-vi:se ft=c:*/
2#define INTERNAL_THREAD_H
11#include "ruby/ruby.h" /* for VALUE */
12#include "ruby/intern.h" /* for rb_blocking_function_t */
13#include "ccan/list/list.h" /* for list in rb_io_close_wait_list */
14
15struct rb_thread_struct; /* in vm_core.h */
16struct rb_io;
17
18#define RB_VM_SAVE_MACHINE_CONTEXT(th) \
19 do { \
20 FLUSH_REGISTER_WINDOWS; \
21 setjmp((th)->ec->machine.regs); \
22 SET_MACHINE_STACK_END(&(th)->ec->machine.stack_end); \
23 } while (0)
24
25/* thread.c */
26#define COVERAGE_INDEX_LINES 0
27#define COVERAGE_INDEX_BRANCHES 1
28#define COVERAGE_TARGET_LINES 1
29#define COVERAGE_TARGET_BRANCHES 2
30#define COVERAGE_TARGET_METHODS 4
31#define COVERAGE_TARGET_ONESHOT_LINES 8
32#define COVERAGE_TARGET_EVAL 16
33
34#define RUBY_FATAL_THREAD_KILLED INT2FIX(0)
35#define RUBY_FATAL_THREAD_TERMINATED INT2FIX(1)
36#define RUBY_FATAL_FIBER_KILLED RB_INT2FIX(2)
37
38 VALUE rb_obj_is_mutex(VALUE obj);
39 VALUE rb_suppress_tracing(VALUE (*func)(VALUE), VALUE arg);
40void rb_thread_execute_interrupts(VALUE th);
41 VALUE rb_get_coverages(void);
42int rb_get_coverage_mode(void);
43 VALUE rb_default_coverage(int);
44 VALUE rb_thread_shield_new(void);
45bool rb_thread_shield_owned(VALUE self);
46 VALUE rb_thread_shield_wait(VALUE self);
47 VALUE rb_thread_shield_release(VALUE self);
48 VALUE rb_thread_shield_destroy(VALUE self);
49int rb_thread_to_be_killed(VALUE thread);
50void rb_thread_acquire_fork_lock(void);
51void rb_thread_release_fork_lock(void);
52void rb_thread_reset_fork_lock(void);
53void rb_mutex_allow_trap(VALUE self, int val);
54 VALUE rb_uninterruptible(VALUE (*b_proc)(VALUE), VALUE data);
55 VALUE rb_mutex_owned_p(VALUE self);
56 VALUE rb_exec_recursive_outer_mid(VALUE (*f)(VALUE g, VALUE h, int r), VALUE g, VALUE h, ID mid);
57void ruby_mn_threads_params(void);
58
59int rb_thread_io_wait(struct rb_thread_struct *th, struct rb_io *io, int events, struct timeval * timeout);
60int rb_thread_wait_for_single_fd(struct rb_thread_struct *th, int fd, int events, struct timeval * timeout);
61
62size_t rb_thread_io_close_interrupt(struct rb_io *);
63void rb_thread_io_close_wait(struct rb_io *);
64
65void rb_ec_check_ints(struct rb_execution_context_struct *ec);
66
67void rb_thread_free_native_thread(void *th_ptr);
68
69RUBY_SYMBOL_EXPORT_BEGIN
70
71void *rb_thread_prevent_fork(void *(*func)(void *), void *data); /* for ext/socket/raddrinfo.c */
72
73/* Temporary. This API will be removed (renamed). */
74 VALUE rb_thread_io_blocking_region(struct rb_io *io, rb_blocking_function_t *func, void *data1);
75 VALUE rb_thread_io_blocking_call(struct rb_io *io, rb_blocking_function_t *func, void *data1, int events);
76
77// Invoke the given function, with the specified argument, in a way that `IO#close` from another execution context can interrupt it.
78 VALUE rb_thread_io_blocking_operation(VALUE self, VALUE(*function)(VALUE), VALUE argument);
79
80/* thread.c (export) */
81int ruby_thread_has_gvl_p(void); /* for ext/fiddle/closure.c */
82
83RUBY_SYMBOL_EXPORT_END
84
85int rb_threadptr_execute_interrupts(struct rb_thread_struct *th, int blocking_timing);
86bool rb_thread_mn_schedulable(VALUE thread);
87
88bool rb_thread_resolve_unblock_function(rb_unblock_function_t **unblock_function, void **data2, struct rb_thread_struct *thread);
89
90// interrupt exec
91
92typedef VALUE (rb_interrupt_exec_func_t)(void *data);
93
94enum rb_interrupt_exec_flag {
95 rb_interrupt_exec_flag_none = 0x00,
96 rb_interrupt_exec_flag_value_data = 0x01,
97 rb_interrupt_exec_flag_new_thread = 0x02,
98};
99
100// interrupt the target_th and run func.
101struct rb_ractor_struct;
102
103void rb_threadptr_interrupt_exec(struct rb_thread_struct *target_th,
104 rb_interrupt_exec_func_t *func, void *data, enum rb_interrupt_exec_flag flags);
105
106// create a thread in the target_r and run func on the created thread.
107void rb_ractor_interrupt_exec(struct rb_ractor_struct *target_r,
108 rb_interrupt_exec_func_t *func, void *data, enum rb_interrupt_exec_flag flags);
109
110void rb_threadptr_interrupt_exec_task_mark(struct rb_thread_struct *th);
111
112#endif /* INTERNAL_THREAD_H */
rb_unblock_function_t
void rb_unblock_function_t(void *)
This is the type of UBFs.
Definition thread.h:336
ruby_thread_has_gvl_p
int ruby_thread_has_gvl_p(void)
Whether the current thread is holding the GVL.
Definition thread.c:2103
intern.h
ruby.h
rb_execution_context_struct
Definition vm_core.h:1033
rb_io
Ruby's IO, metadata and buffers.
Definition io.h:295
rb_io::self
VALUE self
The IO's Ruby level counterpart.
Definition io.h:298
rb_io::timeout
VALUE timeout
The timeout associated with this IO when performing blocking operations.
Definition io.h:406
rb_io::fd
int fd
file descriptor.
Definition io.h:306
rb_ractor_struct
Definition ractor_core.h:68
rb_thread_struct
Definition vm_core.h:1130
timeval
Definition missing.h:63
ID
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.
Definition value.h:52
VALUE
uintptr_t VALUE
Type that represents a Ruby object.
Definition value.h:40