From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: poffice@blade.nagaokaut.ac.jp Delivered-To: poffice@blade.nagaokaut.ac.jp Received: from kankan.nagaokaut.ac.jp (kankan.nagaokaut.ac.jp [133.44.2.24]) by blade.nagaokaut.ac.jp (Postfix) with ESMTP id CFA4617D5786 for ; Sat, 19 Dec 2015 10:07:52 +0900 (JST) Received: from voscc.nagaokaut.ac.jp (voscc.nagaokaut.ac.jp [133.44.1.100]) by kankan.nagaokaut.ac.jp (Postfix) with ESMTP id 5F5A7B5D8C3 for ; Sat, 19 Dec 2015 10:40:02 +0900 (JST) Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by voscc.nagaokaut.ac.jp (Postfix) with ESMTP id 77EE118CC7E7 for ; Sat, 19 Dec 2015 10:40:02 +0900 (JST) Received: from [221.186.184.76] (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 7516712049B; Sat, 19 Dec 2015 10:40:00 +0900 (JST) X-Original-To: ruby-core@ruby-lang.org Delivered-To: ruby-core@ruby-lang.org Received: from o10.shared.sendgrid.net (o10.shared.sendgrid.net [173.193.132.135]) by neon.ruby-lang.org (Postfix) with ESMTPS id 3B12D12045C for ; Sat, 19 Dec 2015 10:39:56 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.me; h=from:to:references:subject:mime-version:content-type:content-transfer-encoding:list-id; s=smtpapi; bh=5IDKWgB7VvfKmTVTRkRFVX2Nmtk=; b=acC1QeDlUe8i815mFW GB/4hkY0u6eCPTgh4GfgtqbZdlsqqBzjllrP7tk84UluiEfzz2Md31If3JHR1Lsx Cr4esIKUhbIMGOke/K3aajhIwPB9m4ctCMF/vyNEUFtfZwDXEubDAPApEIatSqji Hw2b7RfaDjmxEoYCUHrSxPVbg= Received: by filter0793p1mdw1.sendgrid.net with SMTP id filter0793p1mdw1.15706.5674B56923 2015-12-19 01:39:53.415407707 +0000 UTC Received: from herokuapp.com (ec2-54-204-163-65.compute-1.amazonaws.com [54.204.163.65]) by ismtpd0001p1iad1.sendgrid.net (SG) with ESMTP id r7CDK07bTtiBiwdBG9VrJg Sat, 19 Dec 2015 01:39:53.126 +0000 (UTC) Date: Sat, 19 Dec 2015 01:39:53 +0000 From: ko1@atdot.net To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Redmine-MailingListIntegration-Message-Ids: 46966 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 11822 X-Redmine-Issue-Author: headius X-Redmine-Issue-Assignee: ko1 X-Redmine-Sender: ko1 X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS5C9Sjfu30OlRdD/EMGBXC3dmpP8EbBltUVYd 63jMH35ZSeGci+2cIRtohn3iI1lgi4PJtcY2lCA2OlgMtRTojqJ1C8KMUm3RcWxlP4rqtDhrmyMq+a VX95bAF5j9VPb+tVKpIeWZSuCWZj5BMydOCx X-ML-Name: ruby-core X-Mail-Count: 72372 Subject: [ruby-core:72372] [Ruby trunk - Bug #11822] Semantics of Queue#pop after close are wrong X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #11822 has been updated by Koichi Sasada. Petr Chalupa wrote: > Could you clarify for me following cases: What does pop do when called on empty closed queue? What does close do about already blocked threads when it's empty? > The documentation does not specifies this. > What does pop do when called on empty closed queue? returns nil. > What does close do about already blocked threads when it's empty? I assume 'already blocked threads' are consumer threads. They are resumed, and get nil. You can verify with code. ```ruby q = Queue.new q.close p q.pop ``` ```ruby q = Queue.new Thread.new{ sleep 1 q.close } p q.pop ``` ---------------------------------------- Bug #11822: Semantics of Queue#pop after close are wrong https://bugs.ruby-lang.org/issues/11822#change-55663 * Author: Charles Nutter * Status: Open * Priority: Normal * Assignee: Koichi Sasada * ruby -v: * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- Current test/ruby/thread/test_queue.rb test_close has the following assertion that seems wrong to me: ```ruby def test_close [->{Queue.new}, ->{SizedQueue.new 3}].each do |qcreate| q = qcreate.call assert_equal false, q.closed? q << :something assert_equal q, q.close assert q.closed? assert_raise_with_message(ClosedQueueError, /closed/){q << :nothing} assert_equal q.pop, :something # <<< THIS ONE assert_nil q.pop assert_nil q.pop # non-blocking assert_raise_with_message(ThreadError, /queue empty/){q.pop(non_block=true)} end end ``` Once a queue is closed, I don't think it should ever return a result anymore. The queue should be cleared and pop should always return nil. In r52691, ko1 states that "deq'ing on closed queue returns nil, always." This test does not match that behavior. -- https://bugs.ruby-lang.org/