Software / code / prosody
Comparison
core/modulemanager.lua @ 1994:9cc9b096c8f5
modulemanager: Module loading rewritten to gracefully deal with errors in module initialization.
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Sun, 18 Oct 2009 05:17:07 +0500 |
| parent | 1993:09621f8d0366 |
| child | 2072:464a5392bc80 |
comparison
equal
deleted
inserted
replaced
| 1993:09621f8d0366 | 1994:9cc9b096c8f5 |
|---|---|
| 133 hosts[host] = create_component(host); | 133 hosts[host] = create_component(host); |
| 134 hosts[host].connected = false; | 134 hosts[host].connected = false; |
| 135 log("debug", "Created new component: %s", host); | 135 log("debug", "Created new component: %s", host); |
| 136 end | 136 end |
| 137 hosts[host].modules = modulemap[host]; | 137 hosts[host].modules = modulemap[host]; |
| 138 | 138 modulemap[host][module_name] = pluginenv; |
| 139 local success, ret = pcall(mod); | 139 |
| 140 if not success then | 140 local success, err = pcall(mod); |
| 141 log("error", "Error initialising module '%s': %s", module_name or "nil", ret or "nil"); | 141 if success then |
| 142 return nil, ret; | 142 if module_has_method(pluginenv, "load") then |
| 143 end | 143 success, err = call_module_method(pluginenv, "load"); |
| 144 | 144 if not success then |
| 145 if module_has_method(pluginenv, "load") then | 145 log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err or "nil"); |
| 146 local ok, err = call_module_method(pluginenv, "load"); | 146 end |
| 147 if (not ok) and err then | 147 end |
| 148 log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err); | 148 |
| 149 end | 149 -- Use modified host, if the module set one |
| 150 end | 150 if api_instance.host == "*" and host ~= "*" then |
| 151 | 151 modulemap[host][module_name] = nil; |
| 152 -- Use modified host, if the module set one | 152 modulemap["*"][module_name] = pluginenv; |
| 153 modulemap[api_instance.host][module_name] = pluginenv; | 153 api_instance:set_global(); |
| 154 | 154 end |
| 155 if api_instance.host == "*" and host ~= "*" then | 155 else |
| 156 api_instance:set_global(); | 156 log("error", "Error initializing module '%s' on '%s': %s", module_name, host, err or "nil"); |
| 157 end | 157 end |
| 158 | 158 if success then |
| 159 return true; | 159 return true; |
| 160 else -- load failed, unloading | |
| 161 unload(api_instance.host, module_name); | |
| 162 return nil, err; | |
| 163 end | |
| 160 end | 164 end |
| 161 | 165 |
| 162 function get_module(host, name) | 166 function get_module(host, name) |
| 163 return modulemap[host] and modulemap[host][name]; | 167 return modulemap[host] and modulemap[host][name]; |
| 164 end | 168 end |