All of lore.kernel.org
 help / color / mirror / Atom feed
From: Slavomir Kaslev <kaslevs@vmware.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-trace-devel@vger.kernel.org, slavomir.kaslev@gmail.com
Subject: Re: [RFC PATCH v6 07/11] trace-cmd: Add `trace-cmd setup-guest` command
Date: Mon, 18 Feb 2019 22:54:46 +0200	[thread overview]
Message-ID: <20190218205444.GB5590@box> (raw)
In-Reply-To: <20190218200705.GA5590@box>

On Mon, Feb 18, 2019 at 10:07:06PM +0200, Slavomir Kaslev wrote:
> On Mon, Feb 18, 2019 at 12:44:37PM -0500, Steven Rostedt wrote:
> > On Mon, 18 Feb 2019 16:37:47 +0200
> > Slavomir Kaslev <kaslevs@vmware.com> wrote:
> >
> > > This won't work as proposed: `p` will be NULL on the last iteration but will
> > > still get incremented from the outer for-loop and the check (p && *p) won't get
> > > triggered (p == 0x01 in this case).
> >
> > I still don't like the "end", it just looks awkward.
> 
> If that's the only argument I don't think it stands.
> 
> >
> > >
> > > A fixed version might look like this:
> > >
> > > static int make_dir(const char *path, mode_t mode)
> > > {
> > > 	char buf[PATH_MAX+1], *p;
> > > 	int ret = 0;
> > >
> > > 	strncpy(buf, path, sizeof(buf));
> > > 	for (p = buf; *p; p++) {
> > > 		for (; *p == '/'; p++);
> > > 		p = strchr(p, '/');
> > >
> > > 		if (p)
> > > 			*p = '\0';
> > > 		ret = mkdir(buf, mode);
> > > 		if (ret < 0) {
> > > 			if (errno != EEXIST) {
> > > 				ret = -errno;
> > > 				break;
> > > 			}
> > > 			ret = 0;
> > > 		}
> > > 		if (!p)
> > > 			break;
> > > 		*p = '/';
> > > 	}
> > >
> > > 	return ret;
> > > }
> > >
> > > OTOH I find the original version much more readable:
> > >
> > > static int make_dir(const char *path, mode_t mode)
> > > {
> > > 	char buf[PATH_MAX+1], *end, *p;
> > > 	int ret = 0;
> > >
> > > 	end = stpncpy(buf, path, sizeof(buf));
> > > 	for (p = buf; p < end; p++) {
> > > 		for (; p < end && *p == '/'; p++);
> > > 		for (; p < end && *p != '/'; p++);
> > >
> > > 		*p = '\0';
> > > 		ret = mkdir(buf, mode);
> > > 		if (ret < 0) {
> > > 			if (errno != EEXIST) {
> > > 				ret = -errno;
> > > 				break;
> > > 			}
> > > 			ret = 0;
> > > 		}
> > > 		*p = '/';
> > > 	}
> > >
> > > 	return ret;
> > > }
> > >
> > > The intent behind `*p = '\0'; ... *p = '/';` is more clearly expressed in this
> > > version without getting bogged down by strchr() edge case handling.
> > >
> > > Since this is not on a performance critical path how about sticking to the more
> > > readable of the two?
> > >
> >
> > I'd still like to use '*p' as that's very common.
> 
> Testing for '*p' is more common since in the common case one doesn't know the
> length of the string.
> 
> This is not the case here since we first do a copy anyway and hence we know the
> length from then on. We also actively manipulate to string sentinel and knowing
> where the string actually ends makes reasoning about the code much easier.
> 
> >
> > Also break up the other for loops into a while loops.
> 
> OK switching the for()s to while()s and dropping the first `p < end` check
> (which is never true) sounds fine.
> 
> >
> > 	for (p = buf; *p; p++) {
> >
> > 		while (*p == '/')
> > 			p++;
> > 		while (*p && *p != '/')
> > 			p++;
> >
> > 		if (*p)
> > 			*p = '\0';
> > 		else
> > 			p--; /* for the for loop */
> >
> > 		[...]
> >
> >
> > This would work, and I think is still readable.
> 
> It's really not more readable and having a comment explaining what's going on
> only supports this claim.
> 

I thing in the end we're comparing this:

static int make_dir(const char *path, mode_t mode)
{
	char buf[PATH_MAX+1], *end, *p;

	end = stpncpy(buf, path, sizeof(buf));
	for (p = buf; p < end; p++) {
		while (*p == '/')
			p++;
		while (p < end && *p != '/')
			p++;

		*p = '\0';
		if (mkdir(buf, mode) < 0 && errno != EEXIST)
			return -errno;
		*p = '/';
	}

	return 0;
}

to this version:

static int make_dir(const char *path, mode_t mode)
{
	char buf[PATH_MAX+1], *p;

	strncpy(buf, path, sizeof(buf));
	for (p = buf; *p; p++) {
		bool eos = true;

		while (*p == '/')
			p++;
		while (*p && *p != '/')
			p++;

		if (*p)
			*p = '\0';
		else
			eos = false;
		if (mkdir(buf, mode) < 0 && errno != EEXIST)
			return -errno;
		if (eos)
			*p = '/';
	}

	return 0;
}

Cheers,

-- Slavi

  reply	other threads:[~2019-02-18 20:54 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-14 14:13 [RFC PATCH v6 00/11] Add VM kernel tracing over vsockets and FIFOs Slavomir Kaslev
2019-02-14 14:13 ` [RFC PATCH v6 01/11] trace-cmd: Detect if vsockets are available Slavomir Kaslev
2019-02-14 14:13 ` [RFC PATCH v6 02/11] trace-cmd: Add tracecmd_create_recorder_virt function Slavomir Kaslev
2019-02-14 14:13 ` [RFC PATCH v6 03/11] trace-cmd: Add TRACE_REQ and TRACE_RESP messages Slavomir Kaslev
2019-02-14 18:51   ` Steven Rostedt
2019-02-14 14:13 ` [RFC PATCH v6 04/11] trace-cmd: Add buffer instance flags for tracing in guest and agent context Slavomir Kaslev
2019-02-14 20:05   ` Steven Rostedt
2019-02-18 14:24     ` Slavomir Kaslev
2019-02-14 14:13 ` [RFC PATCH v6 05/11] trace-cmd: Add VM kernel tracing over vsockets transport Slavomir Kaslev
2019-02-14 20:03   ` Steven Rostedt
2019-02-18 14:26     ` Slavomir Kaslev
2019-02-18 14:28     ` Slavomir Kaslev
2019-02-14 14:13 ` [RFC PATCH v6 06/11] trace-cmd: Use splice(2) for vsockets if available Slavomir Kaslev
2019-02-14 14:13 ` [RFC PATCH v6 07/11] trace-cmd: Add `trace-cmd setup-guest` command Slavomir Kaslev
2019-02-14 20:41   ` Steven Rostedt
2019-02-18 14:37     ` Slavomir Kaslev
2019-02-18 17:44       ` Steven Rostedt
2019-02-18 20:07         ` Slavomir Kaslev
2019-02-18 20:54           ` Slavomir Kaslev [this message]
2019-02-14 14:13 ` [RFC PATCH v6 08/11] trace-cmd: Try to autodetect number of guest CPUs in setup-guest if not specified Slavomir Kaslev
2019-02-14 14:13 ` [RFC PATCH v6 09/11] trace-cmd: Add setup-guest flag for attaching FIFOs to the guest VM config Slavomir Kaslev
2019-02-14 14:13 ` [RFC PATCH v6 10/11] trace-cmd: Add splice() recording from FIFO without additional pipe buffer Slavomir Kaslev
2019-02-14 21:07   ` Steven Rostedt
2019-02-14 14:13 ` [RFC PATCH v6 11/11] trace-cmd: Add VM tracing over FIFOs transport Slavomir Kaslev

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=20190218205444.GB5590@box \
    --to=kaslevs@vmware.com \
    --cc=linux-trace-devel@vger.kernel.org \
    --cc=rostedt@goodmis.org \
    --cc=slavomir.kaslev@gmail.com \
    /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.