net/server.lua

1
-- Prosody IM
2
-- Copyright (C) 2008-2010 Matthew Wild
3
-- Copyright (C) 2008-2010 Waqas Hussain
4
-- 
5
-- This project is MIT/X11 licensed. Please see the
6
-- COPYING file in the source package for more information.
7
--
8
 
9
local use_luaevent = prosody and require "core.configmanager".get("*", "core", "use_libevent");
10
 
11
if use_luaevent then
12
	use_luaevent = pcall(require, "luaevent.core");
13
	if not use_luaevent then
14
		log("error", "libevent not found, falling back to select()");
15
	end
16
end
17
 
18
local server;
19
 
20
if use_luaevent then
21
	server = require "net.server_event";
22
	-- util.timer requires "net.server", so instead of having
23
	-- Lua look for, and load us again (causing a loop) - set this here
24
	-- (usually it isn't set until we return, look down there...)
25
	package.loaded["net.server"] = server;
26
	
27
	-- Backwards compatibility for timers, addtimer
28
	-- called a function roughly every second
29
	local add_task = require "util.timer".add_task;
30
	function server.addtimer(f)
31
		return add_task(1, function (...) f(...); return 1; end);
32
	end
33
	
34
	-- Overwrite signal.signal() because we need to ask libevent to
35
	-- handle them instead
36
	local ok, signal = pcall(require, "util.signal");
37
	if ok and signal then
38
		local _signal_signal = signal.signal;
39
		function signal.signal(signal_id, handler)
40
			if type(signal_id) == "string" then
41
				signal_id = signal[signal_id:upper()];
42
			end
43
			if type(signal_id) ~= "number" then
44
				return false, "invalid-signal";
45
			end
46
			return server.hook_signal(signal_id, handler);
47
		end
48
	end
49
else
50
	server = require "net.server_select";
51
	package.loaded["net.server"] = server;
52
end
53
 
54
-- require "net.server" shall now forever return this,
55
-- ie. server_select or server_event as chosen above.
56
return server;