module Rex

###
# 
# This class provides a wrapper around Thread.new that can provide 
# additional features if a corresponding thread provider is set.
#
###

class ThreadFactory

	@@provider = nil
	
	def self.provider=(val)
		@@provider = val
	end

	def self.spawn(name, crit, *args, &block)
		if @@provider
			if block
				return @@provider.spawn(name, crit, *args){ |*args_copy| block.call(*args_copy) }
			else
				return @@provider.spawn(name, crit, *args)
			end
		else
			t = nil
			if block
				t = ::Thread.new(*args){ |*args_copy| block.call(*args_copy) }
			else
				t = ::Thread.new(*args)
			end
			t[:tm_name] = name
			t[:tm_crit] = crit
			t[:tm_time] = Time.now
			t[:tm_call] = caller
			return t
		end
	
	end
end

end
