From mboxrd@z Thu Jan 1 00:00:00 1970 From: Simon Glass Date: Tue, 22 Sep 2020 12:48:57 -0600 Subject: [PATCH 1/2] log: allow for message continuation In-Reply-To: <20200917121902.57403-2-xypron.glpk@gmx.de> References: <20200917121902.57403-1-xypron.glpk@gmx.de> <20200917121902.57403-2-xypron.glpk@gmx.de> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi Heinrich, On Thu, 17 Sep 2020 at 06:19, Heinrich Schuchardt wrote: > > Some drivers use macro pr_cont() for continuing a message sent via printk. > Hence if we want to convert printk messaging to using the logging system, > we must support continuation of log messages too. > > As pr_cont() does not provide a message level we need a means of > remembering the last log level. > > With the patch a pseudo log level LOGL_CONT as well as a pseudo log > category LOGC_CONT are introduced. Using these results in the application > of the same log level and category as in the previous log message. > > Signed-off-by: Heinrich Schuchardt > --- > common/log.c | 23 ++++++++++++++++++----- > doc/develop/logging.rst | 6 ++++++ > include/log.h | 2 ++ > 3 files changed, 26 insertions(+), 5 deletions(-) > > diff --git a/common/log.c b/common/log.c > index 9a5f100da3..bafc09f263 100644 > --- a/common/log.c > +++ b/common/log.c > @@ -183,10 +183,12 @@ static bool log_passes_filters(struct log_device *ldev, struct log_rec *rec) > * log_dispatch() - Send a log record to all log devices for processing > * > * The log record is sent to each log device in turn, skipping those which have > - * filters which block the record > + * filters which block the record. > * > - * @rec: Log record to dispatch > - * @return 0 (meaning success) > + * All log messages created while processing log record @rec are ignored. > + * > + * @rec: log record to dispatch > + * Return: 0 msg sent, 1 msg not sent while already dispatching another msg > */ > static int log_dispatch(struct log_rec *rec) > { > @@ -199,7 +201,7 @@ static int log_dispatch(struct log_rec *rec) > * as this might result in infinite recursion. > */ > if (processing_msg) > - return 0; > + return 1; > > /* Emit message */ > processing_msg = 1; > @@ -214,10 +216,18 @@ static int log_dispatch(struct log_rec *rec) > int _log(enum log_category_t cat, enum log_level_t level, const char *file, > int line, const char *func, const char *fmt, ...) > { > + static enum log_category_t logc_prev = LOGC_NONE; > + static enum log_level_t logl_prev = LOGL_INFO; I don't think we can use static variables in logging. Perhaps we can use gobal_data? > char buf[CONFIG_SYS_CBSIZE]; > struct log_rec rec; > va_list args; > > + /* Check for message continuation */ > + if (cat == LOGC_CONT) Regards, Simon