Even approaching this as a mostly Java person, I'd have to say I'd
expect C Ruby behavior. Not sure if there would be a good/easy way to
provide a switch to JRuby that could toggle the behavior (or, alert
you if it does something "unexpected" for Java - or Ruby for that
matter).

Jerry


On Nov 18, 11:04 pm, Charles Oliver Nutter <head...@headius.com>
wrote:
> Hiya folks. I have a conundrum.
>
> As you know, the JDK (at least in Hotspot/OpenJDK) does not close NIO
> channels that are not closed explicitly...i.e. it does not close them
> during finalization, and from looking at the source it appears they do
> not define finalizers at all. I was under the impression that "Java"
> still finalized IO channels for bad users, but found some whispers on
> a couple forums that this behavior was changed around Java 1.5 because
> of the impact of finalizers on GC. Mark Reinhold's name was mentioned,
> and it is said that he helped make this change happen.
>
> In any case, the fact of the matter is that JVM users should not
> depend on IO channels getting closed by a finalizer. I agree with that
> decision...code that leaves IO to finalization is broken.
>
> My problem, put simply, is that C Ruby *does* close IO streams you
> don't close on your own, and users may often expect that behavior.
>
> Up through the current release version of JRuby, we mimicked that
> behavior by defining our own finalizer on our channel wrapper, and
> everyone was happy. However, it's become apparent that by doing this
> we have introduced subtle bugs over the years, such as when a channel
> we don't own enters Ruby, we wrap it, and then our finalization closes
> it prematurely. In an effort to fix that bug, I eliminated "close"
> from our finalization of those channel wrappers, which is much cleaner
> and I don't have to guess whether we own the channel or not. But now
> we're not matching Ruby behavior, and I've had about half the folks I
> polled say they'd find this change to be a major bug in JRuby.
>
> In between closing and not closing is a complicated dance of ownership
> flags, wherein I'd try to track whether JRuby initiated the channel or
> it came from outside, only closing in finalize in the former case. It
> turns my stomach a bit just to think about doing that, but I fear it
> might be my only option.
>
> So I'm stuck in a bad place.
>
> First off, can anyone confirm the reasons why Hotspot/OpenJDK doesn't
> close NIO channels via a finalize method? How about other JVM/JDK
> impls?
>
> Second...I'd like to know how you all might handle this situation. I'm
> stuck between what I believe is a technically correct solution (not
> closing in finalize) and the expectations of users who want arguably
> broken code to behave as it does in C Ruby.
>
> - Charlie

-- 
You received this message because you are subscribed to the Google Groups "JVM 
Languages" group.
To post to this group, send email to jvm-langua...@googlegroups.com.
To unsubscribe from this group, send email to 
jvm-languages+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/jvm-languages?hl=en.

Reply via email to