All of lore.kernel.org
 help / color / mirror / Atom feed
From: Denton Liu <liu.denton@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: "Jeff King" <peff@peff.net>,
	"Chris Torek" <chris.torek@gmail.com>,
	"Đoàn Trần Công Danh" <congdanhqx@gmail.com>,
	"Junio C Hamano" <gitster@pobox.com>
Subject: [PATCH v3 0/3] pkt-line: war on magical `4` literal
Date: Tue, 23 Jun 2020 13:55:31 -0400	[thread overview]
Message-ID: <cover.1592934880.git.liu.denton@gmail.com> (raw)
In-Reply-To: <cover.1592119902.git.liu.denton@gmail.com>

There are many instances of the literal `4` in packet line-related code.
This series replaces these instances with either functions that can
generate the number or an appropriately-named constant.

Changes since v1:

* Introduce patch 1-2 so that the string length is used to generate the
  `4` where appropriate

Changes since v2:

* Replace some a couple of inline functions with macros that ensure they
  are string constants

* Use strlen() in one more instance over the PACKET_HEADER_SIZE

Denton Liu (3):
  remote-curl: use strlen() instead of magic numbers
  pkt-line: use string versions of functions
  pkt-line: extract out PACKET_HEADER_SIZE

 pkt-line.c    | 68 ++++++++++++++++++++++++++++++---------------------
 pkt-line.h    |  6 +++--
 remote-curl.c | 35 +++++++++++++-------------
 3 files changed, 62 insertions(+), 47 deletions(-)

Range-diff against v2:
1:  d2aaf15aa8 ! 1:  cb8683837c remote-curl: use strlen() instead of magic numbers
    @@ Metadata
      ## Commit message ##
         remote-curl: use strlen() instead of magic numbers
     
    -    When we are memcpy()ing the length header, we use the magic literal `4`,
    -    representing the length of "0000" and "0001", the packet line length
    -    headers. Use `strlen("000x")` so that we do not have to use the magic
    -    literal.
    +    When we are dealing with a packet-line length header, we use the magic
    +    literal `4`, representing the length of "0000" and "0001", the packet
    +    line length headers. Use `strlen("000x")` so that we do not have to use
    +    the magic literal.
     
      ## remote-curl.c ##
     @@ remote-curl.c: static int rpc_read_from_out(struct rpc_state *rpc, int options,
    @@ remote-curl.c: static int rpc_read_from_out(struct rpc_state *rpc, int options,
      			break;
      		case PACKET_READ_RESPONSE_END:
      			die(_("remote server sent stateless separator"));
    +@@ remote-curl.c: static int probe_rpc(struct rpc_state *rpc, struct slot_results *results)
    + 	curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
    + 	curl_easy_setopt(slot->curl, CURLOPT_ENCODING, NULL);
    + 	curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, "0000");
    +-	curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, 4);
    ++	curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, strlen("0000"));
    + 	curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
    + 	curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
    + 	curl_easy_setopt(slot->curl, CURLOPT_FILE, &buf);
