Comparison

net/server_event.lua @ 2434:4403d4473783

net.server_event: Add server.hook_signal(signal_num, handler) to wrap libevent's signal-catching interface
author Matthew Wild <mwild1@gmail.com>
date Sun, 10 Jan 2010 15:25:19 +0000
parent 2375:31297a5641e3
child 2453:44d4c69155e0
comparison
equal deleted inserted replaced
2433:65b794860e1b 2434:4403d4473783
10 -- to do some of the above, use timeout events or something what will called from outside 10 -- to do some of the above, use timeout events or something what will called from outside
11 -- dont let garbagecollect eventcallbacks, as long they are running 11 -- dont let garbagecollect eventcallbacks, as long they are running
12 -- when using luasec, there are 4 cases of timeout errors: wantread or wantwrite during reading or writing 12 -- when using luasec, there are 4 cases of timeout errors: wantread or wantwrite during reading or writing
13 13
14 --]] 14 --]]
15
16 15
17 local SCRIPT_NAME = "server_event.lua" 16 local SCRIPT_NAME = "server_event.lua"
18 local SCRIPT_VERSION = "0.05" 17 local SCRIPT_VERSION = "0.05"
19 local SCRIPT_AUTHOR = "blastbeat" 18 local SCRIPT_AUTHOR = "blastbeat"
20 local LAST_MODIFIED = "2009/11/20" 19 local LAST_MODIFIED = "2009/11/20"
75 local event = require "luaevent.core" 74 local event = require "luaevent.core"
76 local base = event.new( ) 75 local base = event.new( )
77 local EV_READ = event.EV_READ 76 local EV_READ = event.EV_READ
78 local EV_WRITE = event.EV_WRITE 77 local EV_WRITE = event.EV_WRITE
79 local EV_TIMEOUT = event.EV_TIMEOUT 78 local EV_TIMEOUT = event.EV_TIMEOUT
79 local EV_SIGNAL = event.EV_SIGNAL
80 80
81 local EV_READWRITE = bitor( EV_READ, EV_WRITE ) 81 local EV_READWRITE = bitor( EV_READ, EV_WRITE )
82 82
83 local interfacelist = ( function( ) -- holds the interfaces for sockets 83 local interfacelist = ( function( ) -- holds the interfaces for sockets
84 local array = { } 84 local array = { }
784 784
785 function get_backend() 785 function get_backend()
786 return base:method(); 786 return base:method();
787 end 787 end
788 788
789 -- We need to hold onto the events to stop them
790 -- being garbage-collected
791 local signal_events = {}; -- [signal_num] -> event object
792 function hook_signal(signal_num, handler)
793 local function _handler(event)
794 local ret = handler();
795 if ret ~= false then -- Continue handling this signal?
796 return EV_SIGNAL; -- Yes
797 end
798 return -1; -- Close this event
799 end
800 signal_events[signal_num] = base:addevent(signal_num, EV_SIGNAL, _handler);
801 return signal_events[signal_num];
802 end
803
789 return { 804 return {
790 805
791 cfg = cfg, 806 cfg = cfg,
792 base = base, 807 base = base,
793 loop = loop, 808 loop = loop,
798 addclient = addclient, 813 addclient = addclient,
799 wrapclient = wrapclient, 814 wrapclient = wrapclient,
800 setquitting = setquitting, 815 setquitting = setquitting,
801 closeall = closeallservers, 816 closeall = closeallservers,
802 get_backend = get_backend, 817 get_backend = get_backend,
818 hook_signal = hook_signal,
803 819
804 __NAME = SCRIPT_NAME, 820 __NAME = SCRIPT_NAME,
805 __DATE = LAST_MODIFIED, 821 __DATE = LAST_MODIFIED,
806 __AUTHOR = SCRIPT_AUTHOR, 822 __AUTHOR = SCRIPT_AUTHOR,
807 __VERSION = SCRIPT_VERSION, 823 __VERSION = SCRIPT_VERSION,