git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Johannes Sixt <johannes.sixt@telecom.at>
To: git@vger.kernel.org
Cc: Johannes Sixt <johannes.sixt@telecom.at>
Subject: [PATCH 22/40] Windows: Implement asynchronous functions as threads.
Date: Wed, 27 Feb 2008 19:54:45 +0100	[thread overview]
Message-ID: <1204138503-6126-23-git-send-email-johannes.sixt@telecom.at> (raw)
In-Reply-To: <1204138503-6126-1-git-send-email-johannes.sixt@telecom.at>

In upload-pack we must explicitly close the output channel of rev-list.
(On Unix, the channel is closed automatically because process that runs
rev-list terminates.)

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
---
 run-command.c |   29 ++++++++++++++++++++++++++++-
 run-command.h |    5 +++++
 upload-pack.c |    2 ++
 3 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/run-command.c b/run-command.c
index 873f6d0..3834f86 100644
--- a/run-command.c
+++ b/run-command.c
@@ -276,13 +276,23 @@ int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const
 	return run_command(&cmd);
 }
 
+#ifdef __MINGW32__
+static __stdcall unsigned run_thread(void *data)
+{
+	struct async *async = data;
+	return async->proc(async->fd_for_proc, async->data);
+}
+#endif
+
 int start_async(struct async *async)
 {
 	int pipe_out[2];
 
 	if (pipe(pipe_out) < 0)
 		return error("cannot create pipe: %s", strerror(errno));
+	async->out = pipe_out[0];
 
+#ifndef __MINGW32__
 	async->pid = fork();
 	if (async->pid < 0) {
 		error("fork (async) failed: %s", strerror(errno));
@@ -293,16 +303,33 @@ int start_async(struct async *async)
 		close(pipe_out[0]);
 		exit(!!async->proc(pipe_out[1], async->data));
 	}
-	async->out = pipe_out[0];
 	close(pipe_out[1]);
+#else
+	async->fd_for_proc = pipe_out[1];
+	async->tid = (HANDLE) _beginthreadex(NULL, 0, run_thread, async, 0, NULL);
+	if (!async->tid) {
+		error("cannot create thread: %s", strerror(errno));
+		close_pair(pipe_out);
+		return -1;
+	}
+#endif
 	return 0;
 }
 
 int finish_async(struct async *async)
 {
+#ifndef __MINGW32__
 	int ret = 0;
 
 	if (wait_or_whine(async->pid))
 		ret = error("waitpid (async) failed");
+#else
+	DWORD ret = 0;
+	if (WaitForSingleObject(async->tid, INFINITE) != WAIT_OBJECT_0)
+		ret = error("waiting for thread failed: %lu", GetLastError());
+	else if (!GetExitCodeThread(async->tid, &ret))
+		ret = error("cannot get thread exit code: %lu", GetLastError());
+	CloseHandle(async->tid);
+#endif
 	return ret;
 }
diff --git a/run-command.h b/run-command.h
index 1fc781d..0bbac86 100644
--- a/run-command.h
+++ b/run-command.h
@@ -60,7 +60,12 @@ struct async {
 	int (*proc)(int fd, void *data);
 	void *data;
 	int out;	/* caller reads from here and closes it */
+#ifndef __MINGW32__
 	pid_t pid;
+#else
+	HANDLE tid;
+	int fd_for_proc;
+#endif
 };
 
 int start_async(struct async *async);
diff --git a/upload-pack.c b/upload-pack.c
index b26d053..3c99c8d 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -133,6 +133,8 @@ static int do_rev_list(int fd, void *create_full_pack)
 		die("revision walk setup failed");
 	mark_edges_uninteresting(revs.commits, &revs, show_edge);
 	traverse_commit_list(&revs, show_commit, show_object);
+	fflush(pack_pipe);
+	fclose(pack_pipe);
 	return 0;
 }
 
-- 
1.5.4.1.126.ge5a7d

  parent reply	other threads:[~2008-02-27 18:59 UTC|newest]

