28 static volatile bool Waiting_;
29 static std::vector<pollfd> Fdlist_;
30 static std::map<int, FdHandler> Handlers_;
31 static Waiter::AppInfo AppInfo_;
33 void Waiter::OnPrepare()
35 // preload the libraries.
36 if (prepare_ != nullptr)
40 void Waiter::OnLaunchRequested(const AppInfo& info)
42 // do some job on user id is still system
45 void Waiter::OnWaiting()
50 _DBG("start polling...");
53 if (poll(Fdlist_.data(), Fdlist_.size(), -1) < 0)
56 for (auto &p : Fdlist_)
58 if ( (p.revents | POLLIN) != 0 )
59 Handlers_[p.fd].receiver(p.fd);
62 _DBG("end polling...");
73 void Waiter::RegisterFd(int fd, Receiver receiver)
75 // register fd should be caught in event loop
77 _DBG("Register fd %d", fd);
85 Fdlist_.push_back(info);
86 handler.info = &Fdlist_.back();
87 handler.receiver = receiver;
89 Handlers_[fd] = handler;
92 void Waiter::DeregisterFd(int fd)
94 // deregister fd should be caught in event loop
96 pollfd *info = Handlers_[fd].info;
97 Fdlist_.erase(Fdlist_.begin() - (info - &Fdlist_.front()));
102 Waiter::Waiter(Action prepare, Action requested, Executor executor)
105 requested_ = requested;
106 executor_ = executor;
113 int Waiter::WaitToLaunching(int argc, char *argv[])
116 auto on_create = [](bundle *extra, int type, void *user_data)
118 _DBG("on_create..."); // XXX
119 Waiter* waiter = static_cast<Waiter*>(user_data);
123 auto on_launch = [](int argc, char **argv, const char *app_path,
124 const char *appid, const char *pkgid,
125 const char *pkg_type, void *user_data) -> int
127 _DBG("on_launch..."); // XXX
128 Waiter* waiter = static_cast<Waiter*>(user_data);
130 _DBG ("app path : %s", app_path);
131 _DBG ("app id : %s", appid);
132 _DBG ("pkg id : %s", pkgid);
133 _DBG ("pkg type : %s", pkg_type);
142 waiter->OnLaunchRequested(info);
146 auto on_terminate = [](int argc, char **argv, void *user_data) -> int
148 _DBG("on_terminate..."); // XXX
150 string app_root(aul_get_app_root_path());
151 Waiter* waiter = static_cast<Waiter*>(user_data);
152 waiter->executor_(argv[0], app_root, argc, argv);
156 auto on_start_loop = [](void *user_data)
158 _DBG("on_start_loop..."); // XXX
159 Waiter* waiter = static_cast<Waiter*>(user_data);
163 auto on_quit_loop = [](void *user_data)
165 _DBG("on_quit_loop..."); // XXX
166 Waiter* waiter = static_cast<Waiter*>(user_data);
170 auto on_add_fd = [](void *user_data, int fd, loader_receiver_cb receiver)
172 _DBG("on_add_fd..."); // XXX
173 Waiter* waiter = static_cast<Waiter*>(user_data);
174 waiter->RegisterFd(fd, receiver);
177 auto on_remove_fd = [](void *user_data, int fd)
179 _DBG("on_remove_fd..."); // XXX
180 Waiter* waiter = static_cast<Waiter*>(user_data);
181 waiter->DeregisterFd(fd);
184 _DBG("launcher wait..."); // XXX
185 loader_lifecycle_callback_s callbacks = {
188 .terminate = on_terminate
191 loader_adapter_s adapter = {
192 .loop_begin = on_start_loop,
193 .loop_quit = on_quit_loop,
195 .remove_fd = on_remove_fd
198 return launchpad_loader_main(argc, argv, &callbacks, &adapter, this);
200 if (argc < 2) return -1;
201 std::string app_path(argv[1]);
202 std::string app_root;
203 auto pos = app_path.find_last_of('/');
204 if (pos != std::string::npos)
205 app_root = app_path.substr(0, pos);
216 this->OnLaunchRequested(info);
217 this->executor_(app_path, app_root, argc, argv);
221 } // namespace runtime
222 } // namespace dotnet