Sha256: 126873c7c9940a12e2a509ab69b3b482daf4f438a96ee1a0854ac2abbec9ff70

Contents?: true

Size: 1.03 KB

Versions: 8

Compression:

Stored size: 1.03 KB

Contents

require 'thread'
require 'concurrent/atomic_reference/direct_update'
require 'concurrent/atomic_reference/numeric_cas_wrapper'

module Concurrent

  # Portable/generic (but not very memory or scheduling-efficient) fallback
  class MutexAtomic #:nodoc: all
    include Concurrent::AtomicDirectUpdate
    include Concurrent::AtomicNumericCompareAndSetWrapper

    def initialize(value = nil)
      @mutex = Mutex.new
      @value = value
    end

    def get
      @mutex.synchronize { @value }
    end
    alias value get

    def set(new_value)
      @mutex.synchronize { @value = new_value }
    end
    alias value= set

    def get_and_set(new_value)
      @mutex.synchronize do
        old_value = @value
        @value = new_value
        old_value
      end
    end
    alias swap get_and_set

    def _compare_and_set(old_value, new_value)
      return false unless @mutex.try_lock
      begin
        return false unless @value.equal? old_value
        @value = new_value
      ensure
        @mutex.unlock
      end
      true
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
concurrent-ruby-0.7.0.rc0 lib/concurrent/atomic_reference/mutex_atomic.rb
concurrent-ruby-0.7.0.rc0-x86_64-linux lib/concurrent/atomic_reference/mutex_atomic.rb
concurrent-ruby-0.7.0.rc0-x86_64-darwin-13 lib/concurrent/atomic_reference/mutex_atomic.rb
concurrent-ruby-0.7.0.rc0-x86-solaris-2.11 lib/concurrent/atomic_reference/mutex_atomic.rb
concurrent-ruby-0.7.0.rc0-x86-mingw32 lib/concurrent/atomic_reference/mutex_atomic.rb
concurrent-ruby-0.7.0.rc0-x86-linux lib/concurrent/atomic_reference/mutex_atomic.rb
concurrent-ruby-0.7.0.rc0-x64-mingw32 lib/concurrent/atomic_reference/mutex_atomic.rb
concurrent-ruby-0.7.0.rc0-java lib/concurrent/atomic_reference/mutex_atomic.rb