android: CameraHalManager: Create a static object dynamically
Originally CameraHalManager is created in the libcamera start up and destroyed in the libcamera termination. However, CameraHalManager destructor can access other static objects that has been destroyed. Avoid this issue by destroying CameraHalManager when tear_down() is called in ChromeOS or leaking it in other platforms. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
a8c9fce109
commit
459b3bc6a9
5 changed files with 22 additions and 9 deletions
|
@ -16,25 +16,23 @@ using namespace libcamera;
|
||||||
|
|
||||||
LOG_DEFINE_CATEGORY(HAL)
|
LOG_DEFINE_CATEGORY(HAL)
|
||||||
|
|
||||||
static CameraHalManager cameraManager;
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
/*------------------------------------------------------------------------------
|
||||||
* Android Camera HAL callbacks
|
* Android Camera HAL callbacks
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int hal_get_number_of_cameras()
|
static int hal_get_number_of_cameras()
|
||||||
{
|
{
|
||||||
return cameraManager.numCameras();
|
return CameraHalManager::instance()->numCameras();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hal_get_camera_info(int id, struct camera_info *info)
|
static int hal_get_camera_info(int id, struct camera_info *info)
|
||||||
{
|
{
|
||||||
return cameraManager.getCameraInfo(id, info);
|
return CameraHalManager::instance()->getCameraInfo(id, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)
|
static int hal_set_callbacks(const camera_module_callbacks_t *callbacks)
|
||||||
{
|
{
|
||||||
cameraManager.setCallbacks(callbacks);
|
CameraHalManager::instance()->setCallbacks(callbacks);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -62,7 +60,7 @@ static int hal_init()
|
||||||
{
|
{
|
||||||
LOG(HAL, Info) << "Initialising Android camera HAL";
|
LOG(HAL, Info) << "Initialising Android camera HAL";
|
||||||
|
|
||||||
cameraManager.init();
|
CameraHalManager::instance()->init();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +75,8 @@ static int hal_dev_open(const hw_module_t *module, const char *name,
|
||||||
LOG(HAL, Debug) << "Open camera " << name;
|
LOG(HAL, Debug) << "Open camera " << name;
|
||||||
|
|
||||||
int id = atoi(name);
|
int id = atoi(name);
|
||||||
auto [camera, ret] = cameraManager.open(id, module);
|
|
||||||
|
auto [camera, ret] = CameraHalManager::instance()->open(id, module);
|
||||||
if (!camera) {
|
if (!camera) {
|
||||||
LOG(HAL, Error)
|
LOG(HAL, Error)
|
||||||
<< "Failed to open camera module '" << id << "'";
|
<< "Failed to open camera module '" << id << "'";
|
||||||
|
|
|
@ -37,6 +37,13 @@ CameraHalManager::CameraHalManager()
|
||||||
/* CameraManager calls stop() in the destructor. */
|
/* CameraManager calls stop() in the destructor. */
|
||||||
CameraHalManager::~CameraHalManager() = default;
|
CameraHalManager::~CameraHalManager() = default;
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
CameraHalManager *CameraHalManager::instance()
|
||||||
|
{
|
||||||
|
static CameraHalManager *cameraHalManager = new CameraHalManager;
|
||||||
|
return cameraHalManager;
|
||||||
|
}
|
||||||
|
|
||||||
int CameraHalManager::init()
|
int CameraHalManager::init()
|
||||||
{
|
{
|
||||||
cameraManager_ = std::make_unique<CameraManager>();
|
cameraManager_ = std::make_unique<CameraManager>();
|
||||||
|
|
|
@ -26,9 +26,10 @@ class CameraDevice;
|
||||||
class CameraHalManager
|
class CameraHalManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CameraHalManager();
|
|
||||||
~CameraHalManager();
|
~CameraHalManager();
|
||||||
|
|
||||||
|
static CameraHalManager *instance();
|
||||||
|
|
||||||
int init();
|
int init();
|
||||||
|
|
||||||
std::tuple<CameraDevice *, int>
|
std::tuple<CameraDevice *, int>
|
||||||
|
@ -44,6 +45,8 @@ private:
|
||||||
|
|
||||||
static constexpr unsigned int firstExternalCameraId_ = 1000;
|
static constexpr unsigned int firstExternalCameraId_ = 1000;
|
||||||
|
|
||||||
|
CameraHalManager();
|
||||||
|
|
||||||
static int32_t cameraLocation(const libcamera::Camera *cam);
|
static int32_t cameraLocation(const libcamera::Camera *cam);
|
||||||
|
|
||||||
void cameraAdded(std::shared_ptr<libcamera::Camera> cam);
|
void cameraAdded(std::shared_ptr<libcamera::Camera> cam);
|
||||||
|
|
|
@ -7,12 +7,15 @@
|
||||||
|
|
||||||
#include <cros-camera/cros_camera_hal.h>
|
#include <cros-camera/cros_camera_hal.h>
|
||||||
|
|
||||||
|
#include "../camera_hal_manager.h"
|
||||||
|
|
||||||
static void set_up(cros::CameraMojoChannelManagerToken *token)
|
static void set_up(cros::CameraMojoChannelManagerToken *token)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tear_down()
|
static void tear_down()
|
||||||
{
|
{
|
||||||
|
delete CameraHalManager::instance();
|
||||||
}
|
}
|
||||||
|
|
||||||
cros::cros_camera_hal_t CROS_CAMERA_EXPORT CROS_CAMERA_HAL_INFO_SYM = {
|
cros::cros_camera_hal_t CROS_CAMERA_EXPORT CROS_CAMERA_HAL_INFO_SYM = {
|
||||||
|
|
|
@ -12,6 +12,7 @@ cros_hal_info = static_library('cros_hal_info',
|
||||||
cros_hal_info_sources,
|
cros_hal_info_sources,
|
||||||
dependencies : dependency('libcros_camera'),
|
dependencies : dependency('libcros_camera'),
|
||||||
c_args : '-Wno-shadow',
|
c_args : '-Wno-shadow',
|
||||||
include_directories : android_includes)
|
include_directories : [android_includes,
|
||||||
|
libcamera_includes])
|
||||||
|
|
||||||
libcamera_objects += cros_hal_info.extract_objects('camera3_hal.cpp')
|
libcamera_objects += cros_hal_info.extract_objects('camera3_hal.cpp')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue