| Age | Commit message (Collapse) | Author |
|
Fix handling of `error`/`errno` in `io_internal_wait`. (#12961)
[Bug #21195]
|
|
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]
|
|
[Bug #20995] Protect `IO.popen` block from exiting by exception
|
|
[Bug #20924] Fix reading with delimiter in wide character encodings
|
|
[Bug #20787] Check the separator in `IO#readline` as well as 3.2
|
|
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.
|
|
#20231] (#9831)
Don't wait in `io_binwrite_string` if not necessary. (#9792)
---
io.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
|
|
if the IO for `IO#read_nonblock` is not ready, it needs
to return (or raise) immediately.
|
|
use `rb_thread_io_blocking_call()` instead of
`rb_thread_io_blocking_region()` more.
See https://github.com/ruby/ruby/pull/9178#issuecomment-1858711533
|
|
|
|
|
|
Otherwise you can have work in some circumstance but not in others.
|
|
* Raise TypeError when IO::Buffer.map argument is neither IO nor implements #fileno
* Use UNREACHABLE_CODE
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
* Use macro for undef check
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
---------
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|
|
|
This commit moves IO#readline to Ruby. In order to call C functions,
keyword arguments must be converted to hashes. Prior to this commit,
code like `io.readline(chomp: true)` would allocate a hash. This
commits moves the keyword "denaturing" to Ruby, allowing us to send
positional arguments to the C API and avoiding the hash allocation.
Here is an allocation benchmark for the method:
```
x = GC.stat(:total_allocated_objects)
File.open("/usr/share/dict/words") do |f|
f.readline(chomp: true) until f.eof?
end
p ALLOCATIONS: GC.stat(:total_allocated_objects) - x
```
Before this commit, the output was this:
```
$ make run
./miniruby -I./lib -I. -I.ext/common -r./arm64-darwin22-fake ./test.rb
{:ALLOCATIONS=>707939}
```
Now it is this:
```
$ make run
./miniruby -I./lib -I. -I.ext/common -r./arm64-darwin22-fake ./test.rb
{:ALLOCATIONS=>471962}
```
[Bug #19890] [ruby-core:114803]
|
|
|
|
It should not be hidden, since it can be grabbed by a fiber scheduler.
|
|
|
|
The word "and" was missing.
Notes:
Merged: https://github.com/ruby/ruby/pull/8409
Merged-By: nobu <nobu@ruby-lang.org>
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/8359
Merged-By: nobu <nobu@ruby-lang.org>
|
|
Fixes [Bug #18810]
Notes:
Merged: https://github.com/ruby/ruby/pull/7975
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/8296
|
|
|
|
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/8213
|
|
Deprecate Kernel#open and IO support for subprocess creation and
forking. This deprecates subprocess creation and forking in
- Kernel#open
- URI.open
- IO.binread
- IO.foreach
- IO.readlines
- IO.read
- IO.write
This behavior is slated to be removed in Ruby 4.0
[Feature #19630]
Notes:
Merged: https://github.com/ruby/ruby/pull/7915
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/8050
|
|
Notes:
Merged-By: peterzhu2118 <peter@peterzhu.ca>
|
|
|
|
Notes:
Merged-By: ioquatix <samuel@codeotaku.com>
|
|
POSIX reserves `_t` suffix in types.
Notes:
Merged-By: ioquatix <samuel@codeotaku.com>
|
|
Because a thread calling IO#close now blocks in a native condvar wait,
it's possible for there to be _no_ threads left to actually handle
incoming signals/ubf calls/etc.
This manifested as failing tests on Solaris 10 (SPARC), because:
* One thread called IO#close, which sent a SIGVTALRM to the other
thread to interrupt it, and then waited on the condvar to be notified
that the reading thread was done.
* One thread was calling IO#read, but it hadn't yet reached the actual
call to select(2) when the SIGVTALRM arrived, so it never unblocked
itself.
This results in a deadlock.
The fix is to use a real Ruby mutex for the close lock; that way, the
closing thread goes into sigwait-sleep and can keep trying to interrupt
the select(2) thread.
See the discussion in: https://github.com/ruby/ruby/pull/7865/
Notes:
Merged-By: ioquatix <samuel@codeotaku.com>
|
|
This retries the compatible parts of the previously reverted PR so we can continue to update related code without breaking backwards compatibility.
Notes:
Merged-By: ioquatix <samuel@codeotaku.com>
|
|
This reverts commit 18e55fc1e1ec20e8f3166e3059e76c885fc9f8f2.
fix [Bug #19704]
https://bugs.ruby-lang.org/issues/19704
This breaks compatibility for extension libraries. Such changes
need a discussion.
|
|
* Add rb_io_path and rb_io_open_descriptor.
* Use rb_io_open_descriptor to create PTY objects
* Rename FMODE_PREP -> FMODE_EXTERNAL and expose it
FMODE_PREP I believe refers to the concept of a "pre-prepared" file, but
FMODE_EXTERNAL is clearer about what the file descriptor represents and
aligns with language in the IO::Buffer module.
* Ensure that rb_io_open_descriptor closes the FD if it fails
If FMODE_EXTERNAL is not set, then it's guaranteed that Ruby will be
responsible for closing your file, eventually, if you pass it to
rb_io_open_descriptor, even if it raises an exception.
* Rename IS_EXTERNAL_FD -> RUBY_IO_EXTERNAL_P
* Expose `rb_io_closed_p`.
* Add `rb_io_mode` to get IO mode.
---------
Co-authored-by: KJ Tsanaktsidis <ktsanaktsidis@zendesk.com>
Notes:
Merged-By: ioquatix <samuel@codeotaku.com>
|
|
* Documentation consistency.
* Improve consistency of `pread`/`pwrite` implementation when given length.
* Remove HAVE_PREAD / HAVE_PWRITE - it is no longer optional.
Notes:
Merged-By: ioquatix <samuel@codeotaku.com>
|
|
When one thread is closing a file descriptor whilst another thread is
concurrently reading it, we need to wait for the reading thread to be
done with it to prevent a potential EBADF (or, worse, file descriptor
reuse).
At the moment, that is done by keeping a list of threads still using the
file descriptor in io_close_fptr. It then continually calls
rb_thread_schedule() in fptr_finalize_flush until said list is empty.
That busy-looping seems to behave rather poorly on some OS's,
particulary FreeBSD. It can cause the TestIO#test_race_gets_and_close
test to fail (even with its very long 200 second timeout) because the
closing thread starves out the using thread.
To fix that, I introduce the concept of struct rb_io_close_wait_list; a
list of threads still using a file descriptor that we want to close. We
call `rb_notify_fd_close` to let the thread scheduler know we're closing
a FD, which fills the list with threads. Then, we call
rb_notify_fd_close_wait which will block the thread until all of the
still-using threads are done.
This is implemented with a condition variable sleep, so no busy-looping
is required.
Notes:
Merged: https://github.com/ruby/ruby/pull/7865
|
|
Notes:
Merged-By: ioquatix <samuel@codeotaku.com>
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7776
|
|
|
|
|
|
NEWOBJ_OF is now our canonical newobj macro. It takes an optional ec
Notes:
Merged: https://github.com/ruby/ruby/pull/7393
|
|
* Skip test if non-blocking file IO is not supported.
Notes:
Merged-By: ioquatix <samuel@codeotaku.com>
|
|
Fixes [Bug #19380]
Notes:
Merged: https://github.com/ruby/ruby/pull/7289
|
|
Mention that autoclose changes the behavior of explicit close in addition to implicit close at IO finalization.
Notes:
Merged: https://github.com/ruby/ruby/pull/5647
|
|
Notes:
Merged-By: k0kubun <takashikkbn@gmail.com>
|
|
|
|
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/7316
|
|
This was already the behavior when a single `'external:internal'`
encoding specifier string was passed. This makes the behavior
consistent for the case where separate external and internal
encoding specifiers are provided.
While here, fix the IO#set_encoding method documentation to
state that either the first or second argument can be a string
with an encoding name, and describe the behavior when the
external encoding is binary.
Fixes [Bug #18899]
Notes:
Merged: https://github.com/ruby/ruby/pull/6280
|