Class: MainLoop::Bus

Inherits:
Object
  • Object
show all
Includes:
MonitorMixin
Defined in:
lib/main_loop/bus.rb

Constant Summary collapse

EOL =

Константа конца строки (end of line)

Returns:

  • (String)
"\n".freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBus

Инициализация

Создает IO.pipe, настраивает синхронный режим, инициализирует буфер.

Examples:

bus = MainLoop::Bus.new


47
48
49
50
51
52
53
# File 'lib/main_loop/bus.rb', line 47

def initialize
  super()
  @read, @write = IO.pipe
  @read.sync = true
  @write.sync = true
  @buffer = ''
end

Instance Attribute Details

#readIO (readonly)

Returns конец канала для чтения.

Returns:

  • (IO)

    конец канала для чтения



47
48
49
# File 'lib/main_loop/bus.rb', line 47

def read
  @read
end

#writeIO (readonly)

Returns конец канала для записи.

Returns:

  • (IO)

    конец канала для записи



47
48
49
# File 'lib/main_loop/bus.rb', line 47

def write
  @write
end

Instance Method Details

#closeObject

Закрытие канала

Закрывает оба конца канала (read и write). Ошибки закрытия игнорируются (rescue nil).

Examples:

bus.close


72
73
74
75
# File 'lib/main_loop/bus.rb', line 72

def close
  @write.close rescue nil
  @read.close rescue nil
end

#closed?Boolean

Проверка закрытости канала

Returns:

  • (Boolean)

    true если любой конец канала закрыт



80
81
82
# File 'lib/main_loop/bus.rb', line 80

def closed?
  @write.closed? || @read.closed?
end

#empty?(timeout = 0) ⇒ Boolean

Проверка наличия событий

Проверяет, есть ли события в канале.

Parameters:

  • timeout (Numeric) (defaults to: 0)

    таймаут ожидания в секундах

Returns:

  • (Boolean)

    true если событий нет, false если событие доступно



61
62
63
# File 'lib/main_loop/bus.rb', line 61

def empty?(timeout = 0)
  !wait_for_event(timeout)
end

#gets(timeout) ⇒ String|nil

Блокирующее чтение события

Блокирует до получения события или таймаута. Использует Timeouter.loop для ограничения времени ожидания.

Parameters:

  • timeout (Numeric)

    таймаут ожидания в секундах

Returns:

  • (String|nil)

    прочитанное событие (без символа новой строки) или nil при таймауте



116
117
118
119
120
121
# File 'lib/main_loop/bus.rb', line 116

def gets(timeout)
  Timeouter.loop(timeout) do |t|
    line = gets_nonblock if wait_for_event(t.left)
    return line if line
  end
end

#gets_nonblockString|nil

Неблокирующее чтение строки

Читает посимвольно до конца строки (EOL). Буферизует символы и возвращает полную строку.

Returns:

  • (String|nil)

    строка (без EOL и пробелов по краям) или nil если нет данных



129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/main_loop/bus.rb', line 129

def gets_nonblock
  while (ch = @read.read_nonblock(1))
    @buffer << ch
    next if ch != MainLoop::Bus::EOL

    line = @buffer
    @buffer = ''
    return line&.strip
  end
  nil
rescue IO::WaitReadable
  nil
end

#puts(str) ⇒ Object

Отправка события

Отправляет строку в канал с потоко-безопасной синхронизацией. Автоматически добавляет конец строки.

Examples:

bus.puts("term")
bus.puts("reap:123:0")

Parameters:

  • str (String)

    событие для отправки



93
94
95
96
97
# File 'lib/main_loop/bus.rb', line 93

def puts(str)
  synchronize do
    @write.puts str.to_s
  end
end

#wait_for_event(timeout) ⇒ Array<IO>|nil

Ожидание события

Использует IO.select для ожидания события в канале.

Parameters:

  • timeout (Numeric)

    таймаут ожидания в секундах

Returns:

  • (Array<IO>|nil)

    результат IO.select или nil при таймауте



105
106
107
# File 'lib/main_loop/bus.rb', line 105

def wait_for_event(timeout)
  IO.select([@read], [], [], timeout)
end