diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2012-05-14 10:42:54 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2012-05-14 10:42:54 +0200 |
commit | 1502352b31032cda4b4e555613105edf83584c18 (patch) | |
tree | df5d2aa9044a103ee8fb35c87d7518a67446083f | |
parent | 244778d885ff8555448ee723441e8b82eadc06a8 (diff) | |
download | edoors-ruby-1502352b31032cda4b4e555613105edf83584c18.zip edoors-ruby-1502352b31032cda4b4e555613105edf83584c18.tar.gz |
test_evendoors: implement hibernate/resume
-rw-r--r-- | test/test_evendoors.rb | 112 |
1 files changed, 85 insertions, 27 deletions
diff --git a/test/test_evendoors.rb b/test/test_evendoors.rb index 21cbb9c..833c085 100644 --- a/test/test_evendoors.rb +++ b/test/test_evendoors.rb @@ -3,31 +3,58 @@ require 'evendoors' +HBN_PATH='hibernate.json' # class InputDoor < EvenDoors::Door # - def start! - puts " * start #{self.class.name} #{@path}" if @spin.debug_routing + @count = 0 + # + class << self + attr_accessor :count + end + # + def initialize n, p + super n, p @lines = [ "#{name} says : hello", "world ( from #{path} )" ] + @idx = 0 + end + # + def start! + puts " -> start #{self.class.name} (#{@path})" + # stimulate myself p = require_p EvenDoors::Particle p.set_dst! EvenDoors::ACT_GET, path send_p p end # - # def stop! - # puts " * stop #{self.class.name} #{@path}" if @spin.debug_routing - # end + def stop! + puts " >- stop #{self.class.name} (#{@path})" + end + # + def hibernate! + puts " !! hibernate #{self.class.name} (#{@path})" + # we want to remember where we are in the data flow + {'idx'=>@idx} + end + # + def resume! o + puts " !! resume #{self.class.name} (#{@path})" + # restore idx + @idx = o['idx'] + end # def receive_p p - puts " * #{self.class.name} receive_p : #{p.action}" if @spin.debug_routing + puts " @ #{self.class.name} (#{@path}) receive_p : #{p.action}" if p.action==EvenDoors::ACT_GET p.reset! - p.set_data 'line', @lines.shift + p.set_data 'line', @lines[@idx] p.set_data 'f0', 'v0' p.set_data 'f1', 'v1' p.set_data 'f2', 'v2' send_p p - if @lines.length>0 + @idx+=1 + if @idx<@lines.length + # there is more to read, restimulate myself p = require_p EvenDoors::Particle p.set_dst! EvenDoors::ACT_GET, name send_p p @@ -36,24 +63,47 @@ class InputDoor < EvenDoors::Door # we can release it or let the Door do it release_p p end + # I want to hibernate now! + self.class.count+=1 + if self.class.count==3 + p = require_p EvenDoors::Particle + p[EvenDoors::FIELD_HIBERNATE_PATH] = HBN_PATH + p.set_dst! EvenDoors::SYS_ACT_HIBERNATE + send_sys_p p + end end # end # class ConcatBoard < EvenDoors::Board # + def initialize n, p, m=false + super n, p + @manual = m + end + # + def start! + puts " -> start #{self.class.name} (#{@path})" + end + # + def stop! + puts " >- stop #{self.class.name} (#{@path})" + end + # def receive_p p - puts " * #{self.class.name} receive_p : #{p.action}" if @spin.debug_routing + puts " @ #{self.class.name} receive_p : #{p.action}" if p.action==EvenDoors::ACT_ERROR # else - # MANUALLY - # p2 = p.merged_shift - # p.set_data 'line', (p.data('line')+' '+p2.data('line')) - # release_p p2 - # - # Or let the system do it - p.set_data 'line', (p.data('line')+' '+p.merged(0).data('line')) + if @manual + # cleanup unnecessary p2 Particle + p2 = p.merged_shift + p.set_data 'line', (p.data('line')+' '+p2.data('line')) + release_p p2 + else + # Or let the system do it + p.set_data 'line', (p.data('line')+' '+p.merged(0).data('line')) + end send_p p end end @@ -62,21 +112,26 @@ end # class OutputDoor < EvenDoors::Door # - # def start! - # puts " * start #{self.class.name} #{@path}" if @spin.debug_routing - # end + def initialize n, p, c=false + super n, p + @clean = c + end # - # def stop! - # puts " * stop #{self.class.name} #{@path}" if @spin.debug_routing - # end + def start! + puts " -> start #{self.class.name} (#{@path})" + end + # + def stop! + puts " >- stop #{self.class.name} (#{@path})" + end # def receive_p p - if @spin.debug_routing - puts " * #{self.class.name} receive_p : #{@path} : DATA #{p.get_data('line')}" + puts " #==> #{self.class.name} (#{@path}) receive_p : #{p.get_data('line')}" + if @clean + release_p p else - puts p.get_data 'line' + # we do nothing EvenDoors::Door#process_p will detect it and release it end - # we do nothing EvenDoors::Door#process_p will detect it and release it end # end @@ -90,7 +145,7 @@ input0 = InputDoor.new 'input0', room0 output0 = OutputDoor.new 'output0', room0 # input1 = InputDoor.new 'input1', room1 -output1 = OutputDoor.new 'output1', room1 +output1 = OutputDoor.new 'output1', room1, true concat1 = ConcatBoard.new 'concat1', room1 # room0.add_link EvenDoors::Link.new('input0', 'output0', nil, nil, nil) @@ -106,5 +161,8 @@ room1.send_sys_p p0 # send_sys_p -> room0 -> spin -> room1 -> input1 # spin.spin! # +dom0 = EvenDoors::Spin.resume! HBN_PATH +dom0.spin! +File.unlink HBN_PATH if File.exists? HBN_PATH # # EOF |