[#29270] Proposal: Module#thunk_method — Charles Oliver Nutter <headius@...>

Many people use define_method solely so they can define a new method

13 messages 2010/04/06

[#29293] URI.(un)escape deprecated? — Marc-Andre Lafortune <ruby-core-mailing-list@...>

Hi.

16 messages 2010/04/07
[#29366] Re: URI.(un)escape deprecated? — Tanaka Akira <akr@...> 2010/04/08

2010/4/7 Marc-Andre Lafortune <ruby-core-mailing-list@marc-andre.ca>:

[#29313] [Bug #3112] require "yaml" doesn't use psych as default — Usaku NAKAMURA <redmine@...>

Bug #3112: require "yaml" doesn't use psych as default

28 messages 2010/04/08
[#29315] [Bug #3112] require "yaml" doesn't use psych as default — Yui NARUSE <redmine@...> 2010/04/08

Issue #3112 has been updated by Yui NARUSE.

[#29336] Re: [Bug #3112] require "yaml" doesn't use psych as default — Aaron Patterson <aaron@...> 2010/04/08

On Thu, Apr 08, 2010 at 02:06:55PM +0900, Yui NARUSE wrote:

[#29395] [Bug #3119] [Patch] "IOError (closed stream)" error with tempfile unlink then close usage — Simon Nicholls <redmine@...>

Bug #3119: [Patch] "IOError (closed stream)" error with tempfile unlink then close usage

9 messages 2010/04/09

[#29427] [Bug #3124] SocketError on SnowLeopard (during make test-all) — Aaron Patterson <redmine@...>

Bug #3124: SocketError on SnowLeopard (during make test-all)

10 messages 2010/04/11

[#29462] [Feature #3131] add Kernel#Hash() method like Kernel#Array() — Suraj Kurapati <redmine@...>

Feature #3131: add Kernel#Hash() method like Kernel#Array()

10 messages 2010/04/11

[#29464] [Bug #3132] …/nokogiri-1.4.1/ext/nokogiri/nokogiri.bundle: [BUG] Bus Error — Ashley Williams <redmine@...>

Bug #3132: …/nokogiri-1.4.1/ext/nokogiri/nokogiri.bundle: [BUG] Bus Error

8 messages 2010/04/12

[#29486] [Bug #3140] gem activation has changed between 1.8 and 1.9 — Aaron Patterson <redmine@...>

Bug #3140: gem activation has changed between 1.8 and 1.9

102 messages 2010/04/13
[#31002] [Bug #3140] gem activation has changed between 1.8 and 1.9 — Aaron Patterson <redmine@...> 2010/07/02

Issue #3140 has been updated by Aaron Patterson.

[#31003] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Yusuke ENDOH <mame@...> 2010/07/02

Hi,

[#31005] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Yehuda Katz <wycats@...> 2010/07/02

We are about to ship a version of Ruby with a built in package manager with

[#29489] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Evan Phoenix <evan@...> 2010/04/13

After a brief discussion with Eric Hodel about this, there are a few questions before we can figure out how to solve this:

[#29513] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Evan Phoenix <evan@...> 2010/04/14

Is there any comment on this? This is a big bug in 1.9.2 that we'd like to get fixed as soon as we can, but I need some input on it.

[#29526] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Rich Kilmer <rich.kilmer@...> 2010/04/15

I wrote this original code in gem_prelude.

[#31104] [Bug #3140] gem activation has changed between 1.8 and 1.9 — Yusuke Endoh <redmine@...> 2010/07/07

Issue #3140 has been updated by Yusuke Endoh.

[#31108] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Roger Pack <rogerdpack2@...> 2010/07/07

> I've commited the patch to trunk.

[#31193] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Yusuke ENDOH <mame@...> 2010/07/11

Hi,

[#31223] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Roger Pack <rogerdpack2@...> 2010/07/12

> Roger, could you re-try to build from scratch? ould you apply

[#31215] [Bug #3140] gem activation has changed between 1.8 and 1.9 — Yehuda Katz <redmine@...> 2010/07/12

Issue #3140 has been updated by Yehuda Katz.

[#31218] Re: [Bug #3140] gem activation has changed between 1.8 and 1.9 — Yukihiro Matsumoto <matz@...> 2010/07/12

Hi,

[#29528] [Bug #3150] net/https peer verification doesn't do anything — Hongli Lai <redmine@...>

Bug #3150: net/https peer verification doesn't do anything

11 messages 2010/04/15

[#29578] [Bug #3163] SyntaxError when using variable which is also a method in current scope with a Symbol argument — Benoit Daloze <redmine@...>

Bug #3163: SyntaxError when using variable which is also a method in current scope with a Symbol argument

17 messages 2010/04/17
[#29583] [Bug #3163] SyntaxError when using variable which is also a method in current scope with a Symbol argument — caleb clausen <redmine@...> 2010/04/18

Issue #3163 has been updated by caleb clausen.

[#29641] [Feature #3176] Thread#priority= should actually do something — caleb clausen <redmine@...>

Feature #3176: Thread#priority= should actually do something

28 messages 2010/04/19

[#29710] [Bug #3185] File.expand_path repeats forward slashes at the beginning of the path — Brian Ford <redmine@...>

Bug #3185: File.expand_path repeats forward slashes at the beginning of the path

10 messages 2010/04/21

[#29835] [Bug #3212] ConditionVariable may become inconsistent for interrupted threads — Sylvain Joyeux <redmine@...>

Bug #3212: ConditionVariable may become inconsistent for interrupted threads

24 messages 2010/04/28

[#29868] [Bug:trunk] assert now passes non-boolean result — Nobuyoshi Nakada <nobu@...>

Hi,

15 messages 2010/04/29

[ruby-core:29641] [Feature #3176] Thread#priority= should actually do something

From: caleb clausen <redmine@...>
Date: 2010-04-19 21:40:05 UTC
List: ruby-core #29641
Feature #3176: Thread#priority= should actually do something
http://redmine.ruby-lang.org/issues/show/3176

Author: caleb clausen
Status: Open, Priority: Normal
Category: core

Currently, Thread#priority= doesn't seem to do anything useful. See #1169 for more discussion of this. Here's a short program which demonstrates Thread#priority= not working, adapted from one in that issue:

$ cat thrprio.rb 
c1 = c2 = 0
go=nil
t2 = Thread.new { 1 until go; loop { c2 += 1 } }
t2.priority = -2
t1 = Thread.new { 1 until go; loop { c1 += 1 } }
t1.priority = -1
go=true
sleep 5
t1.kill
t2.kill
puts "#{c1} #{c2} #{(c1-c2).to_f/(c1+c2)} #{c1 > c2}"

$ ruby thrprio.rb 
17102855 17276166 -0.005041184855147562 false
$ ruby thrprio.rb 
16839456 16977800 -0.0040909291989864585 false
$ ruby thrprio.rb 
17063114 17248978 -0.0054168658675781125 false
$ ruby thrprio.rb 
16809137 17019727 -0.006225157309450296 false

When I run it, the 2 counts have very nearly the same value... to within <1%. I see c1 < c2 almost always. Occasionally, I see c2 > c2. If thread priorities are working, c1 should be much larger than c2. (In ruby 1.8, in which Thread#priority= works, c1 is several orders of magnitude larger than c2.) 

Depending on your OS and what order the threads are started in, you may see the reverse situation, where c1 > c2, but occasionally c1 < c2. This is still wrong, tho. The difference between c1 and c2 should be very large.

In the discussion below, GIL means the global interpreter lock (global_vm_lock).

Also, keep in mind that every mutex has inside it somewhere a queue which holds a list of the threads waiting for the mutex.

I have a theory that there's an interaction between the scheduler and the GIL which causes priorities to be effectively ignored. Imagine this:

There are 2 threads running, A and B. A.priority > B.priority.
Initially, A runs (so it holds GIL).
B tries to run, but has to wait on GIL. 
After a short time, the scheduler forces a context switch.
So now A unlocks GIL, planning to immediately lock it again. This yields time to other threads.
But before A can lock GIL, B is scheduled (since it was at the head of the queue waiting for the GIL). 
Now B owns GIL.
A tries to lock GIL, but can't obtain it, so it waits for it to be available.
After another timeslice, B yields time back to A in the same way.
...and so on

So, A and B are effectively alternating timeslices, and each gets roughly equal amounts of time. Even tho A should have a higher priority, and should get much more time. If the OS uses priority queues rather than normal fifo queues for the internal queue inside a mutex, then there would be no problem. However, I strongly suspect that most operating systems use fifo queues within their mutex implementations.

So far, this is a theory. I have no certain proof. I have poked around in the pthreads implementation inside glibc, and concluded that mutexes in glibc do seem to use fifo queues (not priority queues) internally.

I had assumed that thread_timer() in thread_pthread.c is what causes thread switches to happen... however, as I look at it more closely, I now suspect that that is not the case. I don't know where context switches are going on... but I still think the overall theory is correct.

If I'm right, then this might be fixable by making timeslices variable length, instead of always 10 ms. Lower priority threads would get shorter timeslices. Alternatively, high priority threads could get several timeslices in a row, and lower priority threads only one. There may well be even better ways to address the problem.

Yusuke, I've tried to make my explanation as clear as possible. Please let me know if it's still hard to understand.


----------------------------------------
http://redmine.ruby-lang.org

In This Thread

Prev Next