Skip to content

Commit fbb2e1f

Browse files
committed
Merge pull request #297 from ruby-concurrency/refactor/catomic-reference-get_and_set
CAtomicReference#get_and_set compares read value on update.
2 parents d6a3fa1 + 8eb446b commit fbb2e1f

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

Gemfile

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,18 @@ group :development do
77
gem 'rake', '~> 10.4.2'
88
gem 'rake-compiler', '~> 0.9.5'
99
gem 'gem-compiler', '~> 0.3.0'
10-
gem 'benchmark-ips', '~> 2.1.1'
10+
gem 'benchmark-ips', '~> 2.2.0'
11+
12+
# documentation
13+
gem 'countloc', '~> 0.4.0', :platforms => :mri, :require => false
14+
gem 'yard', '~> 0.8.7.6', :require => false
15+
gem 'inch', '~> 0.6.2', :platforms => :mri, :require => false
16+
gem 'redcarpet', '~> 3.2.3', platforms: :mri # understands github markdown
1117
end
1218

1319
group :testing do
1420
gem 'rspec', '~> 3.2.0'
15-
gem 'simplecov', '~> 0.9.2', :require => false
16-
gem 'coveralls', '~> 0.7.11', :require => false
21+
gem 'simplecov', '~> 0.10.0', :require => false
22+
gem 'coveralls', '~> 0.8.1', :require => false
1723
gem 'timecop', '~> 0.7.3'
1824
end
19-
20-
group :documentation do
21-
gem 'countloc', '~> 0.4.0', :platforms => :mri, :require => false
22-
gem 'yard', '~> 0.8.7.6', :require => false
23-
gem 'inch', '~> 0.5.10', :platforms => :mri, :require => false
24-
gem 'redcarpet', '~> 3.2.2', platforms: :mri # understands github markdown
25-
end

ext/concurrent/atomic_reference.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,13 @@ VALUE ir_set(VALUE self, VALUE new_value) {
5050
}
5151

5252
VALUE ir_get_and_set(VALUE self, VALUE new_value) {
53-
VALUE old_value = ir_get(self);
54-
ir_set(self, new_value);
55-
return old_value;
53+
VALUE old_value;
54+
for (;;) {
55+
old_value = ir_get(self);
56+
if (ir_compare_and_set(self, old_value, new_value) == Qtrue) {
57+
return old_value;
58+
}
59+
}
5660
}
5761

5862
VALUE ir_compare_and_set(volatile VALUE self, VALUE expect_value, VALUE new_value) {

0 commit comments

Comments
 (0)