+}
+
+void
+log_pass_msg(struct log_stream *ls, struct log_msg *m)
+{
+ ASSERT(ls);
+
+ /* Check recursion depth */
+ if (m->depth > LS_MAX_DEPTH)
+ {
+ log_report_err(ls, m, EDEADLK);
+ m->error = 1;
+ return;
+ }
+
+ /* Filter by level and type */
+ if (!((1 << LS_GET_LEVEL(m->flags)) & ls->levels) ||
+ !((1 << LS_GET_TYPE(m->flags)) & ls->types))
+ return;
+
+ m->depth++;
+
+ if (ls->filter && ls->filter(ls, m))
+ {
+ // The filter might have called log_pass_filtered()
+ }
+ else
+ log_pass_filtered(ls, m);
+
+ m->depth--;