class DpStmMap::ClientTransactionManager
Public Class Methods
new(current_values, reference_counts, transaction_log)
click to toggle source
# File lib/dp_stm_map/Manager.rb, line 317 def initialize current_values, reference_counts, transaction_log @current_values=current_values @reference_counts=reference_counts @transaction_log=transaction_log end
Public Instance Methods
apply_transaction(transitions, new_values)
click to toggle source
# File lib/dp_stm_map/Manager.rb, line 324 def apply_transaction transitions, new_values values_to_remove=Set.new values_to_add={} references_to_change={} transitions.each do |k,(old,new)| current=@current_values[k] raise StaleTransactionError, "transaction changing stale state" if (current != old) next if old == new if new && !@reference_counts.has_references?(new) unless new_values.has_key? new raise StaleTransactionError, "referencing not existing data" else values_to_add[new]=new_values[new] end end end transitions.each do |k,(old,new)| if (old != new) values_to_remove << old references_to_change[k]=new @current_values[k]=new @reference_counts.add_reference(new) if new @reference_counts.remove_reference(old) if old end end values_to_remove=values_to_remove.select {|v| v && !@reference_counts.has_references?(v)} # unless references_to_change.empty? @transaction_log.store_transaction references_to_change, values_to_add, values_to_remove.to_set.to_a # end end