# class DBus::Main

# `Main` event loop class.¶ ↑

`Class` that takes care of handling message and signal events asynchronously. Note: This is a native implement and therefore does not integrate with a graphical widget set main loop.

### Public Class Methods

new() click to toggle source

Create a new main event loop.

        # File lib/dbus/bus.rb
    704 def initialize
    705   @buses = {}
    706   @quitting = false
    707 end

### Public Instance Methods

<<(bus) click to toggle source

Add a bus to the list of buses to watch for events.

        # File lib/dbus/bus.rb
    710 def <<(bus)
    711   @buses[bus.message_queue.socket] = bus
    712 end

quit() click to toggle source

Quit a running main loop, to be used eg. from a signal handler

        # File lib/dbus/bus.rb
    715 def quit
    716   @quitting = true
    717 end

run() click to toggle source

Run the main loop. This is a blocking call!

        # File lib/dbus/bus.rb
    720 def run
    721   # before blocking, empty the buffers
    722   # https://bugzilla.novell.com/show_bug.cgi?id=537401
    723   @buses.each_value do |b|
    724     while (m = b.message_queue.message_from_buffer_nonblock)
    725       b.process(m)
    726     end
    727   end
    728   while !@quitting && !@buses.empty?
    729     ready = IO.select(@buses.keys, [], [], 5) # timeout 5 seconds
    730     next unless ready # timeout exceeds so continue unless quitting
    731     ready.first.each do |socket|
    732       b = @buses[socket]
    733       begin
    734         b.message_queue.buffer_from_socket_nonblock
    735       rescue EOFError, SystemCallError
    736         @buses.delete socket # this bus died
    737         next
    738       end
    739       while (m = b.message_queue.message_from_buffer_nonblock)
    740         b.process(m)
    741       end
    742     end
    743   end
    744 end