[#35961] require performance on 1.9 — Xavier Shay <xavier-list@...>
Hello,
[#35985] [Backport92 - Backport #4641][Open] Please backport r31418 to 1.9.2 stable branch — Aaron Patterson <aaron@...>
[#36013] [Ruby 1.9 - RubySpec #4649][Open] Adding parallel constructors to Ruby 2.0 — Rodrigo Rosenfeld Rosas <rr.rosas@...>
[#36046] [Ruby 1.9 - Bug #4655][Open] String#to_c does not support scientific notation — Tinco Andringa <mail@...>
[#36058] draft schedule of Ruby 1.9.3 — "Yuki Sonoda (Yugui)" <yugui@...>
-----BEGIN PGP SIGNED MESSAGE-----
Hi Yugui, is there any plans for the next patch release of 1.9.2?
[#36108] [Ruby 1.9 - Bug #4666][Open] set ruby compatibility version to 1.9.3 in trunk — Lucas Nussbaum <lucas@...>
Lucas Nussbaum <lucas@lucas-nussbaum.net> wrote:
> Even if 1.9.3 is still binary-compatible with 1.9.1, I think that it would be easier to change
2011/5/12 Urabe Shyouhei <shyouhei@ruby-lang.org>:
[#36131] Re: [ruby-cvs:38172] Ruby:r30989 (trunk): * include/ruby/win32.h: define WIN32 if neither _WIN64 nor WIN32 defined. it forces to use push/pop for pack(4) pragma. — "Yuki Sonoda (Yugui)" <yugui@...>
Hi arton,
Hi,
[#36150] [Ruby 1.9 - Bug #4680][Open] [PATCH] io.c: fix busy wait with sendfile() — Eric Wong <normalperson@...>
[#36156] [Ruby 1.9 - Bug #4683][Open] [PATCH] io.c: copy_stream execute interrupts and retry — Eric Wong <normalperson@...>
[#36167] [Ruby 1.9 - Bug #4421] [ext/openssl] Fix RSA public key encoding — Hiroshi NAKAMURA <nakahiro@...>
[#36255] Whitespace conventions? — Steve Klabnik <steve@...>
So, while working on some documentation, I've noticed that there's a lot of
2011/5/17 Steve Klabnik <steve@steveklabnik.com>:
[#36285] unable to load irb, 1.9.3 mingw — Roger Pack <rogerdpack2@...>
Hello all, with mingw 1.9.3, I get the following when trying to load irb:
[#36314] [Ruby 1.9 - Bug #3167] RDoc issues in interactive mode — Benoit Daloze <redmine@...>
[#36316] [Ruby 1.9 - Bug #4731][Open] ruby -S irb fails with mingw/msys vanilla builds — Roger Pack <rogerpack2005@...>
Hi,
On Sat, Jul 16, 2011 at 7:46 AM, Nobuyoshi Nakada <nobu@ruby-lang.org> wrote:
[#36322] [Ruby 1.9 - Bug #4734][Assigned] [ext/openssl] DSA#sign error — Martin Bosslet <Martin.Bosslet@...>
[#36337] [Ruby 1.9 - Feature #3905] rb_clear_cache_by_class() called often during GC for non-blocking I/O — Akira Tanaka <akr@...>
Akira Tanaka <akr@fsij.org> wrote:
Hi,
SASADA Koichi <ko1@atdot.net> wrote:
[#36373] [Ruby 1.9 - Bug #4757][Open] Attempt to make Enumerator docs more clear (patch included) — David Copeland <davetron5000@...>
2011/5/25 Yusuke Endoh <mame@tsg.ne.jp>:
[#36374] [Ruby 1.9 - Bug #4758][Open] yaml file not human readable when saving utf-8 — Ilias Lazaridis <ilias@...>
[#36390] [Ruby 1.9 - Feature #4766][Open] Range#bsearch — Yusuke Endoh <mame@...>
On Jul 17, 2011, at 7:54 PM, Eric Hodel wrote:
[#36395] [Ruby 1.9 - Bug #4769][Open] Updated SMTP standards — "J.R. Garcia" <mrjohngarcia@...>
[#36406] 1.8.7 release next month — Urabe Shyouhei <shyouhei@...>
Hello core people,
2011/5/23 Urabe Shyouhei <shyouhei@ruby-lang.org>:
Hi Luis,
From: Urabe Shyouhei <shyouhei@ruby-lang.org>
From: Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
Ping Luis, how's it going?
On Fri, Jun 3, 2011 at 5:18 AM, Urabe Shyouhei <shyouhei@ruby-lang.org> wrote:
Hi,
On Sun, Jun 5, 2011 at 4:30 AM, Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp> wrote:
(06/06/2011 01:16 PM), Luis Lavena wrote:
On Mon, Jun 6, 2011 at 1:24 AM, Urabe Shyouhei <shyouhei@ruby-lang.org> wrote:
From: Luis Lavena <luislavena@gmail.com>
[#36419] [Ruby 1.9 - Feature #4772][Open] Hash#add_keys — Joey Zhou <yimutang@...>
[#36429] GC thought — Roger Pack <rogerdpack2@...>
Hello all.
[#36447] [Ruby 1.9 - Bug #4777][Open] Ruby 1.9.2-p180 ignoring INT, TERM, and QUIT until it receives CONT — Nathan Sobo <nathansobo@...>
[#36463] [Ruby 1.9 - Feature #4778][Open] IO#each_chomped — Joey Zhou <yimutang@...>
[#36474] Error reporting, backtraces and the debugger — Clifford Heath <clifford.heath@...>
Dear people,
[#36479] [Ruby 1.9 - Feature #4784][Open] Import the JSON library — Lazaridis Ilias <ilias@...>
[#36494] [Ruby 1.9 - Feature #4786][Open] RCR new Feature: Numeric#grouped — Roger Pack <rogerpack2005@...>
[#36528] [Ruby 1.9 - Bug #4795][Open] Nested classes don't seem to resolve correctly when another class exists with the same name — John Feminella <johnf@...>
[#36536] [Ruby 1.9 - Bug #3924] Performance bug (in require?) — Xavier Shay <xavier-list@...>
[#36550] [Ruby 1.9 - Bug #4798][Open] test_process and test_signal errors and halts on Windows — Luis Lavena <luislavena@...>
[#36551] [Ruby 1.9 - Bug #4799][Open] M17N tests are too JP specific — Luis Lavena <luislavena@...>
[#36558] [Ruby 1.9 - Bug #3924] Performance bug (in require?) — Xavier Shay <xavier-list@...>
Hello,
Hello, Xavier
[#36559] [Ruby 1.9 - Feature #4801][Open] Shorthand Hash Syntax for Strings — Tom Wardrop <tom@...>
Hi,
> Iff 'key': 'value'} means {:key => 'value'} I have no objection.
Hi,
On Mon, May 30, 2011 at 04:21:32PM +0900, Yukihiro Matsumoto wrote:
Em 30-05-2011 07:58, Cezary escreveu:
Since :"#{abc}" is allowed in Ruby, I imagine that any such substitute syntax would preserve that property.
Em 30-05-2011 09:05, Michael Edgar escreveu:
On Mon, May 30, 2011 at 09:05:04PM +0900, Michael Edgar wrote:
Cezary:
On Tue, May 31, 2011 at 05:55:39AM +0900, Piotr Szotkowski wrote:
On May 30, 2011, at 10:19 AM, Cezary wrote:
On 5/30/11 9:24 AM, Michael Edgar wrote:
On 02/06/2011, at 10:28 AM, Kurt Stephens wrote:
On 6/1/11 10:17 PM, Bill Kelly wrote:
[#36565] [Ruby 1.9 - Bug #4803][Open] RCLASS_SUPER won't compile for C extensions as of revision 31627 — Daniel Azuma <dazuma@...>
Hi,
[#36628] [Ruby 1.9 - Feature #4805][Open] Add X509::Name#hash_old for 0.9.X compat — Hiroshi NAKAMURA <nakahiro@...>
[ruby-core:36194] [Ruby - Bug #921] autoload is not thread-safe
Issue #921 has been updated by Charles Nutter.
The concurrent require issue is separate. I would like to understand what 1.9.3 does to make concurrent requires safe. A global lock around any require? I know there was a lock against specific filenames added at some point (which JRuby also does)...is there something more?
I do not understand how the autoload problem was fixed. Here is a simpler example...
autoload.rb:
class Object
autoload :X, 'constant.rb'
end
Thread.abort_on_exception = true
Thread.new {
puts "thread #{Thread.current} accessing X; defined? X == #{(defined? X).inspect}"
X
}
Thread.new {
puts "thread #{Thread.current} accessing X; defined? X == #{(defined? X).inspect}"
X
}
sleep
constant.rb:
# simulate a slow file load or a deep chain of requires
puts "thread #{Thread.current} in constant.rb"
# check that X is not defined
puts "X defined: #{(defined? X).inspect}"
1_000_000.times { Thread.pass }
class Object
# define X
X = 1
end
I will review the problem.
When autoloading is triggered, the first step is to remove the autoload constant. This allows the file being required to see a blank slate when (presumably) defining the constant attached to autoloading. The above example does indeed print out "X defined: nil".
Now if we have two threads that encounter an autoloaded constant at roughly the same time, I would expect this sequence is possible:
For our autoloaded constant X:
1. Thread A encounters the autoload for X and removes the constant. It proceeds to require the associated file which (eventually) will define X.
2. Because thread A is now in Ruby code, a context switch can occur to thread B.
3. Thread B attempts to access the autoloaded constant X; however it has been removed by A, and thread B gets a NameError. It does *not* wait for the require to complete, because it never attempts to perform a require.
This is what happens in JRuby, Rubinius, and Ruby 1.8.7. It does not happen in Ruby 1.9.2 or MacRuby. Why?
Here is the output under 1.8.7:
~/projects/jruby ➔ ruby autoload.rb
thread #<Thread:0x100169dc8> accessing X; defined? X == "constant"
thread #<Thread:0x100169dc8> in constant.rb
X defined: nil
thread #<Thread:0x100169080> accessing X; defined? X == nil
autoload.rb:13: uninitialized constant X (NameError)
from autoload.rb:11:in `initialize'
from autoload.rb:11:in `new'
from autoload.rb:11
What appears to happen is that thread B encounters the X autoload and pauses. This could be explained for concurrent requires of the same file (if synchronizing against a filename), or for concurrent requires of different files (if there's a single global lock) but that still does not explain why autoload behaves this way in 1.9.2. Why? Because if thread A is *actually* removing the constant, it should never know that it's an autoload constant and should fail to block on a require lock of any kind. And it does appear that the constant has been removed...so how does thread B know to pause?
I could dig through the MRI code to find this, but perhaps can someone describe in simple terms how 1.9.2 prevents thread B in the example above from running when it encounters X?
----------------------------------------
Bug #921: autoload is not thread-safe
http://redmine.ruby-lang.org/issues/921
Author: Charles Nutter
Status: Closed
Priority: Normal
Assignee: Nobuyoshi Nakada
Category:
Target version:
ruby -v: -
=begin
Currently autoload is not safe to use in a multi-threaded application. To put it more bluntly, it's broken.
The current logic for autoload is as follows:
1. A special object is inserted into the target constant table, used as a marker for autoloading
2. When that constant is looked up, the marker is found and triggers autoloading
3. The marker is first removed, so the constant now appears to be undefined if retrieved concurrently
4. The associated autoload resource is required, and presumably redefines the constant in question
5. The constant lookup, upon completion of autoload, looks up the constant again and either returns its new value or proceeds with normal constant resolution
The problem arises when two or more threads try to access the constant. Because autoload is stateful and unsynchronized, the second thread may encounter the constant table in any number of states:
1. It may see the autoload has not yet fired, if the first thread has encountered the marker but not yet removed it. It would then proceed along the same autoload path, requiring the same file a second time.
2. It may not find an autoload marker, and assume the constant does not exist.
3. It may see the eventual constant the autoload was intended to define.
Of these combinations, (3) is obviously the desired behavior. (1) can only happen on native-threaded implementations that do not have a global interpreter lock, since it requires concurrency during autoload's internal logic. (2) can happen on any implementation, since while the required file is processing the original autoload constant appears to be undefined.
I have only come up with two solutions:
* When the autoload marker is encountered, it is replaced (under lock) with an "autoload in progress" marker. All subsequent threads will then see this marker and wait for the autoloading process to complete. the mechanics of this are a little tricky, but it would guarantee concurrent autoloads would only load the target file once and would always return the intended value to concurrent readers.
* A single autoload mutex, forcing all autoloads to happen in serial.
There is a potential for deadlock in the first solution, unfortunately, since two threads autoloading two constants with circular autoloaded constant dependencies would ultimately deadlock, each waiting for the other to complete. Because of this, a single autoload mutex for all autoloads may be the only safe solution.
=end
--
http://redmine.ruby-lang.org