3 module ("L4", package.seeall)
5 -- Add this alias, it sounds better for some cases
6 L4.Env.user_factory = L4.Env.mem_alloc;
8 -- L4 protocol constants
35 eager_map = 0x1, -- L4RE_AUX_LDR_FLAG_EAGER_MAP
36 all_segs_cow = 0x2, -- L4RE_AUX_LDR_FLAG_ALL_SEGS_COW
37 pinned_segs = 0x4, -- L4RE_AUX_LDR_FLAG_PINNED_SEGS
40 -- L4Re debug constants
53 -- Loader class, encapsulates a loader instance.
54 -- * A memory allocator
55 -- * A factory used for name-space creation (ns_fab)
56 -- * A factory used for region-map creation (rm_fab)
57 -- * A Factory used for log creation (log_fab)
58 -- * A Scheduler factory (sched_fab)
61 Loader.__index = Loader;
65 function Class.check(obj, class)
66 if not obj or getmetatable(obj) ~= class then
67 error("method called with incompatible object", 3);
71 function Loader.new(proto)
72 local f = proto or {};
75 local lfab = f.loader or f.mem;
76 f.log_fab = f.log_fab or lfab;
77 f.ns_fab = f.ns_fab or lfab;
78 f.rm_fab = f.rm_fab or lfab;
79 f.sched_fab = f.sched_fab or lfab;
80 f.factory = f.factory or Env.factory;
83 setmetatable(f, Loader);
87 function mangle_class(n)
89 for i in string.gmatch(n, "([^:%s]+)") do
95 function get_cap_class(id)
98 return _CAP_TYPES[id];
99 elseif t == "string" then
100 return _CAP_TYPES[mangle_class(id)];
106 local ns_class = get_cap_class("L4Re::Namespace");
108 ns_class.register = function (self, key, value, fab)
109 if type(value) == "function" then
110 value = value(self, key);
114 if type(value) ~= "table" then
115 self:__register(key, value);
117 self:__register(key, fab(value));
121 ns_class.r = ns_class.register;
123 error("Could not find type information for L4Re::Namespace");
128 function Loader.fill_namespace(ns, tmpl, fab)
129 local function cns(value)
130 return self:create_namespace(value, fab);
133 for k, v in pairs(tmpl) do
139 function Loader:create_namespace(n, fab)
140 Class.check(self, Loader);
142 if type(n) ~= "table" then
146 local ns_fab = fab or self.ns_fab;
147 local ns = ns_fab:create(Proto.Namespace);
148 self.fill_namespace(ns, n, ns_fab);
155 App_env.__index = App_env;
157 function App_env.new(proto)
158 local f = proto or {};
160 f.loader = f.loader or default_loader;
161 f.rm_fab = f.loader.rm_fab;
162 f.factory = f.factory or f.loader.factory or L4.Env.factory;
163 -- f.scheduler = f.scheduler or f.loader.scheduler;
165 f.mem = f.mem or f.loader.mem;
167 if type(f.log) == "table" then
168 f.log_tag, f.log_color = unpack(f.log);
170 elseif type(f.log) == "function" then
174 setmetatable(f, App_env);
176 if type(f.ns) == "table" then
177 f.ns = f.loader:create_namespace(f.ns, f.ns_fab);
183 function App_env:log()
184 Class.check(self, App_env);
185 if self.loader.log_fab == nil or self.loader.log_fab.create == nil then
186 error ("Starting a application without valid log factory", 4);
188 return self.loader.log_fab:create(Proto.Log, self.log_tag, self.log_color);
191 function App_env:start(...)
192 Class.check(self, App_env);
195 return string.gsub(a, ".*/", "");
197 local old_log_tag = self.log_tag;
198 self.log_tag = self.log_tag or fa(...);
199 local res = exec(self, ...);
200 self.log_tag = old_log_tag;
204 function App_env:set_ns(tmpl)
205 Class.check(self, App_env);
206 self.ns = Namespace.new(tmpl, self.ns_fab);
209 function App_env:set_loader_fab(fab)
210 Class.check(self, App_env);
216 function App_env:set_mem_alloc(mem)
217 Class.check(self, App_env);
221 function Loader:startv(env, ...)
222 Class.check(self, Loader);
224 local caps = env.caps or {};
226 if (type(caps) == "table") then
227 caps.rom = caps.rom or Env.rom;
232 env.l4re_dbg = env.l4re_dbg or L4.Dbg.Warn;
233 local e = App_env.new(env);
237 -- Create a new IPC gate for a client-server connection
238 function L4.Loader:new_channel()
239 return self.factory:create(Proto.Ipc_gate);
242 function Loader.split_args(cmd, posix_env)
245 for w in string.gmatch(cmd, "[^%s]+") do
253 function Loader:start(env, cmd, posix_env)
254 Class.check(self, Loader);
255 return self:startv(env, self.split_args(cmd, posix_env));
258 default_loader = Loader.new({factory = Env.factory, mem = Env.mem_alloc});