From 651e3fab6329498a7f46703ce5bb92c49cc37624 Mon Sep 17 00:00:00 2001 From: Kieran Bingham Date: Thu, 18 Mar 2021 14:59:42 +0000 Subject: libcamera: camera: Report function which fails access control The camera object has a state machine to ensure calls are only made when in the correct state. It isn't easy to identify where things happen when assertions fail so add extra information to make this clearer. The error level of the isAccessAllowed is raised from Debug to Error as this is important information for applications to know if they have made a request in an invalid state. Reviewed-by: Laurent Pinchart Signed-off-by: Kieran Bingham --- src/libcamera/camera.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'src/libcamera/camera.cpp') diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index dec8171e..96a579eb 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -346,9 +346,11 @@ public: const std::set &streams); ~Private(); - int isAccessAllowed(State state, bool allowDisconnected = false) const; + int isAccessAllowed(State state, bool allowDisconnected = false, + const char *from = __builtin_FUNCTION()) const; int isAccessAllowed(State low, State high, - bool allowDisconnected = false) const; + bool allowDisconnected = false, + const char *from = __builtin_FUNCTION()) const; void disconnect(); void setState(State state); @@ -384,7 +386,8 @@ static const char *const camera_state_names[] = { "Running", }; -int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const +int Camera::Private::isAccessAllowed(State state, bool allowDisconnected, + const char *from) const { if (!allowDisconnected && disconnected_) return -ENODEV; @@ -395,15 +398,16 @@ int Camera::Private::isAccessAllowed(State state, bool allowDisconnected) const ASSERT(static_cast(state) < std::size(camera_state_names)); - LOG(Camera, Debug) << "Camera in " << camera_state_names[currentState] - << " state trying operation requiring state " + LOG(Camera, Error) << "Camera in " << camera_state_names[currentState] + << " state trying " << from << "() requiring state " << camera_state_names[state]; return -EACCES; } int Camera::Private::isAccessAllowed(State low, State high, - bool allowDisconnected) const + bool allowDisconnected, + const char *from) const { if (!allowDisconnected && disconnected_) return -ENODEV; @@ -415,8 +419,9 @@ int Camera::Private::isAccessAllowed(State low, State high, ASSERT(static_cast(low) < std::size(camera_state_names) && static_cast(high) < std::size(camera_state_names)); - LOG(Camera, Debug) << "Camera in " << camera_state_names[currentState] - << " state trying operation requiring state between " + LOG(Camera, Error) << "Camera in " << camera_state_names[currentState] + << " state trying " << from + << "() requiring state between " << camera_state_names[low] << " and " << camera_state_names[high]; -- cgit v1.2.1