[libcamera-devel] [PATCH] libcamera: log: Document LOG() restrictions
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sat May 22 01:59:42 CEST 2021
Hi Kieran,
On Fri, May 21, 2021 at 11:16:40AM +0100, Kieran Bingham wrote:
> On 21/05/2021 10:22, Laurent Pinchart wrote:
> > The LOG() macro uses the global Logger and LogCategory objects
> > internally. This can result in crashes or other undefined behaviour when
> > logging from destructors of global objects, as the Logger and/or the
> > LogCategory instances may have been destroyed.
> >
> > This isn't ideal and should eventually be fixed. For the time being,
> > document the restriction, and add a todo list item to fix the problem.
>
> Is there a way to catch this in code? Presumably it's something to do
> with the global logging object being destructed, and then an action
> occuring on that object?
Correct.
> Could we have something like the canary I proposed on the requests, so
> that if any action on the log happens after it's destructed it fires a
> more meaningful assert rather than a less parsable segfault/random failure?
That should be possible, but I'd rather focus on addressing the todo
item below, to allow logging messages everywhere (expect probably from
the destructor of the Logger itself :-)).
> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> > src/libcamera/log.cpp | 6 ++++++
> > 1 file changed, 6 insertions(+)
> >
> > diff --git a/src/libcamera/log.cpp b/src/libcamera/log.cpp
> > index 94175ab34535..985952249289 100644
> > --- a/src/libcamera/log.cpp
> > +++ b/src/libcamera/log.cpp
> > @@ -980,6 +980,12 @@ LogMessage _log(const LogCategory *category, LogSeverity severity,
> > *
> > * If the severity is set to Fatal, execution is aborted and the program
> > * terminates immediately after printing the message.
> > + *
> > + * \warning Logging from the destructor of a global object, either directly or
> > + * indirectly, results in undefined behaviour.
> > + *
> > + * \todo Allow logging from destructors of global objects to the largest
> > + * possible extent
>
> I guess there's no way to say "Please delete me last"?
>
> Are there any tricks that can be played by trying to ensure the log is
> the first thing constructed?
I may start by looking at LogCategory first, to allocate them
dynamically and delete them when the Logger is deleted. When it comes to
the Logger itself, I'm not sure yet.
> Anyway, documenting the current limitation is a good thing
>
> Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> > */
> >
> > /**
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list