2:  8cab5078b1 ! 2:  d283a1b514 pkt-line: use string versions of functions
    @@ Commit message
         replaced with constants at compile-time so this should not result in any
         performance penalty.
     
    +
    + ## Notes ##
    +    Junio, you mentioned in an earlier email[0] that write_str_in_full() and
    +    strbuf_addstr() each count the string length at runtime. However, I
    +    don't think that's true since they're both inline functions and
    +    strbuf_addstr() has the following comment:
    +
    +    	/**
    +    	 * Add a NUL-terminated string to the buffer.
    +    	 *
    +    	 * NOTE: This function will *always* be implemented as an inline or a macro
    +    	 * using strlen, meaning that this is efficient to write things like:
    +    	 *
    +    	 *     strbuf_addstr(sb, "immediate string");
    +    	 *
    +    	 */
    +
    +    so I believe that the lengths should be determined at compile-time.
    +
    +    [0]: https://lore.kernel.org/git/xmqqeeqhxred.fsf@gitster.c.googlers.com/
    +
      ## pkt-line.c ##
     @@ pkt-line.c: static void packet_trace(const char *buf, unsigned int len, int write)
      	strbuf_release(&out);
    @@ pkt-line.c: static void packet_trace(const char *buf, unsigned int len, int writ
     +	packet_trace(buf, strlen(buf), write);
     +}
     +
    -+static inline void control_packet_write(int fd, const char *s, const char *type)
    -+{
    -+	packet_trace_str(s, 1);
    -+	if (write_str_in_full(fd, s) < 0)
    -+		die_errno(_("unable to write %s packet"), type);
    -+}
    ++#define control_packet_write(fd, s, errstr) \
    ++	do { \
    ++		(void)s"is a string constant"; \
    ++		packet_trace_str(s, 1); \
    ++		if (write_str_in_full((fd), s) < 0) \
    ++			die_errno((errstr)); \
    ++	} while (0)
     +
      /*
       * If we buffered things up above (we don't, but we should),
    @@ pkt-line.c: static void packet_trace(const char *buf, unsigned int len, int writ
     -	packet_trace("0000", 4, 1);
     -	if (write_in_full(fd, "0000", 4) < 0)
     -		die_errno(_("unable to write flush packet"));
    -+	control_packet_write(fd, "0000", "flush");
    ++	control_packet_write(fd, "0000", _("unable to write flush packet"));
      }
      
      void packet_delim(int fd)
    @@ pkt-line.c: static void packet_trace(const char *buf, unsigned int len, int writ
     -	packet_trace("0001", 4, 1);
     -	if (write_in_full(fd, "0001", 4) < 0)
     -		die_errno(_("unable to write delim packet"));
    -+	control_packet_write(fd, "0001", "delim");
    ++	control_packet_write(fd, "0001", _("unable to write delim packet"));
      }
      
      void packet_response_end(int fd)
    @@ pkt-line.c: static void packet_trace(const char *buf, unsigned int len, int writ
     -	packet_trace("0002", 4, 1);
     -	if (write_in_full(fd, "0002", 4) < 0)
     -		die_errno(_("unable to write stateless separator packet"));
    -+	control_packet_write(fd, "0002", "stateless separator");
    ++	control_packet_write(fd, "0002", _("unable to write stateless separator packet"));
      }
      
      int packet_flush_gently(int fd)
    @@ pkt-line.c: static void packet_trace(const char *buf, unsigned int len, int writ
      	return 0;
      }
      
    -+static inline void control_packet_buf_write(struct strbuf *buf, const char *s)
    -+{
    -+	packet_trace_str(s, 1);
    -+	strbuf_addstr(buf, s);
    -+}
    ++#define control_packet_buf_write(buf, s) \
    ++	do { \
    ++		(void)s"is a string constant"; \
    ++		packet_trace_str(s, 1); \
    ++		strbuf_addstr((buf), s); \
    ++	} while (0)
     +
      void packet_buf_flush(struct strbuf *buf)
      {
3:  585d8892c3 ! 3:  00c19983fd pkt-line: extract out PACKET_HEADER_SIZE
    @@ remote-curl.c: static void check_pktline(struct check_pktline_state *state, cons
      				}
      				state->len_filled = 0;
      			}
    -@@ remote-curl.c: static int probe_rpc(struct rpc_state *rpc, struct slot_results *results)
    - 	curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
    - 	curl_easy_setopt(slot->curl, CURLOPT_ENCODING, NULL);
    - 	curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDS, "0000");
    --	curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, 4);
    -+	curl_easy_setopt(slot->curl, CURLOPT_POSTFIELDSIZE, PACKET_HEADER_SIZE);
    - 	curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
    - 	curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
    - 	curl_easy_setopt(slot->curl, CURLOPT_FILE, &buf);
     @@ remote-curl.c: int cmd_main(int argc, const char **argv)
      			parse_fetch(&buf);
      
-- 
2.27.0.307.g7979e895e7


  parent reply	other threads:[~2020-06-23 17:55 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-13 13:43 [PATCH] pkt-line: extract out PACKET_HEADER_SIZE Denton Liu
2020-06-14  7:31 ` Denton Liu
2020-06-13 14:23 ` Đoàn Trần Công Danh
2020-06-13 14:39   ` Denton Liu
2020-06-13 16:51   ` Junio C Hamano
2020-06-14 18:24     ` Junio C Hamano
2020-06-14  7:31 ` [PATCH v2 0/3] pkt-line: war on magical `4` literal Denton Liu
2020-06-14  7:31   ` [PATCH v2 1/3] remote-curl: use strlen() instead of magic numbers Denton Liu
2020-06-14  7:31   ` [PATCH v2 2/3] pkt-line: use string versions of functions Denton Liu
2020-06-14  8:31     ` Đoàn Trần Công Danh
2020-06-14  9:07       ` [PATCH v2] " Denton Liu
2020-06-14 21:35         ` Junio C Hamano
2020-06-14 22:28           ` Denton Liu
2020-06-15 12:32         ` Đoàn Trần Công Danh
2020-06-14  7:32   ` [PATCH v2 3/3] pkt-line: extract out PACKET_HEADER_SIZE Denton Liu
2020-06-14 21:32   ` [PATCH v2 0/3] pkt-line: war on magical `4` literal Junio C Hamano
2020-06-23 17:55   ` Denton Liu [this message]
2020-06-23 17:55     ` [PATCH v3 1/3] remote-curl: use strlen() instead of magic numbers Denton Liu
2020-06-23 18:54       ` Jeff King
2020-06-23 19:39         ` Junio C Hamano
2020-06-23 17:55     ` [PATCH v3 2/3] pkt-line: use string versions of functions Denton Liu
2020-06-23 19:11       ` Jeff King
2020-06-23 17:55     ` [PATCH v3 3/3] pkt-line: extract out PACKET_HEADER_SIZE Denton Liu

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=cover.1592934880.git.liu.denton@gmail.com \
    --to=liu.denton@gmail.com \
    --cc=chris.torek@gmail.com \
    --cc=congdanhqx@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=peff@peff.net \
    /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.