[libcamera-devel] [PATCH 2/8] libcamera: request: Add a toString()

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Mar 15 13:04:34 CET 2021


Hi Laurent,

On 14/03/2021 01:40, Laurent Pinchart wrote:
> Hi Kieran,
> 
> Thank you for the patch.
> 
> On Fri, Mar 12, 2021 at 06:11:25AM +0000, Kieran Bingham wrote:
>> Provide a toString helper to assist in printing Request state
>> for debug and logging contexts.
>>
>> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>> ---
>>  include/libcamera/request.h |  2 ++
>>  src/libcamera/request.cpp   | 20 +++++++++++++++++++-
>>  2 files changed, 21 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/libcamera/request.h b/include/libcamera/request.h
>> index 6f2f881e840a..59d7f4bac0d2 100644
>> --- a/include/libcamera/request.h
>> +++ b/include/libcamera/request.h
>> @@ -56,6 +56,8 @@ public:
>>  
>>  	bool hasPendingBuffers() const { return !pending_.empty(); }
>>  
>> +	const std::string toString() const;
> 
> You can drop the initial const.
> 
> And you should include <string>.

Ack,

> 
>> +
>>  private:
>>  	LIBCAMERA_DISABLE_COPY(Request)
>>  
>> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
>> index 24c3694de5fc..12c2e7d425f9 100644
>> --- a/src/libcamera/request.cpp
>> +++ b/src/libcamera/request.cpp
>> @@ -268,7 +268,7 @@ void Request::complete()
>>  	status_ = cancelled_ ? RequestCancelled : RequestComplete;
>>  
>>  	LOG(Request, Debug)
>> -		<< "Request has completed - cookie: " << cookie_
>> +		<< toString() << " has completed - cookie: " << cookie_
>>  		<< (cancelled_ ? " [Cancelled]" : "");
> 
> Inheriting from Loggable would be nicer, but that's not part of the
> public API :-S
>

Yes, been here ;-)

> Should the cookie and cancelled state be handled in toString() ?

Cancelled is already handled because the state gets printed.
Although - indeed - before this call if cancelled was set - that
wouldn't have been updated yet.

I guess I was only adding the information I cared about (the sequence,
and state) ... the cookie is application specific - so I don't think we
care about that when dealing with internal debug ...

And I don't yet know how much cross over there will be between tracking
internal debug against whatever the applciation stores in the cookie.


>>  
>>  	LIBCAMERA_TRACEPOINT(request_complete, this);
>> @@ -302,4 +302,22 @@ bool Request::completeBuffer(FrameBuffer *buffer)
>>  	return !hasPendingBuffers();
>>  }
>>  
>> +const std::string Request::toString() const
>> +{
>> +	std::stringstream ss;
>> +
>> +	static const char *statuses[] = {
>> +		"Pending",
>> +		"Complete",
>> +		"Cancelled",
>> +	};
>> +
>> +	ss << "Request (" << sequence_ << ") " << statuses[status_];
>> +
>> +	if (hasPendingBuffers())
>> +		ss << " [Pending:" << pending_.size() << "]";
> 
> Should we make this a bit more concise ? It can then become a bit
> cryptic, but as it's a debugging tool, I'd focus on making it readable
> for the trained eye (as well as possibly easily machine-parseable).
> Having abbreviated status names, for instance, to give them all the same
> length, may not look as nice at first, but when you read thousands of
> lines of log, it quickly makes it easier I think.
> 
> I'm thinking about something like this:
> 
> 	static const char *statuses = "PCX";
> 
> 	"Request(%u:%c:%u)", sequence_, statuses[status_], pending_.size()
> 
> (it's the most extreme case, a middle ground is certainly possible with
> longer statuses, and possibly even the full status name)
> 
> Maybe this is just me ?

Hrm ... I don't know yet. I 'liked' having the extended print while
trawling through the logs - but it could be made more concise.

You're example isn't so bad, and I like that it would then be machine
parseable too.

I'll try it out.


> 
>> +
>> +	return ss.str();
>> +}
>> +
>>  } /* namespace libcamera */
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list