Thread overview: 138+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-27 18:54 [PATCH 00/40] MinGW port Johannes Sixt
2008-02-27 18:54 ` [PATCH 01/40] Add compat/regex.[ch] and compat/fnmatch.[ch] Johannes Sixt
2008-02-27 23:43   ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 02/40] Compile some programs only conditionally Johannes Sixt
2008-02-28 11:57   ` Johannes Schindelin
2008-02-28 20:30     ` Johannes Sixt
2008-02-29  0:47       ` Johannes Schindelin
2008-02-29 20:58         ` Johannes Sixt
2008-02-29 21:53           ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 03/40] Add target architecture MinGW Johannes Sixt
2008-02-28 12:05   ` Johannes Schindelin
2008-02-28 12:57     ` Paolo Bonzini
2008-02-28 14:56       ` Johannes Schindelin
2008-02-28 20:40     ` Johannes Sixt
2008-02-29  1:07       ` Johannes Schindelin
2008-02-29 21:03         ` Johannes Sixt
2008-02-29 21:54           ` Johannes Schindelin
2008-03-05 21:21     ` Johannes Sixt
2008-03-05 22:18       ` Johannes Schindelin
2008-03-05 22:22         ` Junio C Hamano
2008-03-05 22:28           ` Johannes Schindelin
2008-03-05 22:51             ` Junio C Hamano
2008-03-06  0:11               ` Johannes Schindelin
2008-03-06  1:14             ` [PATCH 1/2] Add strbuf_initf() Johannes Schindelin
2008-03-06  6:33               ` Mike Hommey
2008-03-06  9:03                 ` Reece Dunn
2008-03-06 10:55                   ` Johannes Schindelin
2008-03-06 11:53                     ` Reece Dunn
2008-03-06 12:52                       ` Johannes Schindelin
2008-03-06 16:29                         ` [PATCH 1/2 v2] Add strbuf_vaddf(), use it in strbuf_addf(), and add strbuf_initf() Johannes Schindelin
2008-03-06 16:38                           ` Johannes Sixt
2008-03-06 16:47                             ` Johannes Sixt
2008-03-06 16:59                               ` Johannes Schindelin
2008-03-06 18:18                     ` [PATCH 1/2] Add strbuf_initf() Kristian Høgsberg
2008-03-06 18:26                       ` Johannes Schindelin
2008-03-06 18:35                         ` Kristian Høgsberg
2008-03-06 19:10                         ` Mike Hommey
2008-03-06 10:53                 ` Johannes Schindelin
2008-03-06 12:09                   ` Jeff King
2008-03-06  1:15             ` [PATCH 2/2] format-patch: add --reviewed-by=<ident> Johannes Schindelin
2008-03-06  2:40               ` Junio C Hamano
2008-03-06 10:40                 ` Johannes Schindelin
2008-03-06 20:38         ` [PATCH 03/40] Add target architecture MinGW Johannes Sixt
2008-03-11 21:30       ` Johannes Sixt
2008-03-11 23:28         ` Johannes Schindelin
2008-03-12 22:59           ` Johannes Sixt
2008-03-12 23:06             ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 04/40] Windows: Use the Windows style PATH separator ';' Johannes Sixt
2008-02-28  9:25   ` Paolo Bonzini
2008-02-28 20:43     ` Johannes Sixt
2008-02-29  1:09       ` Johannes Schindelin
2008-02-29  7:57       ` Paolo Bonzini
2008-02-29 12:19         ` Johannes Schindelin
2008-02-29 12:45           ` Paolo Bonzini
2008-02-29 12:59             ` Johannes Schindelin
2008-02-28 17:57   ` Junio C Hamano
2008-02-27 18:54 ` [PATCH 05/40] Windows: Strip ".exe" from the program name Johannes Sixt
2008-02-27 18:54 ` [PATCH 06/40] Windows: Implement a wrapper of the open() function Johannes Sixt
2008-02-27 18:54 ` [PATCH 07/40] Windows: A minimal implemention of getpwuid() Johannes Sixt
2008-02-27 18:54 ` [PATCH 08/40] Windows: always chmod(, 0666) before unlink() Johannes Sixt
2008-02-28 12:09   ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 09/40] Windows: Work around misbehaved rename() Johannes Sixt
2008-02-27 18:54 ` [PATCH 10/40] Windows: Treat Windows style path names Johannes Sixt
2008-02-28 12:18   ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 11/40] Windows: Handle absolute paths in safe_create_leading_directories() Johannes Sixt
2008-02-27 18:54 ` [PATCH 12/40] Windows: Implement gettimeofday() Johannes Sixt
2008-02-27 18:54 ` [PATCH 13/40] Windows: Fix PRIuMAX definition Johannes Sixt
2008-02-28 12:21   ` Johannes Schindelin
2008-02-28 20:45     ` Johannes Sixt
2008-02-27 18:54 ` [PATCH 14/40] Windows: Implement setitimer() and sigaction() Johannes Sixt
2008-02-27 18:54 ` [PATCH 15/40] Windows: A work-around for a misbehaved vsnprintf Johannes Sixt
2008-02-27 18:54 ` [PATCH 16/40] Windows: Wrap execve so that shell scripts can be invoked Johannes Sixt
2008-02-27 18:54 ` [PATCH 17/40] Windows: A pipe() replacement whose ends are not inherited to children Johannes Sixt
2008-02-27 18:54 ` [PATCH 18/40] Windows: Implement start_command() Johannes Sixt
2008-02-27 18:54 ` [PATCH 19/40] Windows: Change the name of hook scripts to make them not executable Johannes Sixt
2008-02-28 15:20   ` Johannes Schindelin
2008-02-28 20:48     ` Johannes Sixt
2008-02-29  1:11       ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 20/40] Windows: A rudimentary poll() emulation Johannes Sixt
2008-02-28  9:36   ` Paolo Bonzini
2008-02-28 20:49     ` Johannes Sixt
     [not found]       ` <5d46db230802282019o21f9ed9fo75fed8744625289e@mail.gmail.com>
     [not found]         ` <200802292216.25014.johannes.sixt@telecom.at>
