mirror of
https://github.com/mistergibson/gxg-web-client.git
synced 2026-08-15 03:26:00 -07:00
43 lines
884 B
Ruby
43 lines
884 B
Ruby
module Rubinius
|
|
class AtomicReference
|
|
def initialize(val=nil)
|
|
set(val) unless val.nil?
|
|
end
|
|
|
|
private :initialize
|
|
|
|
def marshal_dump
|
|
get
|
|
end
|
|
|
|
def marshal_load(val)
|
|
set(val)
|
|
end
|
|
|
|
def get
|
|
Rubinius.primitive :atomic_get
|
|
raise PrimitiveFailure, "Rubinius::AtomicReference#get primitive failed"
|
|
end
|
|
|
|
alias_method :value, :get
|
|
|
|
def set(val)
|
|
Rubinius.primitive :atomic_set
|
|
raise PrimitiveFailure, "Rubinius::AtomicReference#set primitive failed"
|
|
end
|
|
|
|
alias_method :value=, :set
|
|
|
|
def compare_and_set(old, new)
|
|
Rubinius.primitive :atomic_compare_and_set
|
|
raise PrimitiveFailure, "Rubinius::AtomicReference#compare_and_set primitive failed"
|
|
end
|
|
|
|
def get_and_set(new)
|
|
while true
|
|
val = get
|
|
return val if compare_and_set(val, new)
|
|
end
|
|
end
|
|
end
|
|
end
|