89 lines
2.3 KiB
Ruby
89 lines
2.3 KiB
Ruby
# Copyright 2013 Mirantis, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
require 'thread'
|
|
|
|
module Astute
|
|
module Server
|
|
|
|
class TaskQueue
|
|
include Enumerable
|
|
|
|
attr_reader :current_task_id
|
|
attr_reader :current_task_method
|
|
|
|
def initialize
|
|
@queue = []
|
|
@semaphore = Mutex.new
|
|
@current_task_id = nil
|
|
@current_task_method = nil
|
|
end
|
|
|
|
def add_task(data)
|
|
@semaphore.synchronize { data.compact.each { |t| @queue << t } }
|
|
end
|
|
|
|
def replace_task(replacing_task_id, new_task_data)
|
|
@semaphore.synchronize do
|
|
@queue.map! { |x| find_task_id(x) == replacing_task_id ? new_task_data : x }.flatten!
|
|
end
|
|
end
|
|
|
|
def remove_task(replacing_task_id)
|
|
replace_task(replacing_task_id, nil)
|
|
end
|
|
|
|
def clear_queue
|
|
@semaphore.synchronize { @queue.map! { |x| nil } }
|
|
end
|
|
|
|
def task_in_queue?(task_id)
|
|
@semaphore.synchronize { @queue.find { |t| find_task_id(t) == task_id } }
|
|
end
|
|
|
|
def each(&block)
|
|
@queue.each do |task|
|
|
@semaphore.synchronize do
|
|
next if task.nil?
|
|
@current_task_id = find_task_id(task)
|
|
@current_task_method = find_task_method(task)
|
|
end
|
|
|
|
if block_given?
|
|
block.call task
|
|
else
|
|
yield task
|
|
end
|
|
end
|
|
ensure
|
|
@semaphore.synchronize do
|
|
@current_task_id = nil
|
|
@current_task_method = nil
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def find_task_id(data)
|
|
data && data['args'] && data['args']['task_uuid'] ? data['args']['task_uuid'] : nil
|
|
end
|
|
|
|
def find_task_method(data)
|
|
data && data['method']
|
|
end
|
|
|
|
end
|
|
|
|
end #Server
|
|
end #Astute |