Issue #9343 has been updated by Koichi Sasada.


sorry for long absent.

I reviewed this patch and I have a question.
Only `diff' threads should wake-up?

Index: thread.c
===================================================================
--- thread.c	(revision 44833)
+++ thread.c	(working copy)
@@ -437,7 +437,7 @@
 	diff = max - GET_SZQUEUE_ULONGMAX(self);
     }
     RSTRUCT_SET(self, SZQUEUE_MAX, vmax);
-    while (diff > 0 && !NIL_P(t = rb_ary_shift(GET_QUEUE_QUE(self)))) {
+    while (diff-- > 0 && !NIL_P(t = rb_ary_shift(GET_SZQUEUE_WAITERS(self)))) {
 	rb_thread_wakeup_alive(t);
     }
     return vmax;



----------------------------------------
Bug #9343: [PATCH] SizedQueue#max= wakes up waiters properly
https://bugs.ruby-lang.org/issues/9343#change-44975

* Author: Eric Wong
* Status: Open
* Priority: Normal
* Assignee: Koichi Sasada
* Category: ext
* Target version: current: 2.2.0
* ruby -v: ruby 2.2.0dev (2014-01-02 trunk 44484) [x86_64-linux]
* Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
We were accessing the wrong array and trying to wake up
elements stored in the queue :x

$ git pull git://80x24.org/ruby.git szqmaxset-wakeup

The following changes since commit d1cc0ebb38a23feb37bb16ff2df3137c3cead069:

  mkrunnable.rb: fix DLL path on Windows (2014-01-02 02:41:06 +0000)

are available in the git repository at:

  git://80x24.org/ruby.git szqmaxset-wakeup

for you to fetch changes up to 9932853dec14a4f62606098d452da80a54bf9ecc:

  SizedQueue#max= wakes up waiters properly (2014-01-02 07:22:02 +0000)

----------------------------------------------------------------
Eric Wong (1):
      SizedQueue#max= wakes up waiters properly

 ext/thread/thread.c       | 2 +-
 test/thread/test_queue.rb | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)


---Files--------------------------------
0001-SizedQueue-max-wakes-up-waiters-properly.patch (1.44 KB)


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