[#20190] Behavior: autoload calls rb_require() directly — Evan Phoenix <evan@...>

Hi everyone,

79 messages 2008/12/01
[#20200] Re: Behavior: autoload calls rb_require() directly — Yukihiro Matsumoto <matz@...> 2008/12/02

Hi,

[#20215] Re: Behavior: autoload calls rb_require() directly — Evan Phoenix <evan@...> 2008/12/02

[#20217] Re: Behavior: autoload calls rb_require() directly — Dave Thomas <dave@...> 2008/12/02

[#20301] Re: Behavior: autoload calls rb_require() directly — Yukihiro Matsumoto <matz@...> 2008/12/04

Hi,

[#20316] Re: Behavior: autoload calls rb_require() directly — Charles Oliver Nutter <charles.nutter@...> 2008/12/04

Yukihiro Matsumoto wrote:

[#20317] Re: Behavior: autoload calls rb_require() directly — Paul Brannan <pbrannan@...> 2008/12/04

On Fri, Dec 05, 2008 at 03:25:42AM +0900, Charles Oliver Nutter wrote:

[#20323] Leave my open classes alone (was Behavior: autoload calls rb_require() directly) — Dave Thomas <dave@...> 2008/12/04

[#20325] Re: Leave my open classes alone (was Behavior: autoload calls rb_require() directly) — Charles Oliver Nutter <charles.nutter@...> 2008/12/04

Dave Thomas wrote:

[#20328] Re: Leave my open classes alone (was Behavior: autoload calls rb_require() directly) — Yukihiro Matsumoto <matz@...> 2008/12/04

Hi,

[#20334] Re: Leave my open classes alone (was Behavior: autoload calls rb_require() directly) — Charles Oliver Nutter <charles.nutter@...> 2008/12/04

Yukihiro Matsumoto wrote:

[#20384] Re: Leave my open classes alone (was Behavior: autoload calls rb_require() directly) — Brent Roman <brent@...> 2008/12/05

[#20329] Re: Behavior: autoload calls rb_require() directly — daz <dooby@...10.karoo.co.uk> 2008/12/04

Charles Oliver Nutter wrote:

[#20335] Re: Behavior: autoload calls rb_require() directly — Charles Oliver Nutter <charles.nutter@...> 2008/12/04

daz wrote:

[#20341] Re: Behavior: autoload calls rb_require() directly — "Michael Selig" <michael.selig@...> 2008/12/04

On Fri, 05 Dec 2008 09:58:02 +1100, Charles Oliver Nutter

[#20344] Re: Behavior: autoload calls rb_require() directly — Charles Oliver Nutter <charles.nutter@...> 2008/12/05

Michael Selig wrote:

[#20214] Proposal: deferred blocks — "Yehuda Katz" <wycats@...>

Several people have played around with solutions that use ParseTree or

11 messages 2008/12/02

[#20235] autoload and concurrency — "Yehuda Katz" <wycats@...>

Merb uses autoload rather extensively. We have lately observed some

31 messages 2008/12/03
[#20236] Re: autoload and concurrency — Jim Deville <jdeville@...> 2008/12/03

This seems like a strong argument in favor of Ruby-core:20225.

[#20240] Re: autoload and concurrency — Charles Oliver Nutter <charles.nutter@...> 2008/12/03

Jim Deville wrote:

[#20242] Re: autoload and concurrency — Charles Oliver Nutter <charles.nutter@...> 2008/12/03

Charles Oliver Nutter wrote:

[#20245] Re: autoload and concurrency — "Yehuda Katz" <wycats@...> 2008/12/03

Also, this just illustrates that it's possible. In the case of Merb, we

[#20247] Re: autoload and concurrency — Tomas Matousek <Tomas.Matousek@...> 2008/12/03

I think it has already been concluded that autoload and require are inheren=

[#20241] [Bug #814] NoMethodError: undefined method `read_nonblock' for #<OpenSSL::SSL::SSLSocket:0x1a64f9a0> — Aaron Patterson <redmine@...>

Bug #814: NoMethodError: undefined method `read_nonblock' for #<OpenSSL::SSL::SSLSocket:0x1a64f9a0>

19 messages 2008/12/03
[#22538] [Bug #814] NoMethodError: undefined method `read_nonblock' for #<OpenSSL::SSL::SSLSocket:0x1a64f9a0> — Tony Arcieri <redmine@...> 2009/02/26

Issue #814 has been updated by Tony Arcieri.

[#20416] [Feature #839] Add code on each line of a backtrace output to the screen — Roger Pack <redmine@...>

Feature #839: Add code on each line of a backtrace output to the screen

12 messages 2008/12/08

[#20483] encoding of symbols — Dave Thomas <dave@...>

If I have a source file like this:

50 messages 2008/12/11
[#20494] Re: encoding of symbols — Yukihiro Matsumoto <matz@...> 2008/12/11

Hi,

[#20496] Re: encoding of symbols — Yukihiro Matsumoto <matz@...> 2008/12/12

Hi,

[#20522] Re: encoding of symbols — Charles Oliver Nutter <charles.nutter@...> 2008/12/13

Yukihiro Matsumoto wrote:

[#20526] Re: encoding of symbols — Brian Candler <B.Candler@...> 2008/12/13

On Sat, Dec 13, 2008 at 08:33:13PM +0900, Charles Oliver Nutter wrote:

[#20540] Re: 1.9 character encoding (was: encoding of symbols) — "Michael Selig" <michael.selig@...> 2008/12/14

On Sun, 14 Dec 2008 01:01:44 +1100, Brian Candler <B.Candler@pobox.com>

[#20545] Re: 1.9 character encoding (was: encoding of symbols) — "Michael Selig" <michael.selig@...> 2008/12/14

On Sun, 14 Dec 2008 11:57:55 +1100, Michael Selig

[#20562] Re: 1.9 character encoding (was: encoding of symbols) — Yukihiro Matsumoto <matz@...> 2008/12/15

Hi,

[#20619] Re: 1.9 character encoding (was: encoding of symbols) — danielcavanagh@... 2008/12/17

> You're right. When we have two strings with identical byte sequence

[#20502] [Bug #863] Openssl issues with fresh compile on Ubuntu — Brian Takita <redmine@...>

Bug #863: Openssl issues with fresh compile on Ubuntu

11 messages 2008/12/12

[#20557] [Bug #877] [win32] Ruby Standard Library (maybe smth else): Wrong Encoding in Files, Directories and Environment Variables — "Dmitry A. Ustalov" <redmine@...>

Bug #877: [win32] Ruby Standard Library (maybe smth else): Wrong Encoding in Files, Directories and Environment Variables

14 messages 2008/12/14

[#20564] [Bug #883] Failure: test_handle_special_CROSSREF_no_underscore(TestRDocMarkupToHtmlCrossref) — Kazuhiro NISHIYAMA <redmine@...>

Bug #883: Failure: test_handle_special_CROSSREF_no_underscore(TestRDocMarkupToHtmlCrossref)

9 messages 2008/12/15

[#20576] [Bug #888] zlib 1.2.3 does not work with Rubygems 1.3.1 (in Ruby 1.9.1) on Windows — Chauk-Mean PROUM <redmine@...>

Bug #888: zlib 1.2.3 does not work with Rubygems 1.3.1 (in Ruby 1.9.1) on Windows

14 messages 2008/12/15

[#20578] [Feature #889] erb.rb should use Array and << for eoutvar and not String and concat — Thomas Enebo <redmine@...>

Feature #889: erb.rb should use Array and << for eoutvar and not String and concat

15 messages 2008/12/15

[#20668] [Feature #905] Add String.new(fixnum) to preallocate large buffer — Charles Nutter <redmine@...>

Feature #905: Add String.new(fixnum) to preallocate large buffer

60 messages 2008/12/18
[#20671] Re: [Feature #905] Add String.new(fixnum) to preallocate large buffer — Yukihiro Matsumoto <matz@...> 2008/12/19

Hi

[#20674] Re: [Feature #905] Add String.new(fixnum) to preallocate large buffer — Charles Oliver Nutter <charles.nutter@...> 2008/12/19

Yukihiro Matsumoto wrote:

[#20697] Re: [Feature #905] Add String.new(fixnum) to preallocate large buffer — Jim Weirich <jim.weirich@...> 2008/12/19

[#20703] Re: [Feature #905] Add String.new(fixnum) to preallocate large buffer — Charles Oliver Nutter <charles.nutter@...> 2008/12/19

Jim Weirich wrote:

[#20704] Re: [Feature #905] Add String.new(fixnum) to preallocate large buffer — Dave Thomas <dave@...> 2008/12/19

[#28461] [Feature #905] Add String.new(fixnum) to preallocate large buffer — caleb clausen <redmine@...> 2010/03/04

Issue #905 has been updated by caleb clausen.

[#28491] [Feature #905] Add String.new(fixnum) to preallocate large buffer — Kurt Stephens <redmine@...> 2010/03/05

Issue #905 has been updated by Kurt Stephens.

[#20695] [Bug #907] Various system() and backticks problems on Windows — "James M. Lawrence" <redmine@...>

Bug #907: Various system() and backticks problems on Windows

13 messages 2008/12/19

[#20706] [Feature #908] Should be an easy way of reading N characters from am I/O stream — Michael Selig <redmine@...>

Feature #908: Should be an easy way of reading N characters from am I/O stream

39 messages 2008/12/19
[#21816] [Feature #908] Should be an easy way of reading N characters from am I/O stream — Michael Selig <redmine@...> 2009/02/03

Issue #908 has been updated by Michael Selig.

[#21825] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Tanaka Akira <akr@...> 2009/02/04

In article <4988d2fa997f8_8527a9e32018e7@redmine.ruby-lang.org>,

[#21826] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — "Michael Selig" <michael.selig@...> 2009/02/04

Hi,

[#22100] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Tanaka Akira <akr@...> 2009/02/14

In article <op.uotab6oa9245dp@kool>,

[#22125] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Michal Suchanek <hramrach@...> 2009/02/15

2009/2/14 Tanaka Akira <akr@fsij.org>:

[#22146] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Tanaka Akira <akr@...> 2009/02/15

In article <a5d587fb0902141711q780f0d24jef9be9b8bbe69b2a@mail.gmail.com>,

[#22182] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Michal Suchanek <hramrach@...> 2009/02/16

2009/2/15 Tanaka Akira <akr@fsij.org>:

[#22213] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Tanaka Akira <akr@...> 2009/02/18

In article <a5d587fb0902160252u56b50cfdv8e0fd36bb4f0b1b3@mail.gmail.com>,

[#22215] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Michal Suchanek <hramrach@...> 2009/02/18

2009/2/18 Tanaka Akira <akr@fsij.org>:

[#22238] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — "Michael Selig" <michael.selig@...> 2009/02/18

On Thu, 19 Feb 2009 02:21:21 +1100, Michal Suchanek <hramrach@centrum.cz>

[#22253] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Tanaka Akira <akr@...> 2009/02/19

In article <op.upklh9q19245dp@kool>,

[#22281] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Martin Duerst <duerst@...> 2009/02/20

At 19:00 09/02/19, Tanaka Akira wrote:

[#22332] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Tanaka Akira <akr@...> 2009/02/22

In article <6.0.0.20.2.20090220134502.0823ee98@localhost>,

[#22338] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — "Michael Selig" <michael.selig@...> 2009/02/22

On Mon, 23 Feb 2009 03:00:41 +1100, Tanaka Akira <akr@fsij.org> wrote:

[#22356] Re: [Feature #908] Should be an easy way of reading N characters from am I/O stream — Michal Suchanek <hramrach@...> 2009/02/23

2009/2/22 Michael Selig <michael.selig@fs.com.au>:

[#20723] [Bug #911] ArgumentError in Resolv#getaddress — Federico Builes <redmine@...>

Bug #911: ArgumentError in Resolv#getaddress

14 messages 2008/12/20

[#20797] [Bug #921] autoload is not thread-safe — Charles Nutter <redmine@...>

Bug #921: autoload is not thread-safe

15 messages 2008/12/22

[#20893] [Bug #932] incorrect case statement in "ext/dl/test/test_base.rb" causes library problems on openSUSE 11.1 64-bit — Ed Borasky <redmine@...>

Bug #932: incorrect case statement in "ext/dl/test/test_base.rb" causes library problems on openSUSE 11.1 64-bit

8 messages 2008/12/26

[#20978] Definable != is a Bad Thing™ — Ryan Davis <ryand-ruby@...>

> >> class X; def == o; :great; end; def != o; :horrible; end; end

20 messages 2008/12/30
[#20979] Re: Definable != is a Bad Thing™ — Yukihiro Matsumoto <matz@...> 2008/12/30

Hi,

[#20994] [Bug #956] Encoding: nl_langinfo(CODESET) on cygwin 1.5 always returns US-ASCII — Tom Link <redmine@...>

Bug #956: Encoding: nl_langinfo(CODESET) on cygwin 1.5 always returns US-ASCII

10 messages 2008/12/30

[#20999] Supporting Thread.critical=with native threads — Shri Borde <Shri.Borde@...>

Hi,

27 messages 2008/12/30
[#21002] Re: Supporting Thread.critical=with native threads — Eric Hodel <drbrain@...7.net> 2008/12/31

On Dec 30, 2008, at 15:00 PM, Shri Borde wrote:

[#21010] Re: Supporting Thread.critical=with native threads — Shri Borde <Shri.Borde@...> 2008/12/31

http://www.ruby-doc.org/core/classes/Thread.html#M000461 says:

[#21245] Re: Supporting Thread.critical=with native threads — Charles Oliver Nutter <charles.nutter@...> 2009/01/10

I'm starting come around to Shri's idea of critical= being represented

[#21353] Re: Supporting Thread.critical=with native threads — Shri Borde <Shri.Borde@...> 2009/01/14

SXMgb3BlbmluZyBhIGJ1ZyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGdldCB0aGUgc3BlYyBjaGFu

[#21359] Re: Supporting Thread.critical=with native threads — Brent Roman <brent@...> 2009/01/15

[ruby-core:20802] Re: use of require thread safety

From: "Robert Klemme" <shortcutter@...>
Date: 2008-12-22 18:23:54 UTC
List: ruby-core #20802
2008/12/22 Charles Oliver Nutter <charles.nutter@sun.com>:
> Robert Klemme wrote:

>> I don't think there should be locking involved for "load" as that
>> loads a file unconditionally. When using "load" one must be aware of
>> the fact that the file can be loaded multiple times - including
>> concurrently.
>
> I tend to agree. Load explicitly bypasses things like $" population so you
> can load the same file repeatedly if you want to. So I think load should be
> the lock-free low-level "always execute target file" version. And in truth,
> require is largely implemented in terms of load.

That's always how I looked at it: "load" is the low level
functionality of reading a file of ruby code and executing it.
"require" adds the one off check plus the file name, $: and shared lib
magic.

>> For "require" the story looks a bit different.  If I am not mistaken
>> you would need a reentrant lock per (case insensitive? - probably
>> depending on file system) string after "require" as the smallest
>> granularity.  Hm...  The longer I think about it the more I believe
>> that a single reentrant lock for "require" is probably the most robust
>> solution...
>
> I think it has to be a single lock or nothing, due to the deadlock
> possibilities of a lock-per-resources.

Unfortunately there is also a deadlock possibility even with a single
lock.  Assuming you have a large application and want to parallelize
initialization because that might be IO intensive and your app will
start faster by doing this.  If you do something like this:

$ cat large_app.rb

%w{a b}.map do |fn|
  Thread.new(fn){|file| require "large_app/#{file}"}
end.each do |th|
  th.join
end

you have created a deadlock.  And you would not get a deadlock with a
lock by resource implementation.  Granted, the deadlock for the lock
by resource approach is more likely as this case is probably a bit
esoteric.  The bad news is that it does work with the current 1.8.7
interpreter, i.e. you do not get a deadlock.  Output from the test
attached:

robert@fussel /tmp
$ ruby -r large_app -e 'puts 1'
>large_app
>a
<a
>b
<b
<large_app
1

robert@fussel /tmp
$

> So I'll summarize my position here:
>
> - requires cannot safely be done concurrently because they will cause
> resources (classes, modules) to be accessed before they are completely
> loaded and initialized.
> - The simplest solution for this is to not require resources concurrently,
> which is certainly a valid solution which requires no locks and no
> behavioral changes.

But has the drawback of a missing safety net.

> - A lock per resources or per name is broken, due to deadlock potential, and
> so is not the right solution
> - A single global lock would fix require concurrency (and almost be enough
> to fix autoload concurrency) but would introduce the behavioral change that
> only one require can execute at a time.

No, it would mean, only one thread can execute require at a time.  The
lock would of course have to be reentrant so your required files can
require more.  Otherwise it would be useless.

Plus it would also have deadlock potential.  Even worse, this type of
deadlock is probably harder to (automatically) detect because it
involves locks of two different types. This is a bit similar to
deadlocks we once had in an application which could be seen at the
database level but the DB did not recognize them because application
level locks were also involved creating a deadlock which was not
resolved by the DB's deadlock detection.  Nasty debugging session that
was...

I see these additional solutions

- Disallow thread creation from a thread that is currently holding the
require lock.

- Mark threads created from a thread currently holding the require
lock and disallow further require executions from there (at least as
long as the parent thread holds the require lock).

Both these would at least avoid the deadlock I have constructed above
as far as I can see.  The first one might be simpler to implement, the
last one probably allows for more freedom in required code. It could
even be essential for some applications to start a thread during
requiring (just think about a pool cleanout thread or something
similar).

> - I'm not strongly leaning toward either "no fix" or a global require lock.
> It doesn't bother me terrible that require isn't thread-safe, since the
> simple fix of "don't do that" solve the problem without complication.
>
>> While we're at it: what happens to "require" in light of changes to $:
>> and current directory?
>
> I don't think it would make any difference; both just change how it searches
> for files, and should not affect concurrency characteristics.

Well, but what about

th1: $:unshift "bar"
th1: require a # loads "bar/a" as intended
th2: $:unshift "foo"
th1: require b # now reads "foo/b" instead of "bar/b"

Again, practically this might not be a problem but any time someone
has the idea to parallelize app initialization (for example, because
he has native threads now and 4 CPU's at hand) and common names are
used the effect of allowing concurrent changes to $: and Dir.pwd might
be dramatic - and hard to debug.

I'm all for pragmatic solutions but with such a fundamental feature
like the language's library loading I have a bad feeling that this
will haunt us one way or the other if it is not made robust.

Thoughts?

robert

-- 
remember.guy do |as, often| as.you_can - without end

Attachments (1)

large_app.tgz (354 Bytes, Archive)

In This Thread