mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-04-28 10:53:37 +00:00
147 lines
2.8 KiB
Ruby
147 lines
2.8 KiB
Ruby
# based on uwsgidecorators.py
|
|
|
|
if UWSGI.masterpid == 0
|
|
raise "you have to enable the uWSGI master process to use this module"
|
|
end
|
|
|
|
def get_free_signal()
|
|
for signum in 0..255
|
|
if not UWSGI.signal_registered(signum)
|
|
return signum
|
|
end
|
|
end
|
|
end
|
|
|
|
$postfork_chain = []
|
|
$mulefunc_list = []
|
|
$spoolfunc_list = []
|
|
|
|
module UWSGI
|
|
module_function
|
|
def post_fork_hook()
|
|
$postfork_chain.each {|func| func.call }
|
|
end
|
|
|
|
module_function
|
|
def spooler(args)
|
|
$spoolfunc_list[args['ud_spool_func'].to_i].call(args)
|
|
end
|
|
|
|
module_function
|
|
def mule_msg_hook(message)
|
|
service = Marshal.load(message)
|
|
if service['service'] == 'uwsgi_mulefunc'
|
|
mulefunc_manager(service)
|
|
end
|
|
end
|
|
end
|
|
|
|
def timer(secs, target='', &block)
|
|
freesig = get_free_signal
|
|
UWSGI.register_signal(freesig, target, block)
|
|
UWSGI.add_timer(freesig, secs)
|
|
end
|
|
|
|
def rbtimer(secs, target='', &block)
|
|
freesig = get_free_signal
|
|
UWSGI.register_signal(freesig, target, block)
|
|
UWSGI.add_rb_timer(freesig, secs)
|
|
end
|
|
|
|
def filemon(file, target='', &block)
|
|
freesig = get_free_signal
|
|
UWSGI.register_signal(freesig, target, block)
|
|
UWSGI.add_file_monitor(freesig, file)
|
|
end
|
|
|
|
def cron(minute, hour, day, month, dayweek, target='', &block)
|
|
freesig = get_free_signal
|
|
UWSGI.register_signal(freesig, target, block)
|
|
UWSGI.add_cron(freesig, minute, hour, day, month, dayweek)
|
|
end
|
|
|
|
def signal(signum, target='', &block)
|
|
UWSGI.register_signal(signum, target, block)
|
|
end
|
|
|
|
def postfork(&block)
|
|
$postfork_chain << block
|
|
end
|
|
|
|
class SpoolProc < Proc
|
|
def initialize(&block)
|
|
@block = block
|
|
@id = (($spoolfunc_list << block).length-1).to_s
|
|
end
|
|
|
|
def call(args)
|
|
args['ud_spool_func'] = @id
|
|
UWSGI::send_to_spooler(args)
|
|
end
|
|
end
|
|
|
|
def rpc(name, &block)
|
|
if block.arity <= 0
|
|
UWSGI.register_rpc(name, block, 0)
|
|
else
|
|
UWSGI.register_rpc(name, block, block.arity)
|
|
end
|
|
end
|
|
|
|
def mulefunc_manager(service)
|
|
$mulefunc_list[service['func']].real_call(service['args'])
|
|
end
|
|
|
|
class MuleFunc < Proc
|
|
|
|
def initialize(id=0, &block)
|
|
@id = id
|
|
@block = block
|
|
@func_pos = (($mulefunc_list << self).length)-1
|
|
end
|
|
|
|
def real_call(*args)
|
|
@block.call(*args)
|
|
end
|
|
|
|
def call(*args)
|
|
UWSGI.mule_msg( Marshal.dump( {
|
|
'service' => 'uwsgi_mulefunc',
|
|
'func' => @func_pos,
|
|
'args'=> args
|
|
}), @id)
|
|
end
|
|
|
|
end
|
|
|
|
class MuleProc < Proc
|
|
def initialize(id, block)
|
|
@id = id
|
|
@block = block
|
|
end
|
|
|
|
def call()
|
|
if UWSGI.mule_id == @id
|
|
@block.call
|
|
end
|
|
end
|
|
end
|
|
|
|
class MuleLoopProc < MuleProc
|
|
def call()
|
|
if UWSGI.mule_id == @id
|
|
loop do
|
|
@block.call
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def mule(id, &block)
|
|
$postfork_chain << MuleProc.new(id, block)
|
|
end
|
|
|
|
def muleloop(id, &block)
|
|
$postfork_chain << MuleLoopProc.new(id, block)
|
|
end
|