Method access is not threadsafe
-------------------------------
Key: JRUBY-1259
URL: http://jira.codehaus.org/browse/JRUBY-1259
Project: JRuby
Issue Type: Bug
Components: Core Classes/Modules
Reporter: Bill Dortch
Priority: Critical
Method access (add/remove/search) in JRuby is currently not threadsafe.
I've just made a couple of changes to MethodCache that should help, though I'm
still not convinced that it is safe to use without synchronization. (My changes
are intended to address atomicity issues, but as reported elsewhere, JIT
behavior in sequencing operations may lead to problems if synchronization is
not done properly, or, in this case, at all.)
There are also a number of places that the _methods_ HashMap in RubyModule is
accessed unsafely. This is easy enough to demonstrate:
{code}
class C; end
t1 = Thread.new do
loop do
class C
def a; end
def b; end
def c; end
def d; end
end
end
end
t2 = Thread.new do
loop do
C.send :remove_method, :a rescue nil
C.send :remove_method, :b rescue nil
C.send :remove_method, :c rescue nil
C.send :remove_method, :d rescue nil
end
end
loop do
C.instance_methods
C.instance_methods
C.instance_methods
C.instance_methods
end
{code}
Wait for a moment, and you'll get:
{noformat}
NativeException: java.util.ConcurrentModificationException: null
from HashMap.java:793:in `java.util.HashMap$HashIterator.nextEntry'
from HashMap.java:833:in `java.util.HashMap$EntryIterator.next'
from HashMap.java:831:in `java.util.HashMap$EntryIterator.next'
from RubyModule.java:1597:in `org.jruby.RubyModule.instance_methods'
from RubyModule.java:1624:in `org.jruby.RubyModule.instance_methods'
etc...
{noformat}
This is a fairly benign outcome, a stack trace spewn across one's screen being
a pretty clear indication that something has gone amiss. But there are other
access points where more subtle, possibly undetected (or misinterpreted)
problems might arise. I suspect, for example, that JRUBY-1251 is one of these
(though it may be resolved by my MethodCache fix.)
It would be easy enough just to add synchronization where it's currently
missing, but I'm working on a MethodMap class (part of my refactoring
experiment in the bdortch/bnw branch) that will provide a more performant
solution. I'll try to get that piece into trunk sooner rather than later.
-Bill
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email