Class: God::Driver

Inherits:
Object
  • Object
show all
Defined in:
lib/god/driver.rb

Overview

The Driver class is responsible for scheduling all of the events for a given Task.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(task) ⇒ Driver

Instantiate a new Driver and start the scheduler loop to handle events.

task - The Task this Driver belongs to.



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# File 'lib/god/driver.rb', line 174

def initialize(task)
  @task = task
  @events = God::DriverEventQueue.new

  @thread = Thread.new do
    loop do
      begin
        @events.pop.handle_event
      rescue ThreadError => e
        # queue is empty
        break
      rescue Object => e
        message = format("Unhandled exception in driver loop - (%s): %s\n%s",
                         e.class, e.message, e.backtrace.join("\n"))
        applog(nil, :fatal, message)
      end
    end
  end
end

Instance Attribute Details

#threadObject (readonly)

The Thread running the driver loop.



169
170
171
# File 'lib/god/driver.rb', line 169

def thread
  @thread
end

Instance Method Details

#clear_eventsObject

Clear all events for this Driver.

Returns nothing.



204
205
206
# File 'lib/god/driver.rb', line 204

def clear_events
  @events.clear
end

#in_driver_context?Boolean

Check if we’re in the driver context.

Returns true if in driver thread, false if not.

Returns:

  • (Boolean)


197
198
199
# File 'lib/god/driver.rb', line 197

def in_driver_context?
  Thread.current == @thread
end

#message(name, args = []) ⇒ Object

Queue an asynchronous message.

name - The Symbol name of the operation. args - An optional Array of arguments.

Returns nothing.



221
222
223
# File 'lib/god/driver.rb', line 221

def message(name, args = [])
  @events.push(DriverOperation.new(@task, name, args))
end

#schedule(condition, delay = condition.interval) ⇒ Object

Create and schedule a new DriverEvent.

condition - The Condition. delay - The Numeric number of seconds to delay (default: interval

defined in condition).

Returns nothing.



232
233
234
235
236
# File 'lib/god/driver.rb', line 232

def schedule(condition, delay = condition.interval)
  applog(nil, :debug, "driver schedule #{condition} in #{delay} seconds")

  @events.push(DriverEvent.new(delay, @task, condition))
end

#shutdownObject

Shutdown the DriverEventQueue threads.

Returns nothing.



211
212
213
# File 'lib/god/driver.rb', line 211

def shutdown
  @events.shutdown
end