From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS4713 221.184.0.0/13 X-Spam-Status: No, score=-4.0 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by dcvr.yhbt.net (Postfix) with ESMTP id 59DB21F87F for ; Tue, 20 Nov 2018 15:15:35 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 4B532120F31; Wed, 21 Nov 2018 00:15:33 +0900 (JST) Received: from dcvr.yhbt.net (dcvr.yhbt.net [64.71.152.64]) by neon.ruby-lang.org (Postfix) with ESMTPS id 1E582121141 for ; Wed, 21 Nov 2018 00:15:30 +0900 (JST) Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 486D31F87F; Tue, 20 Nov 2018 15:15:28 +0000 (UTC) Date: Tue, 20 Nov 2018 15:15:28 +0000 From: Eric Wong To: ruby-core@ruby-lang.org Message-ID: <20181120151528.l5xexnabypb6e7mo@dcvr> References: <20181120084406.kcipybgonhzequ46@dcvr> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-ML-Name: ruby-core X-Mail-Count: 89909 Subject: [ruby-core:89909] Re: Thread::Light patch against r65832 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: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Koichi Sasada wrote: > On 2018/11/20 17:44, Eric Wong wrote: > > Mutex and ConditionVariable are NOT scheduling points for > > Thread::Light switching; however they may process signal > > handling and handle I/O dispatch for other native threads. > > Why not? > How to synchronize multiple Thread::Light instances (lthreads here)? I'm not sure how deadlock detection would work, and I don't think there is data race there. Main synchronization should be Queue/SizedQueue (like "mailbox" in actor model). But I think this is a good change to maintain compatibility and avoid inadvertant switching: diff --git a/vm_core.h b/vm_core.h index 9e10b321da..2244afb524 100644 --- a/vm_core.h +++ b/vm_core.h @@ -1842,24 +1842,27 @@ static inline int rb_tl_switchable(const rb_execution_context_t *ec) { const rb_thread_t *th = rb_ec_thread_ptr(ec); /* dangerous, don't allow switching inside trap handler: */ if (ec->interrupt_mask & TRAP_INTERRUPT_MASK) return 0; + /* don't switch if a Mutex is held */ + if (th->keeping_mutexes) return 0; + /* auto-fibers can switch away to root fiber */ if (rb_tl_sched_p(ec)) return 1; /* no auto-fibers, yet, but we can create and switch to them */ if (!th->root_fiber) return 1; /* root fiber can switch to auto-fibers, because ensure works */ if (th->root_fiber == ec->fiber_ptr) return 1; /* * no auto-switching away from regular Fibers because they lack * ensure support: https://bugs.ruby-lang.org/issues/595 */ return 0; } /* tracer */ (Gotta run, back in 16 hours maybe?)