Sha256: 45556543d0f793418fcf49471501b86d4bff9329aeabb4b00741deac544fd681

Contents?: true

Size: 1.45 KB

Versions: 4

Compression:

Stored size: 1.45 KB

Contents

module Roby
    module TaskStructure
	Roby::Task.inherited_enumerable(:conflicting_model, :conflicting_models) { ValueSet.new }
	module ModelConflicts
	    def conflicts_with(model)
		conflicting_models << model
		model.conflicting_models << self
	    end

	    def conflicts_with?(model)
		each_conflicting_model do |m|
		    return true if m == model
		end
		false
	    end
	end
	Roby::Task.extend ModelConflicts

	relation :Conflicts, :noinfo => true do
	    def conflicts_with(task)
		task.event(:stop).add_precedence event(:start)
		add_conflicts(task)
	    end

	    def self.included(klass) # :nodoc:
		klass.extend ModelConflicts
		super
	    end
	end
    end

    module ConflictEventHandling
	def calling(context)
	    super if defined? super
	    return unless symbol == :start

	    # Check for conflicting tasks
	    result = nil
	    task.each_conflicts do |conflicting_task|
		result ||= ValueSet.new
		result << conflicting_task
	    end

	    if result
		Roby.decision_control.conflict(task, result)
	    end

	    # Add the needed conflict relations
	    models = task.class.conflicting_models
	    for model in models
		if candidates = plan.task_index.by_model[model]
		    for t in candidates
			t.conflicts_with task if t.pending?
		    end
		end
	    end
	end
    
	def fired(event)
	    super if defined? super

	    if symbol == :stop
		TaskStructure::Conflicts.remove(task)
	    end
	end
    end
    Roby::TaskEventGenerator.include ConflictEventHandling
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
roby-0.7.1 lib/roby/relations/conflicts.rb
roby-0.7.2 lib/roby/relations/conflicts.rb
roby-0.7.3 lib/roby/relations/conflicts.rb
roby-0.7 lib/roby/relations/conflicts.rb