All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ingo Molnar <mingo@kernel.org>
To: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Jiri Olsa <jolsa@redhat.com>,
	linux-kernel@vger.kernel.org,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Namhyung Kim <namhyung@kernel.org>,
	Mike Galbraith <efault@gmx.de>,
	Stephane Eranian <eranian@google.com>,
	David Ahern <dsahern@gmail.com>,
	Adrian Hunter <adrian.hunter@intel.com>
Subject: [PATCH] tools/perf/util: Document and clean up readn() a bit
Date: Tue, 26 Nov 2013 18:53:35 +0100	[thread overview]
Message-ID: <20131126175335.GA9300@gmail.com> (raw)
In-Reply-To: <20131125192909.GA27323@ghostprotocols.net>


* Arnaldo Carvalho de Melo <acme@ghostprotocols.net> wrote:

> Em Fri, Nov 22, 2013 at 03:24:26PM +0100, Jiri Olsa escreveu:
> >  }
> > +
> > +ssize_t perf_data_file__write(struct perf_data_file *file,
> > +			      void *buf, size_t size)
> > +{
> > +	ssize_t total = size;
> > +
> > +	while (size) {
> > +		ssize_t ret = write(file->fd, buf, size);
> > +
> > +		if (ret < 0) {
> > +			pr_err("failed to write perf data, error: %m\n");
> > +			return -1;
> > +		}
> > +
> > +		size -= ret;
> > +		buf  += ret;
> > +	}
> > +
> > +	return total;
> 
> So this is the functional equivalent of "readn", so please move it to
> just after "readn" and make this just a simple wrapper.

Btw., would be nice to add a small comment to readn() that describes 
its semantics, it looks like a useful helper.

I also added a check for the input parameter 'n', plus I added a 
'left' variable to make the flow clearer, and added a debug check for 
the return value - I think returning 'n' is more obvious.

Totally untested though.

Thanks,

	Ingo

Signed-off-by: Ingo Molnar <mingo@kernel.org>

diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
index 28a0a89..4789081 100644
--- a/tools/perf/util/util.c
+++ b/tools/perf/util/util.c
@@ -6,6 +6,7 @@
 #endif
 #include <stdio.h>
 #include <stdlib.h>
+#include <linux/kernel.h>
 
 /*
  * XXX We need to find a better place for these things...
@@ -151,21 +152,29 @@ unsigned long convert_unit(unsigned long value, char *unit)
 	return value;
 }
 
-int readn(int fd, void *buf, size_t n)
+/*
+ * Read exactly 'n' bytes or return an error:
+ */
+int readn(int fd, void *buf, ssize_t n)
 {
 	void *buf_start = buf;
+	size_t left = n;
+
+	BUG_ON(n <= 0);
 
-	while (n) {
-		int ret = read(fd, buf, n);
+	while (left) {
+		int ret = read(fd, buf, left);
 
 		if (ret <= 0)
 			return ret;
 
-		n -= ret;
+		left -= ret;
 		buf += ret;
 	}
 
-	return buf - buf_start;
+	BUG_ON(buf-buf_start != n);
+
+	return n;
 }
 
 size_t hex_width(u64 v)
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
index c8f362d..bb0a336 100644
--- a/tools/perf/util/util.h
+++ b/tools/perf/util/util.h
@@ -253,7 +253,7 @@ bool strlazymatch(const char *str, const char *pat);
 int strtailcmp(const char *s1, const char *s2);
 char *strxfrchar(char *s, char from, char to);
 unsigned long convert_unit(unsigned long value, char *unit);
-int readn(int fd, void *buf, size_t size);
+int readn(int fd, void *buf, ssize_t size);
 
 struct perf_event_attr;
 

  parent reply	other threads:[~2013-11-26 17:53 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-22 14:24 [PATCH 0/3] perf tools: Add data file write interface Jiri Olsa
2013-11-22 14:24 ` [PATCH 1/3] perf tools: Add perf_data_file__write interface Jiri Olsa
2013-11-25 19:29   ` Arnaldo Carvalho de Melo
2013-11-26 10:17     ` Jiri Olsa
2013-11-26 17:53     ` Ingo Molnar [this message]
2013-11-27  8:38       ` [PATCH] tools/perf/util: Document and clean up readn() a bit Adrian Hunter
2013-11-27 11:57         ` Ingo Molnar
2013-11-27 15:19           ` David Ahern
2013-11-27 15:50             ` Jiri Olsa
2013-11-27 15:54               ` Ingo Molnar
2013-11-22 14:24 ` [PATCH 2/3] perf record: Use perf_data_file__write for output file Jiri Olsa
2013-11-25 19:31   ` Arnaldo Carvalho de Melo
2013-11-26 10:16     ` Jiri Olsa
2013-11-22 14:24 ` [PATCH 3/3] perf inject: Handle output file via perf_data_file object Jiri Olsa
2013-11-25 19:40   ` Arnaldo Carvalho de Melo
2013-11-26 10:03     ` Jiri Olsa
2013-11-26 12:42       ` Arnaldo Carvalho de Melo
2013-11-26 13:07         ` Jiri Olsa
2013-11-22 15:01 ` [PATCH 0/3] perf tools: Add data file write interface David Ahern
2013-11-23  9:44   ` Jiri Olsa
2013-11-24  0:00     ` David Ahern

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20131126175335.GA9300@gmail.com \
    --to=mingo@kernel.org \
    --cc=acme@ghostprotocols.net \
    --cc=adrian.hunter@intel.com \
    --cc=dsahern@gmail.com \
    --cc=efault@gmx.de \
    --cc=eranian@google.com \
    --cc=fweisbec@gmail.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.