[ruby-core:65005] [ruby-trunk - Bug #10231] Process.detach(pid) defines new singleton classes every call

From: normalperson@...
Date: 2014-09-12 20:42:00 UTC
List: ruby-core #65005
Issue #10231 has been updated by Eric Wong.


 headius@headius.com wrote:
 > Eric Wong wrote:
 > > I haven't checked the inits.c ordering change closely, but
 > >  make check and test-rubyspec passes:
 > 
 > +1 This is how I'd fix it.
 
 Committed with nobu's comments as r47561
 Process.detach: avoid singleton class creation
 
 A NEWS entry may be appropriate as well.
 
 I prefer deliberately leaving out Process::Waiter and Thread references,
 since I think we may be able to avoid Thread creation entirely in the
 future (not sure if it's worth the effort).
 
 --- a/NEWS
 +++ b/NEWS
 @@ -113,6 +113,8 @@ with all sufficient information, see the ChangeLog file.
    * Process execution methods such as Process.spawn opens the file in write
      mode for redirect from [:out, :err].
      Before Ruby 2.2, it was opened in read mode.
 +  * Process.detach returns the same object class instead of creating a
 +    new singleton class every call.
  
  === Stdlib updates (outstanding ones only)

----------------------------------------
Bug #10231: Process.detach(pid) defines new singleton classes every call
https://bugs.ruby-lang.org/issues/10231#change-48881

* Author: Charles Nutter
* Status: Closed
* Priority: Normal
* Assignee: Eric Wong
* Category: core
* Target version: current: 2.2.0
* ruby -v: Any version with Process.detach
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
The logic for Process.detach(pid) adds a singleton "pid" method to the thread it returns for every call. This is bad for method caches (MRI still flushes them all for this, I believe) and memory churn (singleton classes are not small).

The offending line of code is here: https://github.com/ruby/ruby/blob/trunk/process.c#L1041

I would suggest that Process.detach should return a subclass of Thread that has the pid method defined ahead of time.

It also stores the value in thread local storage, rather than as an instance variable. I'm not sure why.



-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next