         # File lib/eventmachine.rb, line 223
    223:   def self.run blk=nil, tail=nil, &block
    224:     @tails ||= []
    225:     tail and @tails.unshift(tail)
    226:
    227:     if reactor_running?
    228:       (b = blk || block) and b.call # next_tick(b)
    229:     else
    230:       @conns = {}
    231:       @acceptors = {}
    232:       @timers = {}
    233:       @wrapped_exception = nil
    234:       begin
    235:         @reactor_running = true
    236:         initialize_event_machine
    237:         (b = blk || block) and add_timer(0, b)
    238:         if @next_tick_queue && !@next_tick_queue.empty?
    239:           add_timer(0) { signal_loopbreak }
    240:         end
    241:         @reactor_thread = Thread.current
    242:         run_machine
    243:       ensure
    244:         begin
    245:           release_machine
    246:         ensure
    247:           if @threadpool
    248:             @threadpool.each { |t| t.exit }
    249:             @threadpool.each { |t| t.kill! if t.alive? }
    250:             @threadqueue = nil
    251:             @resultqueue = nil
    252:           end
    253:           @threadpool = nil
    254:           @next_tick_queue = nil
    255:         end
    256:         @reactor_running = false
    257:         @reactor_thread = nil
    258:       end
    259:
    260:       until @tails.empty?
    261:         @tails.pop.call
    262:       end
    263:
    264:       raise @wrapped_exception if @wrapped_exception
    265:     end
    266:   end