ruby-core

Mailing list archive

[#120073] [Ruby master Feature#20925] Allow boolean operators at beginning of line to continue previous line — "Dan0042 (Daniel DeLorme) via ruby-core" <ruby-core@...>

Issue #20925 has been reported by Dan0042 (Daniel DeLorme).

12 messages 2024/12/01

[#120141] [Ruby master Bug#20937] "can't set length of shared string" error when using OpenSSL::Cipher#update with buffer — "akiellor (Andrew Kiellor) via ruby-core" <ruby-core@...>

Issue #20937 has been reported by akiellor (Andrew Kiellor).

9 messages 2024/12/09

[#120174] [Ruby master Bug#20943] Constant defined in `Data` block — "nobu (Nobuyoshi Nakada) via ruby-core" <ruby-core@...>

Issue #20943 has been reported by nobu (Nobuyoshi Nakada).

8 messages 2024/12/11

[#120183] [Ruby master Misc#20946] Proposing tomoya ishida (@tompng) as a Ruby committer — "matsuda (Akira Matsuda) via ruby-core" <ruby-core@...>

Issue #20946 has been reported by matsuda (Akira Matsuda).

10 messages 2024/12/12

[#120189] [Ruby master Misc#20947] Propose ydah (Yudai Takada) as a Ruby committer — "yui-knk (Kaneko Yuichiro) via ruby-core" <ruby-core@...>

SXNzdWUgIzIwOTQ3IGhhcyBiZWVuIHJlcG9ydGVkIGJ5IHl1aS1rbmsgKEthbmVrbyBZdWljaGly

7 messages 2024/12/12

[#120232] [Ruby master Misc#20951] Confusing handling of timezone object's `#utc_to_local` results — "andrykonchin (Andrew Konchin) via ruby-core" <ruby-core@...>

Issue #20951 has been reported by andrykonchin (Andrew Konchin).

7 messages 2024/12/13

[#120250] [Ruby master Feature#20953] Array#fetch_values vs #values_at protocols — "zverok (Victor Shepelev) via ruby-core" <ruby-core@...>

Issue #20953 has been reported by zverok (Victor Shepelev).

11 messages 2024/12/15

[#120252] [Ruby master Bug#20955] Subtle differences with Proc#parameters for anonymous parameters — "zverok (Victor Shepelev) via ruby-core" <ruby-core@...>

SXNzdWUgIzIwOTU1IGhhcyBiZWVuIHJlcG9ydGVkIGJ5IHp2ZXJvayAoVmljdG9yIFNoZXBlbGV2

9 messages 2024/12/15

[#120283] [Ruby master Bug#20961] MMTk build on macOS missing librubygc.mmtk.bundle — "shan (Shannon Skipper) via ruby-core" <ruby-core@...>

Issue #20961 has been reported by shan (Shannon Skipper).

8 messages 2024/12/17

[#120303] [Ruby master Bug#20965] `it` vs `binding.local_variables` — "zverok (Victor Shepelev) via ruby-core" <ruby-core@...>

Issue #20965 has been reported by zverok (Victor Shepelev).

10 messages 2024/12/18

[#120315] [Ruby master Bug#20968] `Array#fetch_values` unexpected method name in stack trace — "koic (Koichi ITO) via ruby-core" <ruby-core@...>

Issue #20968 has been reported by koic (Koichi ITO).

22 messages 2024/12/19

[#120325] [Ruby master Bug#20970] `it /1/i` raises undefined method 'it' for main (NoMethodError) even if binding.local_variables includes `it` — "tompng (tomoya ishida) via ruby-core" <ruby-core@...>

Issue #20970 has been reported by tompng (tomoya ishida).

11 messages 2024/12/19

[#120335] [Ruby master Feature#20971] Deprecate `rb_path_check` — "Earlopain (Earlopain _) via ruby-core" <ruby-core@...>

Issue #20971 has been reported by Earlopain (Earlopain _).

13 messages 2024/12/19

[#120458] [Ruby master Misc#20995] exception escapes block given to IO.popen("-") in child process — "martin.dorey@... (Martin Dorey) via ruby-core" <ruby-core@...>

Issue #20995 has been reported by [email protected] (Martin Dorey).

7 messages 2024/12/31

[ruby-core:120199] [Ruby master Feature#20875] Atomic initialization for Ractor local storage

From: "ko1 (Koichi Sasada) via ruby-core" <ruby-core@...>
Date: 2024-12-12 07:17:51 UTC
List: ruby-core #120199
Issue #20875 has been updated by ko1 (Koichi Sasada).


Ah, it assigs from `Ractor.map`.

----------------------------------------
Feature #20875: Atomic initialization for Ractor local storage
https://bugs.ruby-lang.org/issues/20875#change-110958

* Author: ko1 (Koichi Sasada)
* Status: Open
----------------------------------------
## Motivation

Now there is no way to initialize Ractor local storage in multi-thread.

For example, if we want to introduce per-Ractor counter, which should be protected with a per-Ractor Mutex for multi-threading support.

```ruby

def init
  Ractor[:cnt] = 0
  Ractor[:mtx] = Mutex.new
end

def inc
  init unless Ractor[:cnt]
  Ractor[:mtx].synchronize do
    Ractor[:cnt] += 1
  end
end
```

In this code, if `inc` was called on multiple threads, `init` can be called with multiple threads and `cnt` can not be synchronized correctly.

## Proposal

Let's introduce `Ractor.local_storage_init(sym){ block }` to initialize values in Ractor local storage.

If there is no slot for `sym`, synchronize with per-Ractor mutex and call `block` and the slot will be filled with the evaluation with the block result. The return value of this method will be the filled value.
Otherwise, returning corresponding value will be returned.

The implementation is like that (in C):

```ruby
class Ractor
  def self.local_storage_init(sym)
    Ractor.per_ractor_mutex.synchronize do
      if Ractor.local_storage_has_key?(sym)
        Ractor[:sym]
      else
        Ractor[:sym] = yield
      end
    end
  end
end
```

The above examples will be rewritten with the following code:

```ruby
def inc
  Ractor.local_storage_init(:mtx) do
    Ractor[:cnt] = 0
    Mutex.new
  end.synchronize do
    Ractor[:cnt] += 1
  end
end
```

## Discussion


### Approach

There is another approach like `pthread_atfork`, maybe like `Ractor.atcreate{ init }`. A library registers a callback which will be called when a new ractor is created.
However, there are many Ractors which don't use the library, so that `atcreate` can be huge overhead for Ractor creation.

### Naming

I propose `local_storage_init`, but not sure it matches.
I also proposed `Ractor.local_variable_init(sym)`, but Matz said he doesn't like this naming because it should not be a "variable".
(there is a `Thread#thread_variable_get` method, though).

On another aspect, `lcoal_storage_init` seems it clears all of ractor local storage slots.

### Reentrancy

This proposal uses `Mutex`, so it is not reentrant. I believe it should be simple and using Monitor is too much.
(but it is not big issue, though)

## Implementation

https://github.com/ruby/ruby/pull/12014




-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- [email protected]
 To unsubscribe send an email to [email protected]
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/


In This Thread