class Atomic

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Define update methods that delegate to @ref field

Define update methods that use direct paths

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

extend Rubinius's version adding aliases and numeric logic

Public Instance Methods

_compare_and_set(expected, new)
Alias for: compare_and_set
compare_and_set(expected, new) click to toggle source
# File lib/atomic/numeric_cas_wrapper.rb, line 15
def compare_and_set(expected, new)
  if expected.kind_of? Numeric
    while true
      old = get
      
      return false unless old.kind_of? Numeric
      
      return false unless old == expected
      
      result = _compare_and_set(old, new)
      return result if result
    end
  else
    _compare_and_set(expected, new)
  end
end
compare_and_swap(expected, new)
Alias for: compare_and_set
try_update() { |old_value| ... } click to toggle source
# File lib/atomic/delegated_update.rb, line 25
def try_update
  old_value = @ref.get
  new_value = yield old_value
  unless @ref.compare_and_set(old_value, new_value)
    if $VERBOSE
      raise ConcurrentUpdateError, "Update failed"
    else
      raise ConcurrentUpdateError, "Update failed", ConcurrentUpdateError::CONC_UP_ERR_BACKTRACE
    end
  end
  new_value
end
update() { |old_value| ... } click to toggle source

Pass the current value to the given block, replacing it with the block's result. May retry if the value changes during the block's execution.

# File lib/atomic/delegated_update.rb, line 20
def update
  true until @ref.compare_and_set(old_value = @ref.get, new_value = yield(old_value))
  new_value
end