Comparison

core/modulemanager.lua @ 5192:3fc3a3072cc2

modulemanager: Set module.reloading when a module is reloading, and when loading make the saved state available in module.saved_state (if any)
author Matthew Wild <mwild1@gmail.com>
date Thu, 22 Nov 2012 20:59:20 +0000
parent 5123:7c5c86fa552e
child 5377:898454038524
comparison
equal deleted inserted replaced
5190:76c73bd3d483 5192:3fc3a3072cc2
109 mod.module.loaded = false; 109 mod.module.loaded = false;
110 modulemap[host][name] = nil; 110 modulemap[host][name] = nil;
111 return true; 111 return true;
112 end 112 end
113 113
114 local function do_load_module(host, module_name) 114 local function do_load_module(host, module_name, state)
115 if not (host and module_name) then 115 if not (host and module_name) then
116 return nil, "insufficient-parameters"; 116 return nil, "insufficient-parameters";
117 elseif not hosts[host] and host ~= "*"then 117 elseif not hosts[host] and host ~= "*"then
118 return nil, "unknown-host"; 118 return nil, "unknown-host";
119 end 119 end
150 150
151 151
152 152
153 local _log = logger.init(host..":"..module_name); 153 local _log = logger.init(host..":"..module_name);
154 local api_instance = setmetatable({ name = module_name, host = host, 154 local api_instance = setmetatable({ name = module_name, host = host,
155 _log = _log, log = function (self, ...) return _log(...); end, event_handlers = new_multitable() } 155 _log = _log, log = function (self, ...) return _log(...); end, event_handlers = new_multitable(),
156 reloading = not not state, saved_state = state~=true and state or nil }
156 , { __index = api }); 157 , { __index = api });
157 158
158 local pluginenv = setmetatable({ module = api_instance }, { __index = _G }); 159 local pluginenv = setmetatable({ module = api_instance }, { __index = _G });
159 api_instance.environment = pluginenv; 160 api_instance.environment = pluginenv;
160 161
174 ok, err = call_module_method(pluginenv, "load"); 175 ok, err = call_module_method(pluginenv, "load");
175 if not ok then 176 if not ok then
176 log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err or "nil"); 177 log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err or "nil");
177 end 178 end
178 end 179 end
180 api_instance.reloading, api_instance.saved_state = nil, nil;
179 181
180 if api_instance.host == "*" then 182 if api_instance.host == "*" then
181 if not api_instance.global then -- COMPAT w/pre-0.9 183 if not api_instance.global then -- COMPAT w/pre-0.9
182 if host ~= "*" then 184 if host ~= "*" then
183 log("warn", "mod_%s: Setting module.host = '*' deprecated, call module:set_global() instead", module_name); 185 log("warn", "mod_%s: Setting module.host = '*' deprecated, call module:set_global() instead", module_name);
223 log("warn", "Continuing with reload (using the force)"); 225 log("warn", "Continuing with reload (using the force)");
224 end 226 end
225 end 227 end
226 end 228 end
227 229
230 mod.module.reloading = true;
228 do_unload_module(host, name); 231 do_unload_module(host, name);
229 local ok, err = do_load_module(host, name); 232 local ok, err = do_load_module(host, name, saved or true);
230 if ok then 233 if ok then
231 mod = get_module(host, name); 234 mod = get_module(host, name);
232 if module_has_method(mod, "restore") then 235 if module_has_method(mod, "restore") then
233 local ok, err = call_module_method(mod, "restore", saved or {}) 236 local ok, err = call_module_method(mod, "restore", saved or {})
234 if (not ok) and err then 237 if (not ok) and err then