Commit graph

1977 commits

Author SHA1 Message Date
Peter Zhu
771804248e Make ARGF not pin references during marking
ARGF supports compaction, but it pins all of its references, which means
that none of it can move. This commit changes it to actually support
compaction.
2025-07-31 12:46:51 -04:00
Nobuyoshi Nakada
9e7a985c6d
[Bug #21509] [DOC] Correct IO#wait description 2025-07-12 22:34:52 +09:00
Kevin Saison
f4ea42a8ca [DOC] Fix ARGF example 2025-07-01 22:18:14 +09:00
Nobuyoshi Nakada
4965954556
[DOC] Remove a garbage in an example 2025-06-27 22:27:25 +09:00
Kenyon Ralph
d6eecec2ec
[DOC] Fix backquote exit status docs
It is `exitstatus`, not `status`, per 3d5619c8b1/process.c (L581)
2025-06-27 10:09:31 +09:00
Samuel Williams
a0fe0095ab
Don't enumerate io->blocking_operations if fork generation is different. (#13359) 2025-05-16 14:14:23 +09:00
Samuel Williams
87261c2d95
Ensure that forked process do not see invalid blocking operations. (#13343) 2025-05-15 15:50:15 +09:00
Samuel Williams
425fa0aeb5
Make waiting_fd behaviour per-IO. (#13127)
- `rb_thread_fd_close` is deprecated and now a no-op.
- IO operations (including close) no longer take a vm-wide lock.
2025-05-13 19:02:03 +09:00
Nobuyoshi Nakada
c218862d3c
Fix style [ci skip] 2025-04-19 22:02:10 +09:00
Samuel Williams
d6d4e6877c
Tidy up rb_io_fptr_finalize. (#13136) 2025-04-19 19:16:54 +09:00
Samuel Williams
20a1c1dc6b
Ensure struct rb_io is passed through to thread.c. (#13134) 2025-04-19 09:55:16 +09:00
Samuel Williams
6f6d07272e
Update usage of enum rb_io_mode. (#13128) 2025-04-18 02:37:55 +00:00
Samuel Williams
8d21f666b8
Introduce enum rb_io_mode. (#7894) 2025-04-16 07:50:37 +00:00
Tanaka Akira
698ef864a5 IO.select accepts +Float::INFINITY+ as a timeout argument.
matz accepted at the developper meeting 2024-07-11.
2025-04-15 15:55:40 +09:00
Matt Valentine-House
a61e7118e6 Provide compaction support for argf_type 2025-03-31 17:10:51 +01:00
Étienne Barrié
6ecfe643b5 Freeze $/ and make it ractor safe
[Feature #21109]

By always freezing when setting the global rb_rs variable, we can ensure
it is not modified and can be accessed from a ractor.

We're also making sure it's an instance of String and does not have any
instance variables.

Of course, if $/ is changed at runtime, it may cause surprising behavior
but doing so is deprecated already anyway.

Co-authored-by: Jean Boussier <jean.boussier@gmail.com>
2025-03-27 17:54:56 +01:00
Samuel Williams
5f77f9bea6
Fix handling of error/errno in io_internal_wait. (#12961)
[Bug #21195]
2025-03-23 13:42:04 +13:00
Jeremy Evans
f423f6e10c Ensure IO.copy_stream buffer is an independent string
Otherwise, changes to the buffer by the destination write method
could result in data changing for supposedly independent strings.

Fixes [Bug #21131]
2025-02-18 17:18:16 -08:00
Nobuyoshi Nakada
8034e9c3d0
[Bug #20995] Protect IO.popen block from exiting by exception 2025-01-02 15:50:20 +09:00
Nobuyoshi Nakada
e433e6515e
[DOC] Exclude 'Class' and 'Module' from RDoc's autolinking 2025-01-02 12:36:06 +09:00
Nobuyoshi Nakada
d441d35107
[DOC] Exclude 'Process' from RDoc's autolinking 2025-01-02 11:58:15 +09:00
Nobuyoshi Nakada
979543e7bf
Use rb_str_conv_enc for simplicity 2024-12-11 01:13:15 +09:00
Nobuyoshi Nakada
e90b447655
[Bug #20924] Fix reading with delimiter in wide character encodings 2024-12-10 23:57:57 +09:00
Nobuyoshi Nakada
ee29aade1a
[Bug #20869] Discard read buffer and encoding converters at seeking 2024-11-07 21:03:37 +09:00
Nobuyoshi Nakada
1701ddea73
[Bug #20802] Copy encodings at reopen as well 2024-11-07 19:33:41 +09:00
Nobuyoshi Nakada
773d140f65
[Bug #20787] Check the separator in IO#readline as well as 3.2 2024-10-07 11:06:44 +09:00
Samuel Williams
c50298d7d4
Introduce rb_io_blocking_region which takes struct rb_io argument. (#11795)
This does not change any actual behaviour, but provides a choke point for blocking IO operations.

* Update `IO::Buffer` to use `rb_io_blocking_region`.

* Update `File` to use `rb_io_blocking_region`.

* Update `IO` to use `rb_io_blocking_region`.
2024-10-05 15:10:12 +13:00
Samuel Williams
c878843b2c
Better handling of timeout in rb_io_maybe_wait_*. (#9531) 2024-10-04 19:36:06 +13:00
Nobuyoshi Nakada
8350b48cfa
Import patches for old macOS from MacPorts 2024-09-26 10:32:30 +09:00
Nobuyoshi Nakada
37d7ae06af
[Bug #20708] Retry open on EINTR
Co-Authored-By: Martin Dorey <martin.dorey@hds.com>
2024-09-04 10:42:48 +09:00
Tanaka Akira
ed2f8ea62e [DOC] IO#close on closed IO is not an error. 2024-06-19 13:42:40 +09:00
Tanaka Akira
d05d03b186 IO.select accepts a numeric value as timeout.
[DOC] IO.select accepts a numeric value as timeout, not only an integer.
2024-06-02 23:24:08 +09:00
Nobuyoshi Nakada
0bae2f0002
[Bug #20510] Do not count optional hash argument for IO.new
Since `IO.new` accepts one or two positional arguments except for the
optional hash argument, exclude the optional hash argument from the
check for delegation to `IO.new`.
2024-05-25 19:15:25 +09:00
Nobuyoshi Nakada
184db1fd6a Update ARGF.write interface 2024-04-04 18:54:54 +09:00
Jean Boussier
d4f3dcf4df Refactor VM root modules
This `st_table` is used to both mark and pin classes
defined from the C API. But `vm->mark_object_ary` already
does both much more efficiently.

Currently a Ruby process starts with 252 rooted classes,
which uses `7224B` in an `st_table` or `2016B` in an `RArray`.

So a baseline of 5kB saved, but since `mark_object_ary` is
preallocated with `1024` slots but only use `405` of them,
it's a net `7kB` save.

`vm->mark_object_ary` is also being refactored.

Prior to this changes, `mark_object_ary` was a regular `RArray`, but
since this allows for references to be moved, it was marked a second
time from `rb_vm_mark()` to pin these objects.

This has the detrimental effect of marking these references on every
minors even though it's a mostly append only list.

But using a custom TypedData we can save from having to mark
all the references on minor GC runs.

Addtionally, immediate values are now ignored and not appended
to `vm->mark_object_ary` as it's just wasted space.
2024-03-06 15:33:43 -05:00
Jean Boussier
b4a69351ec Move FL_SINGLETON to FL_USER1
This frees FL_USER0 on both T_MODULE and T_CLASS.

Note: prior to this, FL_SINGLETON was never set on T_MODULE,
so checking for `FL_SINGLETON` without first checking that
`FL_TYPE` was `T_CLASS` was valid. That's no longer the case.
2024-03-06 13:11:41 -05:00
Nobuyoshi Nakada
1a9a20cebd
Turn rb_sys_fail_on_write into a function 2024-03-01 13:11:29 +09:00
Peter Zhu
df5b8ea4db Remove unneeded RUBY_FUNC_EXPORTED 2024-02-23 10:24:21 -05:00
Burdette Lamar
d4b4b53bc0
[DOC] Fix links in doc (#9970) 2024-02-20 16:10:52 -05:00
Peter Zhu
e779c194b3 Remove used str field in struct binwrite_arg 2024-02-15 11:48:31 -05:00
Yusuke Endoh
25d74b9527 Do not include a backtick in error messages and backtraces
[Feature #16495]
2024-02-15 18:42:31 +09:00
Burdette Lamar
80490acfb6
More on IO doc (#9842) 2024-02-09 12:08:54 -05:00
Peter Zhu
5e0c171451 Make io_fwrite safe for compaction
[Bug #20169]

Embedded strings are not safe for system calls without the GVL because
compaction can cause pages to be locked causing the operation to fail
with EFAULT. This commit changes io_fwrite to use rb_str_tmp_frozen_no_embed_acquire,
which guarantees that the return string is not embedded.
2024-02-05 11:11:07 -05:00
Samuel Williams
2554c5d3b8
Don't wait in io_binwrite_string if not necessary. (#9792) 2024-02-01 15:27:44 +13:00
Nobuyoshi Nakada
d86c4e553e
Define IO_WITHOUT_GVL macro 2024-01-24 20:51:50 +09:00
Burdette Lamar
ef685554c9
[DOC] RDoc for ARGF (#9558) 2024-01-18 10:15:25 -05:00
Xavier Noria
aad246feba s/SafeStringValue/StringValue/
The macro SafeStringValue() became just StringValue() in c5c05460ac,
and it is deprecated nowadays.

This patch replaces remaining macro usage. Some occurrences are left in
ext/stringio and ext/win32ole, they should be fixed upstream.

The macro itself is not deleted, because it may be used in extensions.
2024-01-12 12:24:48 -08:00
S.H
a6ba45e9b0
Remove unnecessary semicolons (#9469) 2024-01-10 16:21:55 -08:00
KJ Tsanaktsidis
31371b2e24 Fix CRLF -> LF conversion on read for rb_io_fdopen & rb_file_open
When opening a file with `File.open`, and then setting the encoding with
`IO#set_encoding`, it still correctly performs CRLF -> LF conversion on
Windows when reading files with a CRLF line ending in them (in text
mode).

However, the file is opened instead with either the `rb_io_fdopen` or
`rb_file_open` APIs from C, the CRLF conversion is _NOT_ set up
correctly; it works if the encoding is not specified, but if
`IO#set_encoding` is called, the conversion stops happening. This seems
to be because the encflags never get ECONV_DEFAULT_NEWLINE_DECORATOR
set in these codepaths.

Concretely, this means that the conversion doesn't happen in the
following circumstances:
  * When loading ruby files with require (that calls rb_io_fdopen)
  * When parsing ruuby files with RubyVM::AbstractSyntaxTree (that calls
    rb_file_open).
This then causes the ErrorHighlight tests to fail on windows if git has
checked them out with CRLF line endings - the error messages it's
testing wind up with literal \r\n sequences in them because the iseq
text from the parser contains un-newline-converted strings.

This commit fixes the problem by copy-pasting the relevant snippet which
sets this up in `rb_io_extract_modeenc` (for the File.open path) into
the relevant codepaths for `rb_io_fdopen` and `rb_file_open`.

[Bug #20101]
2024-01-10 21:02:23 +11:00
Koichi Sasada
d65d2fb6b5 Do not poll first
Before this patch, the MN scheduler waits for the IO with the
following steps:

1. `poll(fd, timeout=0)` to check fd is ready or not.
2. if fd is not ready, waits with MN thread scheduler
3. call `func` to issue the blocking I/O call

The advantage of advanced `poll()` is we can wait for the
IO ready for any fds. However `poll()` becomes overhead
for already ready fds.

This patch changes the steps like:

1. call `func` to issue the blocking I/O call
2. if the `func` returns `EWOULDBLOCK` the fd is `O_NONBLOCK`
   and we need to wait for fd is ready so that waits with MN
   thread scheduler.

In this case, we can wait only for `O_NONBLOCK` fds. Otherwise
it waits with blocking operations such as `read()` system call.
However we don't need to call `poll()` to check fd is ready
in advance.

With this patch we can observe performance improvement
on microbenchmark which repeats blocking I/O (not
`O_NONBLOCK` fd) with and without MN thread scheduler.

```ruby
require 'benchmark'

f = open('/dev/null', 'w')
f.sync = true

TN = 1
N = 1_000_000 / TN

Benchmark.bm{|x|
  x.report{
    TN.times.map{
      Thread.new{
        N.times{f.print '.'}
      }
    }.each(&:join)
  }
}
__END__
TN = 1
                 user     system      total        real
ruby32       0.393966   0.101122   0.495088 (  0.495235)
ruby33       0.493963   0.089521   0.583484 (  0.584091)
ruby33+MN    0.639333   0.200843   0.840176 (  0.840291) <- Slow
this+MN      0.512231   0.099091   0.611322 (  0.611074) <- Good
```
2024-01-05 05:51:25 +09:00