Ruby 3.4.5p51 (2025-07-16 revision 20cda200d3ce092571d0b5d342dadca69636cb0f)
|
#include "ruby/internal/config.h"
#include <stdarg.h>
#include "defines.h"
#include "ruby/internal/abi.h"
#include "ruby/internal/anyargs.h"
#include "ruby/internal/arithmetic.h"
#include "ruby/internal/core.h"
#include "ruby/internal/ctype.h"
#include "ruby/internal/dllexport.h"
#include "ruby/internal/error.h"
#include "ruby/internal/eval.h"
#include "ruby/internal/event.h"
#include "ruby/internal/fl_type.h"
#include "ruby/internal/gc.h"
#include "ruby/internal/glob.h"
#include "ruby/internal/globals.h"
#include "ruby/internal/has/warning.h"
#include "ruby/internal/interpreter.h"
#include "ruby/internal/iterator.h"
#include "ruby/internal/memory.h"
#include "ruby/internal/method.h"
#include "ruby/internal/module.h"
#include "ruby/internal/newobj.h"
#include "ruby/internal/scan_args.h"
#include "ruby/internal/special_consts.h"
#include "ruby/internal/symbol.h"
#include "ruby/internal/value.h"
#include "ruby/internal/value_type.h"
#include "ruby/internal/variable.h"
#include "ruby/assert.h"
#include "ruby/backward/2/assume.h"
#include "ruby/backward/2/inttypes.h"
#include "ruby/backward/2/limits.h"
#include "ruby/intern.h"
#include <errno.h>
#include "ruby/subst.h"
#include "ruby/backward.h"
Go to the source code of this file.
Macros | |
#define | USE_SYMBOL_AS_METHOD_NAME 1 |
#define | FilePathValue(v) |
Ensures that the parameter object is a path. | |
#define | FilePathStringValue(v) |
This macro actually does the same thing as FilePathValue now. | |
#define | RUBY_VM 1 /* YARV */ |
#define | HAVE_NATIVETHREAD |
#define | InitVM(ext) |
This macro is for internal use. |
Functions | |
VALUE | rb_get_path (VALUE obj) |
Converts an object to a path. | |
VALUE | rb_get_path_no_checksafe (VALUE) |
const char * | rb_class2name (VALUE klass) |
Queries the name of the passed class. | |
const char * | rb_obj_classname (VALUE obj) |
Queries the name of the class of the passed object. | |
void | rb_p (VALUE obj) |
Inspects an object. | |
VALUE | rb_equal (VALUE lhs, VALUE rhs) |
This function is an optimised version of calling #==. | |
VALUE | rb_require (const char *feature) |
Identical to rb_require_string(), except it takes C's string instead of Ruby's. | |
int | ruby_native_thread_p (void) |
Queries if the thread which calls this function is a ruby's thread. | |
int | ruby_snprintf (char *str, size_t n, char const *fmt,...) |
Our own locale-insensitive version of snprintf(3). | |
int | ruby_vsnprintf (char *str, size_t n, char const *fmt, va_list ap) |
Identical to ruby_snprintf(), except it takes a va_list. |
Errno handling routines for userland threads | |
Soooo this #define errno below seems like a noob mistake at first sight. If you look at its actual implementation, the functions are just adding one level of indirection. It doesn't make any sense sorry? But yes! @ko1 told @shyouhei that this is inevitable. The ultimate reason is because Ruby now has N:M threads implemented. Threads of that sort change their context in user land. A function can be "transferred" between threads in middle of their executions. Let us for instance consider: This function (if ran under our Ractor) could change its running thread at the close function. But the two errno invocations are different! Look how the source code above is compiled by clang 17 with -O3 flag @ Linux: foo(int): # @foo(int)
push rbp
push r14
push rbx
mov ebx, edi
call __errno_location@PLT
mov r14, rax
mov ebp, dword ptr [rax]
mov edi, ebx
call close@PLT
mov dword ptr [r14], ebp
pop rbx
pop r14
pop rbp
ret
Notice how __errno_location@PLT is call-ed only once. The compiler assumes that the location of errno does not change during a function call. Sadly this is no longer true for us. The close@PLT now changes threads, which should also change where errno is stored. With the #define errno below the compilation result changes to this: foo(int): # @foo(int)
push rbp
push rbx
push rax
mov ebx, edi
call rb_errno_ptr()@PLT
mov ebp, dword ptr [rax]
mov edi, ebx
call close@PLT
call rb_errno_ptr()@PLT
mov dword ptr [rax], ebp
add rsp, 8
pop rbx
pop rbp
ret
Which fixes the problem. | |
#define | rb_orig_errno errno |
System-provided original errno. | |
#define | errno (*rb_errno_ptr()) |
Ractor-aware version of errno. | |
int | rb_errno (void) |
Identical to system errno. | |
void | rb_errno_set (int err) |
Set the errno. | |
int * | rb_errno_ptr (void) |
The location of errno | |
static int * | rb_orig_errno_ptr (void) |
Not sure if it is necessary for extension libraries but this is where the "bare" errno is located. |
Definition in file ruby.h.
#define errno (*rb_errno_ptr()) |
Ractor-aware version of errno.
Definition at line 388 of file ruby.h.
Referenced by pm_pack_parse(), rb_cloexec_dup2(), rb_cloexec_fcntl_dupfd(), rb_cloexec_open(), rb_cloexec_pipe(), rb_fiber_scheduler_io_result_apply(), rb_fiber_scheduler_unblock(), rb_io_wait_readable(), rb_io_wait_writable(), rb_orig_errno_ptr(), rb_proc_exec(), rb_readwrite_sys_fail(), rb_sys_warning(), rb_update_max_fd(), rb_waitpid(), ruby_getcwd(), and ruby_strtoul().
#define FilePathStringValue | ( | v | ) |
This macro actually does the same thing as FilePathValue now.
The "String" part indicates that this is for when a string is treated like a pathname, rather than the actual pathname on the file systems. For examples: Dir.fnmatch?, File.join, File.basename, etc.
#define FilePathValue | ( | v | ) |
Ensures that the parameter object is a path.
[in,out] | v | Arbitrary ruby object. |
rb_eArgError | `v` contains a NUL byte. |
rb_eTypeError | `v` is not path-ish. |
rb_eEncCompatError | `v` is not path-compatible. |
Definition at line 90 of file ruby.h.
Referenced by rb_file_open_str(), rb_load(), and rb_require_string().
#define HAVE_NATIVETHREAD |
#define InitVM | ( | ext | ) |
#define RUBY_VM 1 /* YARV */ |
#define USE_SYMBOL_AS_METHOD_NAME 1 |
const char * rb_class2name | ( | VALUE | klass | ) |
Queries the name of the passed class.
[in] | klass | An instance of a class. |
Definition at line 498 of file variable.c.
Referenced by rb_class2name(), rb_obj_classname(), and rb_profile_frame_classpath().
int rb_errno | ( | void | ) |
Identical to system errno.
Definition at line 2170 of file eval.c.
Referenced by rb_nogvl().
int * rb_errno_ptr | ( | void | ) |
void rb_errno_set | ( | int | err | ) |
Converts an object to a path.
It first tries #to_path method if any, then falls back to #to_str method.
[in] | obj | Arbitrary ruby object. |
rb_eArgError | `obj` contains a NUL byte. |
rb_eTypeError | `obj` is not path-ish. |
rb_eEncCompatError | No encoding conversion from `obj` to path. |
const char * rb_obj_classname | ( | VALUE | obj | ) |
Queries the name of the class of the passed object.
[in] | obj | Arbitrary ruby object. |
Definition at line 507 of file variable.c.
Referenced by rb_Hash(), and rb_obj_classname().
|
inlinestatic |
Not sure if it is necessary for extension libraries but this is where the "bare" errno is located.
Definition at line 381 of file ruby.h.
Referenced by rb_errno(), rb_errno_ptr(), and rb_errno_set().
void rb_p | ( | VALUE | obj | ) |
VALUE rb_require | ( | const char * | feature | ) |
Identical to rb_require_string(), except it takes C's string instead of Ruby's.
[in] | feature | Name of a feature, e.g. "json". |
rb_eLoadError | No such feature. |
rb_eRuntimeError | `$"` is frozen; unable to push. @retval RUBY_Qtrue The feature is loaded for the first time. @retval RUBY_Qfalse The feature has already been loaded. @post <tt>\$" is updated. |
int ruby_native_thread_p | ( | void | ) |
Queries if the thread which calls this function is a ruby's thread.
"Ruby's" in this context is a thread created using one of our APIs like rb_thread_create(). There are distinctions between ruby's and other threads. For instance calling ruby methods are allowed only from inside of a ruby's thread.
1 | The current thread is a Ruby's thread. |
0 | The current thread is a random thread from outside of Ruby. |
int ruby_snprintf | ( | char * | str, |
size_t | n, | ||
char const * | fmt, | ||
... ) |
Our own locale-insensitive version of snprintf(3).
It can also be seen as a routine identical to rb_sprintf(), except it writes back to the passed buffer instead of allocating a new Ruby object.
[out] | str | Return buffer |
[in] | n | Number of bytes of str. |
[in] | fmt | A printf-like format specifier. |
[in] | ... | Variadic number of contents to format. |
Definition at line 1041 of file sprintf.c.
Referenced by ruby_snprintf().
int ruby_vsnprintf | ( | char * | str, |
size_t | n, | ||
char const * | fmt, | ||
va_list | ap ) |
Identical to ruby_snprintf(), except it takes a va_list.
It can also be seen as a routine identical to rb_vsprintf(), except it writes back to the passed buffer instead of allocating a new Ruby object.
[out] | str | Return buffer |
[in] | n | Number of bytes of str. |
[in] | fmt | A printf-like format specifier. |
[in] | ap | Contents to format. |
Definition at line 1014 of file sprintf.c.
Referenced by ruby_vsnprintf().