diff options
author | Marc-Andre Lafortune <github@marc-andre.ca> | 2020-12-20 21:42:25 -0500 |
---|---|---|
committer | Marc-André Lafortune <github@marc-andre.ca> | 2020-12-23 01:08:38 -0500 |
commit | c5a445d577b786e31c420b5857ad05b954b420ec (patch) | |
tree | 3aa3ed924d9cd166364f18469a5945dbbe441792 /ext/psych/lib/psych.rb | |
parent | 3ee0ad919034fbc098939979c872d041a82c4334 (diff) |
[ruby/psych] Make Ractor-ready.
Config is Ractor-local.
Benchmarking reveals that using `Ractor.local_storage` for storing cache
is similar to accessing a constant (~15% slower).
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3953
Diffstat (limited to 'ext/psych/lib/psych.rb')
-rw-r--r-- | ext/psych/lib/psych.rb | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/ext/psych/lib/psych.rb b/ext/psych/lib/psych.rb index 0b62362198..cedf0a4ad6 100644 --- a/ext/psych/lib/psych.rb +++ b/ext/psych/lib/psych.rb @@ -632,9 +632,29 @@ module Psych private_class_method :warn_with_uplevel, :parse_caller class << self - attr_accessor :load_tags - attr_accessor :dump_tags - attr_accessor :domain_types + if defined?(Ractor) + require 'forwardable' + extend Forwardable + + class Config + attr_accessor :load_tags, :dump_tags, :domain_types + def initialize + @load_tags = {} + @dump_tags = {} + @domain_types = {} + end + end + + def config + Ractor.current[:PsychConfig] ||= Config.new + end + + def_delegators :config, :load_tags, :dump_tags, :domain_types, :load_tags=, :dump_tags=, :domain_types= + else + attr_accessor :load_tags + attr_accessor :dump_tags + attr_accessor :domain_types + end end self.load_tags = {} self.dump_tags = {} |