git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCHv4 4/6] Git.pm: allow pipes to be closed prior to calling command_close_bidi_pipe

From
MNMichal Nazarewicz <mpn@google.com>
Date
Feb 12, 2013, 14:02 UTC
Message-ID
<3bb6b7736eb4b0a958469be13d8c646faec1208a.1360677646.git.mina86@mina86.com>
In-Reply-To
<cover.1360677646.git.mina86@mina86.com>
From: Michal Nazarewicz <mina86@mina86.com>

The command_close_bidi_pipe() function will insist on closing both input and output pipes returned by command_bidi_pipe(). With this change it is possible to close one of the pipes in advance and pass undef as an argument.

Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
---
 perl/Git.pm | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/perl/Git.pm b/perl/Git.pm
index 6bc9a3c..d6e6c9e 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -426,12 +426,25 @@ Note that you should not rely on whatever actually is in C<CTX>;
 currently it is simply the command name but in future the context might
 have more complicated structure.
 
+C<PIPE_IN> and C<PIPE_OUT> may be C<undef> if they have been closed prior to
+calling this function.  This may be useful in a query-response type of
+commands where caller first writes a query and later reads response, eg:
+
+	my ($pid, $in, $out, $ctx) = $r->command_bidi_pipe('cat-file --batch-check');
+	print $out "000000000\n";
+	close $out;
+	while (<$in>) { ... }
+	$r->command_close_bidi_pipe($pid, $in, undef, $ctx);
+
+This idiom may prevent potential dead locks caused by data sent to the output
+pipe not being flushed and thus not reaching the executed command.
+
 =cut
 
 sub command_close_bidi_pipe {
 	local $?;
 	my ($self, $pid, $in, $out, $ctx) = _maybe_self(@_);
-	_cmd_close($ctx, $in, $out);
+	_cmd_close($ctx, grep defined, $in, $out);
 	waitpid $pid, 0;
 	if ($? >> 8) {
 		throw Git::Error::Command($ctx, $? >>8);
-- 
1.8.1.3.572.g32bae1f
Previous: Junio C HamanoNext: Jeff King
Message 9 of 22 in “[PATCHv4 0/6] git-credential support in git-send-email”
  1. Michal NazarewiczFeb 12, 2013
  2. 1/6 Git.pm: allow command_close_bidi_pipe to be called as methodMichal Nazarewicz, Feb 12, 2013
  3. 2/6 Git.pm: fix example in command_close_bidi_pipe documentationMichal Nazarewicz, Feb 12, 2013
  4. 3/6 Git.pm: refactor command_close_bidi_pipe to use _cmd_closeMichal Nazarewicz, Feb 12, 2013
  5. Junio C HamanoFeb 12, 2013
  6. Jeff KingFeb 12, 2013
  7. Michal NazarewiczFeb 12, 2013
  8. Junio C HamanoFeb 12, 2013
  9. 4/6 Git.pm: allow pipes to be closed prior to calling command_close_bidi_pipeMichal Nazarewicz, Feb 12, 2013
  10. Jeff KingFeb 12, 2013
  11. Michal NazarewiczFeb 12, 2013
  12. Junio C HamanoFeb 12, 2013
  13. Jeff KingFeb 12, 2013
  14. Michal NazarewiczFeb 12, 2013
  15. 5/6 Git.pm: add interface for git credential commandMichal Nazarewicz, Feb 12, 2013
  16. Matthieu MoyFeb 27, 2013
  17. 6/6 git-send-email: use git credential to obtain passwordMichal Nazarewicz, Feb 12, 2013
  18. Matthieu MoyFeb 27, 2013
  19. Junio C HamanoFeb 27, 2013
  20. Michal NazarewiczFeb 27, 2013
  21. Matthieu MoyFeb 27, 2013
  22. Junio C HamanoFeb 27, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.