diff options
Diffstat (limited to 'lib/evendoors')
| -rw-r--r-- | lib/evendoors/spin.rb | 159 | 
1 files changed, 70 insertions, 89 deletions
diff --git a/lib/evendoors/spin.rb b/lib/evendoors/spin.rb index 93921a7..2ba63a4 100644 --- a/lib/evendoors/spin.rb +++ b/lib/evendoors/spin.rb @@ -23,121 +23,102 @@ module EvenDoors      #      class Spin < Room          # -        @pool = {}          # per particle class free list -        @sys_fifo = []      # system particles fifo list -        @app_fifo = []      # application particles fifo list -        # -        @spin = nil -        @run = false -        @debug_routing = false -        @debug_errors = false -        # -        class << self +        def initialize n, o={} +            super n, nil              # -            attr_accessor :spin, :run, :debug_routing, :debug_errors +            @pool = {}          # per particle class free list +            @sys_fifo = []      # system particles fifo list +            @app_fifo = []      # application particles fifo list              # -            def to_json *a -                { -                    'sys_fifo'      => @sys_fifo, -                    'app_fifo'      => @app_fifo, -                    'debug_routing' => @debug_routing, -                    'debug_errors'  => @debug_errors -                }.to_json(*a) -            end +            @run = false +            @debug_errors = o[:debug_errors]||o['debug_errors']||false +            @debug_routing = o[:debug_routing]||o['debug_routing']||false              # -            def static_json_create o -                @debug_routing = o['debug_routing'] -                @debug_errors = o['debug_errors'] +            if not o.empty? +                o['spots'].each do |name,spot| +                    add_spot EvenDoors::Room.json_create spot +                end if o['spots']                  o['app_fifo'].each do |particle|                      @app_fifo << EvenDoors::Particle.json_create(particle) -                end +                end if o['app_fifo']                  o['sys_fifo'].each do |particle|                      @sys_fifo <<  EvenDoors::Particle.json_create(particle) -                end -            end -            # -            def release_p p -                # hope there is no circular loop -                while p2=p.merged_shift -                    release_p p2 -                end -                ( @pool[p.class] ||= [] ) << p -            end -            # -            def require_p p_kls -                l = @pool[p_kls] -                return p_kls.new if l.nil? -                p = l.pop -                return p_kls.new if p.nil? -                p.reset! -                p -            end -            # -            def send_p p -                @app_fifo << p -            end -            # -            def send_sys_p p -                @sys_fifo << p -            end -            # -            def spin! -                while @run and (@sys_fifo.length>0 or @app_fifo.length>0) -                    while @run and @sys_fifo.length>0 -                        p = @sys_fifo.shift -                        p.dst.process_sys_p p -                    end -                    while @run and @app_fifo.length>0 -                        p = @app_fifo.shift -                        p.dst.process_p p -                        break -                    end -                end -            end -            # -            def clear! -                @spin= nil -                @pool.clear -                @sys_fifo.clear -                @app_fifo.clear +                end if o['sys_fifo']              end -            #          end          # -        def initialize n, args={} -            super n, nil -            raise EvenDoors::Exception.new "do not try to initialize more than one spin" if not self.class.spin.nil? -            self.class.spin = self -            self.class.debug_errors = args[:debug_errors] || false -            self.class.debug_routing = args[:debug_routing] || false -        end +        attr_accessor :run, :debug_errors, :debug_routing          #          def to_json *a              { -                'kls'   => self.class.name, -                'name'  => @name, -                'spots' => @spots, -                'static' => EvenDoors::Spin +                'kls'           => self.class.name, +                'name'          => @name, +                'spots'         => @spots, +                'sys_fifo'      => @sys_fifo, +                'app_fifo'      => @app_fifo, +                'debug_errors'  => @debug_errors, +                'debug_routing' => @debug_routing              }.to_json(*a)          end          #          def self.json_create o              raise EvenDoors::Exception.new "JSON #{o['kls']} != #{self.name}" if o['kls'] != self.name -            spin = self.new(o['name']) -            o['spots'].each do |name,spot| -                spin.add_spot EvenDoors::Room.json_create spot +            self.new o['name'], o +        end +        # +        def clear! +            @pool.clear +            @sys_fifo.clear +            @app_fifo.clear +        end +        # +        # +        def release_p p +            # hope there is no circular loop +            while p2=p.merged_shift +                release_p p2              end -            EvenDoors::Spin.static_json_create o['static'] -            spin +            ( @pool[p.class] ||= [] ) << p +        end +        # +        def require_p p_kls +            l = @pool[p_kls] +            return p_kls.new if l.nil? +            p = l.pop +            return p_kls.new if p.nil? +            p.reset! +            p +        end +        # +        def send_p p +            @app_fifo << p +        end +        # +        def send_sys_p p +            @sys_fifo << p          end          #          def spin!              @spots.values.each do |spot| spot.start! end -            self.class.run = true -            self.class.spin! +            @run = true +            while @run and (@sys_fifo.length>0 or @app_fifo.length>0) +                while @run and @sys_fifo.length>0 +                    p = @sys_fifo.shift +                    p.dst.process_sys_p p +                end +                while @run and @app_fifo.length>0 +                    p = @app_fifo.shift +                    p.dst.process_p p +                    break +                end +            end              @spots.values.each do |spot| spot.stop! end          end          # +        def stop! +            @run=false +        end +        #      end      #  end  | 
