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-Status: No, score=-3.9 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY 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 4BC061F4B4 for ; Mon, 7 Dec 2020 04:27:08 +0000 (UTC) Received: from neon.ruby-lang.org (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 7C4A31209FC; Mon, 7 Dec 2020 13:26:22 +0900 (JST) Received: from xtrwkhkc.outbound-mail.sendgrid.net (xtrwkhkc.outbound-mail.sendgrid.net [167.89.16.28]) by neon.ruby-lang.org (Postfix) with ESMTPS id 983AD120A63 for ; Mon, 7 Dec 2020 13:26:19 +0900 (JST) Received: by filterdrecv-p3iad2-6544fb89f6-cgdj2 with SMTP id filterdrecv-p3iad2-6544fb89f6-cgdj2-19-5FCDAF11-E 2020-12-07 04:26:57.309382228 +0000 UTC m=+285866.881004314 Received: from herokuapp.com (unknown) by ismtpd0008p1iad2.sendgrid.net (SG) with ESMTP id sWIPOToFR46aFwvzHNx7AA for ; Mon, 07 Dec 2020 04:26:57.283 +0000 (UTC) Date: Mon, 07 Dec 2020 04:26:57 +0000 (UTC) From: marcandre-ruby-core@marc-andre.ca Message-ID: References: Mime-Version: 1.0 X-Redmine-MailingListIntegration-Message-Ids: 77144 X-Redmine-Project: ruby-master X-Redmine-Issue-Tracker: Feature X-Redmine-Issue-Id: 17323 X-Redmine-Issue-Author: ko1 X-Redmine-Sender: marcandre 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: =?us-ascii?Q?6=2FIMxCQLDposcQf5wmbDAtfaKduBAO0bKyhL3BGZtMQ5q7K2TvpbN6A7JIyt9E?= =?us-ascii?Q?aO0w6C8uvTKMrzgwadelIy5b+dmcD6a5VYe4MSD?= =?us-ascii?Q?5TGvm8EzOyr=2FfASp4sVCEls1Fuh66NOAZ2r1rG3?= =?us-ascii?Q?Z1tW+aUcCLcCAKDV6uglR9Vb+JrtB8Bjj+1WyFs?= =?us-ascii?Q?Jw7vfg7CV1M3btqoHewoMgMV0CdvN8GGiS=2Fuq6s?= =?us-ascii?Q?sYw4VzL6pZxshITsy1lzVpQgtQGVHYHQFivPh5?= To: ruby-core@ruby-lang.org X-Entity-ID: b/2+PoftWZ6GuOu3b0IycA== X-ML-Name: ruby-core X-Mail-Count: 101275 Subject: [ruby-core:101275] [Ruby master Feature#17323] Ractor::LVar to provide ractor-local storage 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" Issue #17323 has been updated by marcandre (Marc-Andre Lafortune). In the meantime, I create the gem `ractor-local_variable`. Code here: https://github.com/ractor-tools/ractor-local_variable/ Of course, `Mutex` is Ractor local... I used a `Ractor` as a basic mutex, there's no other way, right? ---------------------------------------- Feature #17323: Ractor::LVar to provide ractor-local storage https://bugs.ruby-lang.org/issues/17323#change-88955 * Author: ko1 (Koichi Sasada) * Status: Open * Priority: Normal ---------------------------------------- Ruby supports thread and fiber local storage: * `Thread#[sym]` provides *Fiber* local storage * `Thread#thread_variable_get(sym)` These APIs can access other threads/fibers like that: ```ruby th = Thread.new{ Thread.current.thread_variable_set(:a, 10) } th.join # access from main thread to child thread p th.thread_variable_get(:a) ``` To make Ractor local storage, this kind of feature should not be allowed to protect isolation. This ticket propose alternative API `Ractor::LVar` that allows to provide Ractor local variable. ```ruby LV1 = Ractor::LVar.new p LV1.value #=> nil # default value LV1.value = 'hello' # can set unshareable objects because LVar is ractor local. Ractor.new do LV1.value = 'world' # set Ractor local variable end.take p LV1.value #=> 'hello' # Lvar.new can accept default_proc which should be isolated Proc. LV2 = Ractor::LVar.new{ "x" * 4 } p LV2.value #=> "xxxx" LV2.value = 'yyy' Ractor.new do p LV2.value #=> 'xxx' end p LV2.value #=> 'yyy' ``` This API doesn't support accessing from other ractors. `Ractor::LVar` is from `Ractor::TVar`, but I have no strong opinion about it. For example, `Ractor::LocalVariable` is longer and clearer. Implementation: https://github.com/ruby/ruby/pull/3762 -- https://bugs.ruby-lang.org/