[#55222] [ruby-trunk - Feature #8468][Feedback] Remove $SAFE — "shugo (Shugo Maeda)" <redmine@...>
20 messages
2013/06/01
[#55230] [ruby-trunk - Feature #8468] Remove $SAFE
— "spatulasnout (B Kelly)" <billk@...>
2013/06/02
[#55252] [ruby-trunk - Feature #8468] Remove $SAFE
— "spatulasnout (B Kelly)" <billk@...>
2013/06/02
[#55276] Re: [ruby-changes:28951] zzak:r41003 (trunk): * process.c: Improve Process::exec documentation — Tanaka Akira <akr@...>
2013/5/31 zzak <ko1@atdot.net>:
9 messages
2013/06/03
[#55278] Re: [ruby-changes:28951] zzak:r41003 (trunk): * process.c: Improve Process::exec documentation
— David MacMahon <davidm@...>
2013/06/03
[#55285] Re: [ruby-changes:28951] zzak:r41003 (trunk): * process.c: Improve Process::exec documentation
— Zachary Scott <zachary@...>
2013/06/04
The original wording was:
[#55288] Re: [ruby-changes:28951] zzak:r41003 (trunk): * process.c: Improve Process::exec documentation
— David MacMahon <davidm@...>
2013/06/04
[#55289] Re: [ruby-changes:28951] zzak:r41003 (trunk): * process.c: Improve Process::exec documentation
— Zachary Scott <zachary@...>
2013/06/04
I fail to see the difference, please provide a patch to make it more clear.
[#55290] Re: [ruby-changes:28951] zzak:r41003 (trunk): * process.c: Improve Process::exec documentation
— David MacMahon <davidm@...>
2013/06/04
[#55291] Re: [ruby-changes:28951] zzak:r41003 (trunk): * process.c: Improve Process::exec documentation
— Tanaka Akira <akr@...>
2013/06/04
2013/6/4 David MacMahon <davidm@astro.berkeley.edu>:
[#55297] [ruby-trunk - Bug #8486][Open] Random segmentation fault — "manudwarf (Emmanuel Bourgerie)" <manu.dwarf@...>
4 messages
2013/06/04
[#55305] [ruby-trunk - Bug #8489][Open] Tracepoint API: B_RETURN_EVENT not triggered when "next" used — deivid (David Rodríguez) <deivid.rodriguez@...>
7 messages
2013/06/04
[#55312] [ruby-trunk - Bug #8495][Open] include/ruby/win32.h assumes that __STRICT_ANSI__ isn’t set — "now (Nikolai Weibull)" <now@...>
4 messages
2013/06/05
[#55330] [ruby-trunk - Feature #8499][Assigned] Importing Hash#slice, Hash#slice!, Hash#except, and Hash#except! from ActiveSupport — "mrkn (Kenta Murata)" <muraken@...>
30 messages
2013/06/06
[#55416] CI failures: Test IO and cleanup failures — Luis Lavena <luislavena@...>
Hello,
3 messages
2013/06/10
[#55528] [ruby-trunk - Bug #8538][Open] c method not pushed into the callstack when called, but popped when returned — deivid (David Rodríguez) <deivid.rodriguez@...>
9 messages
2013/06/17
[#55530] [ruby-trunk - Feature #8539][Open] Unbundle ext/tk — "naruse (Yui NARUSE)" <naruse@...>
10 messages
2013/06/17
[#55557] [ruby-trunk - misc #8543][Open] rb_iseq_load — "alvoskov (Alexey Voskov)" <alvoskov@...>
47 messages
2013/06/19
[#65574] [ruby-trunk - Feature #8543] rb_iseq_load
— billk@...
2014/10/09
Issue #8543 has been updated by B Kelly.
[#55578] [ruby-trunk - Feature #8553][Open] Bignum#size (and Fixnum#size) — "akr (Akira Tanaka)" <akr@...>
6 messages
2013/06/21
[#55580] [CommonRuby - Feature #8556][Open] MutexedDelegator as a trivial way to make an object thread-safe — "headius (Charles Nutter)" <headius@...>
19 messages
2013/06/21
[#55590] [ruby-trunk - Bug #8560][Open] CSV, skip_lines option causes error when passing a string — "kstevens715 (Kyle Stevens)" <kstevens715@...>
5 messages
2013/06/22
[#55638] [CommonRuby - Feature #8568][Open] Introduce RbConfig value for native word size, to avoid Fixnum#size use — "headius (Charles Nutter)" <headius@...>
18 messages
2013/06/24
[#55678] [ruby-trunk - Feature #8572][Open] Fiber should be a Enumerable — "mattn (Yasuhiro Matsumoto)" <mattn.jp@...>
13 messages
2013/06/28
[#55690] [ANN] Developer Meeting - 12-07-2013 at 23:00 UTC — Aaron Patterson <tenderlove@...>
Hi everyone!
7 messages
2013/06/28
[#55699] [ruby-trunk - Feature #8579][Open] Frozen string syntax — "charliesome (Charlie Somerville)" <charliesome@...>
20 messages
2013/06/29
[ruby-core:55660] Re: [CommonRuby - Feature #8570][Open] Better mechanisms to safely load classes concurrently
From:
Eric Wong <normalperson@...>
Date:
2013-06-26 08:41:14 UTC
List:
ruby-core #55660
"headius (Charles Nutter)" <headius@headius.com> wrote:
>
> Issue #8570 has been reported by headius (Charles Nutter).
>
> ----------------------------------------
> Feature #8570: Better mechanisms to safely load classes concurrently
> https://bugs.ruby-lang.org/issues/8570
>
> Author: headius (Charles Nutter)
> Status: Open
> Priority: Normal
> Assignee:
> Category:
> Target version:
>
>
> Today I had an issue reported under JRuby where a user was doing require "some library" unless defined?(SomeClassLibraryDefines). They were running into cases where threads hitting this logic concurrently might see a partially-initialized.
>
> This pattern is not uncommon, and it is broken under *all* Ruby implementations. I believe this is a major flaw in the way Ruby makes classes visible, and we need to think about changes to how constants are defined during class init or come up with better options for concurrent loading. This bug offers a few ideas and experiments I've tried in hopes we can find something that will work.
>
> The most basic problem is that the constant pointing at the class is set immediately upon opening the class. So the first option is:
>
> 1. Do not define the constant until leaving the class/module body.
<snip>
> 2. Make the constant visible only to the defining thread until leaving the class/module body.
I think 1) and 2) are on the right path.
> There are down sides, though, that may or may not happen in practice. If two
> threads try to start defining a class and it has never been defined before,
> only one will win. If code loading or class definition logic within the
> class/module spin up other threads, they won't be able to see the constant.
>
> So then, perhaps we simply need a better mechanism to know if a given class is
> "complete" or not?
So the insertion of a new class will need a namespace lock (just like
creating a new file in a directory). This namespace lock is only held
long enough to insert a blank class/module into the namespace, so
it shouldn't be contended.
But once the new class (before methods/constants are defined) exists,
the winner takes a mutex for that class and the loser sleeps on that
mutex
> 3. Add an attribute to Module indicating whether the class is "open"
> somewhere in the system.
> But this is somewhat ugly, so I have a fourth suggestion:
How about doing something like 3), but done behind-the-scenes with
an internal mutex for each class?
thread 1 | thread 2
--------------------------------------------+----------------------------
require "foo" | require "foo"
Object.ns_lock # win | Object.ns_lock # wait
Object.const_get(:Foo) => nil | ...
foo = Class.new | ...
Object.const_set(:Foo, foo) | ...
# important: we lock foo before unlocking |
# Object.ns_unlock if we created foo |
foo.lock | ...
Object.ns_unlock | ...
# foo is still locked | ... # Object.ns_lock completes
| foo = Object.const_get(:Foo)
| # here, foo exists, so we
| # release the Object lock
| # before sleeping on foo.lock
| Object.ns_unlock
| foo.lock # wait
class Foo | ...
def m1 | ...
... | ...
end | ...
end | ...
foo.unlock | ...
| ... # foo.lock completes
| class Foo
| def m2
| ...
| end
| end
| foo.unlock
If m1 and m2 are identical in name (but not implementation),
it'll be down to mutex ordering (but I don't think it's a real issue).
The per-class mutex might need to be recursive to be compatible with
existing code
> 4. Add a new mechanism for concurrent requires that understands the
> services those requires provide.
Ugh, no. I think it's too complicated and ugly.
Do we agree require is not "hot" enough to need multi-core concurrency
on the same class? I think serializing it transparently is easiest.