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 <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Kieran Bingham 2021-03-18 14:59:42 +00:00
parent 5718b4d5b7
commit 651e3fab63

View file

@ -346,9 +346,11 @@ public:
const std::set<Stream *> &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<unsigned int>(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<unsigned int>(low) < std::size(camera_state_names) &&
static_cast<unsigned int>(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];