2 * Copyright (c) 2023 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #ifndef LAUNCHPAD_PROCESS_POOL_LAUNCHPAD_HH_
18 #define LAUNCHPAD_PROCESS_POOL_LAUNCHPAD_HH_
25 #include <unordered_map>
28 #include <language_config.hh>
29 #include <io_channel.hh>
30 #include <region_format_config.hh>
31 #include <server_socket.hh>
33 #include "launchpad-process-pool/app_executor.hh"
34 #include "launchpad-process-pool/config.hh"
35 #include "launchpad-process-pool/loader_manager.hh"
36 #include "launchpad-process-pool/request.hh"
37 #include "launchpad-process-pool/signal_manager.hh"
41 class Launchpad : public IOChannel::IEvent,
42 public SignalManager::IEvent,
43 public LoaderManager::IEvent {
45 enum class LaunchResult : int {
52 Launchpad(int argc, char** argv);
55 Launchpad(const Launchpad&) = delete;
56 Launchpad& operator = (const Launchpad&) = delete;
57 Launchpad(Launchpad&&) = delete;
58 Launchpad& operator = (Launchpad&&) = delete;
64 using RequestHandler = std::function<void(std::shared_ptr<Request>)>;
69 void HandleVisibilityRequest(std::shared_ptr<Request> request);
70 void HandleAddLoaderRequest(std::shared_ptr<Request> request);
71 void HandleRemoveLoaderRequest(std::shared_ptr<Request> request);
72 void HandleMakeDefaultSlotsRequest(std::shared_ptr<Request> request);
73 void HandlePrepareAppDefinedLoaderRequest(std::shared_ptr<Request> request);
74 void HandleDemandRequest(std::shared_ptr<Request> request);
75 void HandlePingRequest(std::shared_ptr<Request> request);
76 void HandleUpdateAppTypeRequest(std::shared_ptr<Request> request);
77 void HandleConnectRequest(std::shared_ptr<Request> request);
78 void HandleLaunchRequest(std::shared_ptr<Request> request);
79 void HandleKillLoaderRequest(std::shared_ptr<Request> request);
80 void HandleRestartLoaderRequest(std::shared_ptr<Request> request);
82 bool CanUseLoaderContext(const std::shared_ptr<LoaderContext>& context);
83 LaunchResult ForkProcessing(std::shared_ptr<Request> request);
84 LaunchResult LaunchRequestPrepare(std::shared_ptr<Request> request);
85 LaunchResult LaunchRequestDo(std::shared_ptr<Request> request);
86 LaunchResult LaunchRequestPend(std::shared_ptr<Request> request);
87 void LaunchRequestComplete(std::shared_ptr<Request> request);
89 void OnIOEventReceived(int fd, int condition) override;
90 void OnSigchldReceived(pid_t pid) override;
91 void OnLoaderPrepared(LoaderContext* loader_context) override;
92 void OnLoaderLaunched(LoaderContext* loader_context) override;
97 GMainLoop* loop_ = nullptr;
98 std::unordered_map<int, RequestHandler> handlers_;
99 std::unique_ptr<AppExecutor> app_executor_;
100 std::unique_ptr<ServerSocket> socket_;
101 std::unique_ptr<IOChannel> channel_;
102 std::unique_ptr<ClientSocket> client_socket_;
103 std::unordered_map<pid_t, std::string> pid_map_;
104 std::unique_ptr<LanguageConfig> lang_config_;
105 std::unique_ptr<RegionFormatConfig> region_format_config_;
106 std::unique_ptr<Worker> cleaner_;
107 std::vector<std::shared_ptr<Request>> pending_requests_;
108 Config::LaunchMode::Mode mode_;
111 } // namespace launchpad
113 #endif // LAUNCHPAD_PROCESS_POOL_LAUNCHPAD_HH_