The Tuplespace manages access to the tuples it contains, ensuring mutual exclusion requirements are met.
The sec option for the write, take, move, read and notify methods may either be a number of seconds or a Renewer object.
Class Public methods
new(period=60) Link
Creates a new TupleSpace. period is used to control how often to look for dead tuples after modifications to the TupleSpace.
If no dead tuples are found period seconds after the last modification, the TupleSpace will stop looking for dead tuples.
Instance Public methods
move(port, tuple, sec=nil) Link
Moves tuple to port.
# File ruby/lib/rinda/tuplespace.rb, line 484 def move(port, tuple, sec=nil) template = WaitTemplateEntry.new(self, tuple, sec) yield(template) if block_given? synchronize do entry = @bag.find(template) if entry port.push(entry.value) if port @bag.delete(entry) notify_event('take', entry.value) return port ? nil : entry.value end raise RequestExpiredError if template.expired? begin @take_waiter.push(template) start_keeper if template.expires while true raise RequestCanceledError if template.canceled? raise RequestExpiredError if template.expired? entry = @bag.find(template) if entry port.push(entry.value) if port @bag.delete(entry) notify_event('take', entry.value) return port ? nil : entry.value end template.wait end ensure @take_waiter.delete(template) end end end
notify(event, tuple, sec=nil) Link
Registers for notifications of event. Returns a NotifyTemplateEntry. See NotifyTemplateEntry for examples of how to listen for notifications.
event can be:
- ‘write’
-
A tuple was added
- ‘take’
-
A tuple was taken or moved
- ‘delete’
-
A tuple was lost after being overwritten or expiring
The TupleSpace will also notify you of the ‘close’ event when the NotifyTemplateEntry has expired.
read(tuple, sec=nil) Link
Reads tuple, but does not remove it.
# File ruby/lib/rinda/tuplespace.rb, line 521 def read(tuple, sec=nil) template = WaitTemplateEntry.new(self, tuple, sec) yield(template) if block_given? synchronize do entry = @bag.find(template) return entry.value if entry raise RequestExpiredError if template.expired? begin @read_waiter.push(template) start_keeper if template.expires template.wait raise RequestCanceledError if template.canceled? raise RequestExpiredError if template.expired? return template.found ensure @read_waiter.delete(template) end end end
read_all(tuple) Link
Returns all tuples matching tuple. Does not remove the found tuples.
take(tuple, sec=nil, &block) Link
Removes tuple
write(tuple, sec=nil) Link
Adds tuple
# File ruby/lib/rinda/tuplespace.rb, line 450 def write(tuple, sec=nil) entry = create_entry(tuple, sec) synchronize do if entry.expired? @read_waiter.find_all_template(entry).each do |template| template.read(tuple) end notify_event('write', entry.value) notify_event('delete', entry.value) else @bag.push(entry) start_keeper if entry.expires @read_waiter.find_all_template(entry).each do |template| template.read(tuple) end @take_waiter.find_all_template(entry).each do |template| template.signal end notify_event('write', entry.value) end end entry end