| /* Copyright 2016 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include <signal.h> |
| #include <sys/resource.h> |
| #include <sys/wait.h> |
| #include <unistd.h> |
| |
| #include <hardware/hardware.h> |
| |
| #include <base/bind.h> |
| #include <base/command_line.h> |
| #include <base/logging.h> |
| #include <brillo/daemons/daemon.h> |
| #include <brillo/syslog_logging.h> |
| |
| #include "cros-camera/common.h" |
| #include "hal_adapter/camera_hal_adapter.h" |
| #include "hal_adapter/camera_hal_server_impl.h" |
| |
| static void SetLogItems() { |
| const bool kOptionPID = true; |
| const bool kOptionTID = true; |
| const bool kOptionTimestamp = true; |
| const bool kOptionTickcount = true; |
| logging::SetLogItems(kOptionPID, kOptionTID, kOptionTimestamp, |
| kOptionTickcount); |
| } |
| |
| int main(int argc, char* argv[]) { |
| // Init CommandLine for InitLogging. |
| base::CommandLine::Init(argc, argv); |
| int kCameraProcessPriority = 0; |
| |
| brillo::InitLog(brillo::kLogToSyslog | brillo::kLogToStderrIfTty); |
| // Override the log items set by brillo::InitLog. |
| SetLogItems(); |
| |
| int ret = setpriority(PRIO_PROCESS, 0, kCameraProcessPriority); |
| if (ret) { |
| LOGF(WARNING) << "Failed to set process priority"; |
| } |
| |
| pid_t pid = fork(); |
| |
| // Start the CameraHalServerImpl on the child process. The process |
| // will exit on error. |
| if (!pid) { |
| // Child process: Starts Chrome OS camera service provider which will host |
| // the camera HAL adapter. |
| |
| // Create the daemon instance first to properly set up MessageLoop and |
| // AtExitManager. |
| brillo::Daemon daemon; |
| |
| cros::CameraHalServerImpl service_provider; |
| if (!service_provider.Start()) { |
| LOGF(ERROR) << "Failed to start camera HAL v3 adapter"; |
| return ECANCELED; |
| } |
| |
| // The child process runs until an error happens which will terminate the |
| // process. |
| LOGF(INFO) << "Started camera HAL v3 adapter"; |
| daemon.Run(); |
| LOGF(ERROR) << "daemon stopped"; |
| return 0; |
| } else if (pid > 0) { |
| // Parent process: Waits until child process exits and report exit status. |
| |
| // Blocks until child process exits. |
| int wstatus; |
| wait(&wstatus); |
| LOGF(INFO) << "Child exited: status=" << WEXITSTATUS(wstatus); |
| } else { |
| PLOGF(ERROR) << "fork() failed"; |
| return pid; |
| } |
| } |