Class: Kaede::DBus::Main

Inherits:
Object
  • Object
show all
Defined in:
lib/kaede/dbus/main.rb

Instance Method Summary collapse

Constructor Details

#initializeMain

Returns a new instance of Main.



8
9
10
11
# File 'lib/kaede/dbus/main.rb', line 8

def initialize
  @buses = Hash.new
  @quit_event = SleepyPenguin::EventFD.new(0, :SEMAPHORE)
end

Instance Method Details

#<<(bus) ⇒ Object



13
14
15
# File 'lib/kaede/dbus/main.rb', line 13

def <<(bus)
  @buses[bus.message_queue.socket] = bus
end

#flush_buffersObject



53
54
55
56
57
58
59
60
61
# File 'lib/kaede/dbus/main.rb', line 53

def flush_buffers
  # before blocking, empty the buffers
  # https://bugzilla.novell.com/show_bug.cgi?id=537401
  @buses.each_value do |b|
    while m = b.message_queue.message_from_buffer_nonblock
      b.process(m)
    end
  end
end

#handle_socket(socket) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/kaede/dbus/main.rb', line 40

def handle_socket(socket)
  bus = @buses[socket]
  begin
    bus.message_queue.buffer_from_socket_nonblock
  rescue EOFError, SystemCallError
    @buses.delete(socket) # this bus died
    return
  end
  while message = bus.message_queue.message_from_buffer_nonblock
    bus.process(message)
  end
end

#loopObject



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/kaede/dbus/main.rb', line 21

def loop
  flush_buffers

  epoll = prepare_epoll
  begin
    while !@buses.empty?
      epoll.wait do |events, io|
        if io == @quit_event
          io.value
          return
        end
        handle_socket(io)
      end
    end
  ensure
    epoll.close
  end
end

#prepare_epollObject



63
64
65
66
67
68
69
70
# File 'lib/kaede/dbus/main.rb', line 63

def prepare_epoll
  SleepyPenguin::Epoll.new.tap do |epoll|
    epoll.add(@quit_event, [:IN])
    @buses.each_key do |socket|
      epoll.add(socket, [:IN])
    end
  end
end

#quitObject



17
18
19
# File 'lib/kaede/dbus/main.rb', line 17

def quit
  @quit_event.incr(1)
end