From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757273AbZHHAQd (ORCPT ); Fri, 7 Aug 2009 20:16:33 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1757053AbZHHAQd (ORCPT ); Fri, 7 Aug 2009 20:16:33 -0400 Received: from mail-gx0-f213.google.com ([209.85.217.213]:53240 "EHLO mail-gx0-f213.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756886AbZHHAQc (ORCPT ); Fri, 7 Aug 2009 20:16:32 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=INCXl+T/LO85AdZccEXhQQ1EScjwwaM9OYD/fCmvtwQDbU8B39KNCRMJL0MKDjnDzC JfY46IlpXxDcUrvIgA4WnpgJVfy4bRzriE26NCZrA/TwLf6gvT2HDxVtpowOkYVbxuRA 22bqFBORv4kPJFvcdwLRF8Waz6sEEFIYoGLfQ= From: Frederic Weisbecker To: Ingo Molnar Cc: LKML , Frederic Weisbecker , Peter Zijlstra , Arnaldo Carvalho de Melo , Mike Galbraith Subject: [PATCH 1/4] perf tools: callchain: Warn only once in empty node detection Date: Sat, 8 Aug 2009 02:16:22 +0200 Message-Id: <1249690585-9145-1-git-send-email-fweisbec@gmail.com> X-Mailer: git-send-email 1.6.2.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When we fill a new node that is found to be empty (sign of a bug), we print a message each time that happens. Sometimes we reach thousands of lines printed. Just warn only once in that case (and use stderr instead of stdout). Reported-by: Ingo Molnar Signed-off-by: Frederic Weisbecker Cc: Peter Zijlstra Cc: Arnaldo Carvalho de Melo Cc: Mike Galbraith --- tools/perf/util/callchain.c | 3 ++- tools/perf/util/util.h | 3 +++ tools/perf/util/wrapper.c | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletions(-) diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 98c5627..ce0c6d4 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c @@ -13,6 +13,7 @@ #include #include #include +#include "util.h" #include "callchain.h" @@ -203,7 +204,7 @@ fill_node(struct callchain_node *node, struct ip_callchain *chain, } node->val_nr = chain->nr - start; if (!node->val_nr) - printf("Warning: empty node in callchain tree\n"); + fprintf_once(stderr, "Warning: empty node in callchain tree\n"); } static void diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index 68fe157..386ea40 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h @@ -148,6 +148,9 @@ static inline const char *skip_prefix(const char *str, const char *prefix) return strncmp(str, prefix, len) ? NULL : str + len; } +extern int fprintf_once(FILE *fp, const char *fmt, ...) + __attribute__((format (printf, 2, 3))); + #if defined(NO_MMAP) || defined(USE_WIN32_MMAP) #ifndef PROT_READ diff --git a/tools/perf/util/wrapper.c b/tools/perf/util/wrapper.c index 4574ac2..026c87c 100644 --- a/tools/perf/util/wrapper.c +++ b/tools/perf/util/wrapper.c @@ -205,3 +205,19 @@ int xmkstemp(char *template) die("Unable to create temporary file: %s", strerror(errno)); return fd; } + +int fprintf_once(FILE *fp, const char *fmt, ...) +{ + va_list args; + int ret; + static int once; + + if (once++) + return 1; + + va_start(args, fmt); + ret = vfprintf(fp, fmt, args); + va_end(args); + + return ret; +} -- 1.6.2.3