2008-02-29 21:47           ` Govind Salinas
2008-02-29 22:16             ` Johannes Sixt
2008-02-29 23:17             ` Brian Dessent
2008-03-01 15:48       ` Robin Rosenberg
2008-03-01 19:24         ` Johannes Sixt
2008-02-27 18:54 ` [PATCH 21/40] Windows: Disambiguate DOS style paths from SSH URLs Johannes Sixt
2008-02-28 15:22   ` Johannes Schindelin
2008-02-28 20:51     ` Johannes Sixt
2008-02-27 18:54 ` Johannes Sixt [this message]
2008-02-28 15:28   ` [PATCH 22/40] Windows: Implement asynchronous functions as threads Johannes Schindelin
2008-02-28 17:48     ` Paul Franz
2008-02-29  1:27       ` Johannes Schindelin
2008-02-29  1:46         ` Paul Franz
2008-02-29  1:54           ` Johannes Schindelin
2008-02-29  3:08             ` Paul Franz
2008-02-29  7:51               ` Junio C Hamano
2008-02-29 11:45                 ` Paul Franz
2008-02-29 10:26               ` Johannes Schindelin
2008-02-28 21:01     ` Johannes Sixt
2008-02-29  1:17       ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 23/40] Windows: Local clone must use the drive letter in absolute paths Johannes Sixt
2008-02-28 15:31   ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 24/40] Windows: Work around incompatible sort and find Johannes Sixt
2008-02-27 18:54 ` [PATCH 25/40] Windows: Implement a cpio emulation in git-clone.sh Johannes Sixt
2008-02-27 18:54 ` [PATCH 26/40] Windows: Implement wrappers for gethostbyname(), socket(), and connect() Johannes Sixt
2008-02-27 18:54 ` [PATCH 27/40] Windows: Implement a custom spawnve() Johannes Sixt
2008-02-28 15:36   ` Johannes Schindelin
2008-02-28 21:04     ` Johannes Sixt
2008-02-29  1:18       ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 28/40] Windows: Add a new lstat and fstat implementation based on Win32 API Johannes Sixt
2008-02-27 18:54 ` [PATCH 29/40] Windows: Use a customized struct stat that also has the st_blocks member Johannes Sixt
2008-02-27 18:54 ` [PATCH 30/40] Turn builtin_exec_path into a function Johannes Sixt
2008-02-27 18:54 ` [PATCH 31/40] Compute the ultimate fallback for exec_path from the program invocation Johannes Sixt
2008-02-27 18:54 ` [PATCH 32/40] Windows: Use a relative default template_dir and ETC_GITCONFIG Johannes Sixt
2008-02-27 18:54 ` [PATCH 33/40] When installing, be prepared that template_dir may be relative Johannes Sixt
2008-02-28  9:49   ` Paolo Bonzini
2008-02-28 15:45   ` Johannes Schindelin
2008-02-28 15:57     ` Paolo Bonzini
2008-02-28 21:12     ` Johannes Sixt
2008-02-29  1:21       ` Johannes Schindelin
2008-02-27 18:54 ` [PATCH 34/40] Windows: Make the pager work Johannes Sixt
2008-02-27 18:54 ` [PATCH 35/40] Windows: Work around an oddity when a pipe with no reader is written to Johannes Sixt
2008-02-27 18:54 ` [PATCH 36/40] Avoid the "dup dance" in wt_status_print_verbose() when possible Johannes Sixt
2008-02-28 15:48   ` Johannes Schindelin
2008-02-27 18:55 ` [PATCH 37/40] Windows: Make 'git help -a' work Johannes Sixt
2008-02-28  9:52   ` Paolo Bonzini
2008-02-27 18:55 ` [PATCH 38/40] Windows: TMP and TEMP environment variables specify a temporary directory Johannes Sixt
2008-02-27 18:55 ` [PATCH 39/40] Windows: Fix ntohl() related warnings about printf formatting Johannes Sixt
2008-02-27 18:55 ` [PATCH 40/40] compat/pread.c: Add foward decl to fix warning Johannes Sixt
2008-02-28 15:51   ` Johannes Schindelin
2008-02-27 22:01 ` [PATCH 00/40] MinGW port Marius Storm-Olsen
2008-02-27 23:34   ` Martin Langhoff
2008-02-28  3:38     ` Nguyen Thai Ngoc Duy
2008-02-27 23:58 ` Johannes Schindelin
2008-03-02 21:20 ` Johannes Sixt
2008-03-02 22:07   ` Johannes Schindelin
2008-03-03 18:34     ` Johannes Sixt

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

  List information: http://vger.kernel.org/majordomo-info.html

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

  git send-email \
    --in-reply-to=1204138503-6126-23-git-send-email-johannes.sixt@telecom.at \
    --to=johannes.sixt@telecom.at \
    --cc=git@vger.kernel.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).