* [PATCH/RFC 0/3] port upload-archive to windows
@ 2011-07-07 11:43 Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 1/3] compat/win32/sys/poll.c: upgrade from upstream Erik Faye-Lund
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Erik Faye-Lund @ 2011-07-07 11:43 UTC (permalink / raw)
To: git
Upload-archive, while compiled and installed on Windows, never
worked due to it's dependence on fork. This is a patch-series to
remedy that.
While doing this, I found a bug in gnulib's poll-emulation where
it could return 0 even when timeout was -1. This is neither
something POSIX allows, nor something our code is expecting.
So I've submitted an upstream patch for gnulib and upgraded our
copy.
Erik Faye-Lund (3):
compat/win32/sys/poll.c: upgrade from upstream
mingw: fix compilation of poll-emulation
upload-archive: use start_command instead of fork
builtin/upload-archive.c | 62 ++++++++++++----------------------------------
compat/mingw.h | 2 -
compat/win32/sys/poll.c | 17 +++++++++---
3 files changed, 28 insertions(+), 53 deletions(-)
--
1.7.6.135.ge14e3f
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH/RFC 1/3] compat/win32/sys/poll.c: upgrade from upstream
2011-07-07 11:43 [PATCH/RFC 0/3] port upload-archive to windows Erik Faye-Lund
@ 2011-07-07 11:43 ` Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 2/3] mingw: fix compilation of poll-emulation Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 3/3] upload-archive: use start_command instead of fork Erik Faye-Lund
2 siblings, 0 replies; 11+ messages in thread
From: Erik Faye-Lund @ 2011-07-07 11:43 UTC (permalink / raw)
To: git
poll.c is updated from revision adc3a5b in
git://git.savannah.gnu.org/gnulib.git
The changes are applied with --whitespace=fix to reduce noise.
poll.h is not upgraded, because the most recent version now
contains template-stuff that breaks compilation for us.
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
---
compat/win32/sys/poll.c | 19 +++++++++++++------
1 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/compat/win32/sys/poll.c b/compat/win32/sys/poll.c
index 708a6c9..403eaa7 100644
--- a/compat/win32/sys/poll.c
+++ b/compat/win32/sys/poll.c
@@ -1,7 +1,7 @@
/* Emulation for poll(2)
Contributed by Paolo Bonzini.
- Copyright 2001-2003, 2006-2010 Free Software Foundation, Inc.
+ Copyright 2001-2003, 2006-2011 Free Software Foundation, Inc.
This file is part of gnulib.
@@ -27,7 +27,10 @@
#include <malloc.h>
#include <sys/types.h>
-#include "poll.h"
+
+/* Specification. */
+#include <poll.h>
+
#include <errno.h>
#include <limits.h>
#include <assert.h>
@@ -314,10 +317,7 @@ compute_revents (int fd, int sought, fd_set *rfds, fd_set *wfds, fd_set *efds)
#endif /* !MinGW */
int
-poll (pfd, nfd, timeout)
- struct pollfd *pfd;
- nfds_t nfd;
- int timeout;
+poll (struct pollfd *pfd, nfds_t nfd, int timeout)
{
#ifndef WIN32_NATIVE
fd_set rfds, wfds, efds;
@@ -454,6 +454,7 @@ poll (pfd, nfd, timeout)
if (!hEvent)
hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
+restart:
handle_array[0] = hEvent;
nhandles = 1;
FD_ZERO (&rfds);
@@ -594,6 +595,12 @@ poll (pfd, nfd, timeout)
rc++;
}
+ if (!rc && timeout == INFTIM)
+ {
+ SwitchToThread();
+ goto restart;
+ }
+
return rc;
#endif
}
--
1.7.6.135.ge14e3f
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH/RFC 2/3] mingw: fix compilation of poll-emulation
2011-07-07 11:43 [PATCH/RFC 0/3] port upload-archive to windows Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 1/3] compat/win32/sys/poll.c: upgrade from upstream Erik Faye-Lund
@ 2011-07-07 11:43 ` Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 3/3] upload-archive: use start_command instead of fork Erik Faye-Lund
2 siblings, 0 replies; 11+ messages in thread
From: Erik Faye-Lund @ 2011-07-07 11:43 UTC (permalink / raw)
To: git
gnulib has changed the inclusion of poll.h from double quotes
to single-quotes. But because compat/win32/sys/ isn't in our
include-path, this breaks compilation. Change it back the way
it was.
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
---
Ugh, I don't like this so much; this means that 1/3 is left in a
broken state, which is a bit nasty for bisection. But this is the
only way I can think of to show what are upstream-changes and what
are git-specific.
An alternative is to move Windows' poll emulation out of the 'sys'
folder, and enable the NO_SYS_POLL_H-switch for MinGW and MSVC
builds.
I'm sure what best approach is. Input, anyone? :)
compat/win32/sys/poll.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/compat/win32/sys/poll.c b/compat/win32/sys/poll.c
index 403eaa7..225ddce 100644
--- a/compat/win32/sys/poll.c
+++ b/compat/win32/sys/poll.c
@@ -29,7 +29,7 @@
#include <sys/types.h>
/* Specification. */
-#include <poll.h>
+#include "poll.h"
#include <errno.h>
#include <limits.h>
--
1.7.6.135.ge14e3f
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH/RFC 3/3] upload-archive: use start_command instead of fork
2011-07-07 11:43 [PATCH/RFC 0/3] port upload-archive to windows Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 1/3] compat/win32/sys/poll.c: upgrade from upstream Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 2/3] mingw: fix compilation of poll-emulation Erik Faye-Lund
@ 2011-07-07 11:43 ` Erik Faye-Lund
2011-07-07 18:21 ` Johannes Sixt
2011-07-07 19:15 ` Jeff King
2 siblings, 2 replies; 11+ messages in thread
From: Erik Faye-Lund @ 2011-07-07 11:43 UTC (permalink / raw)
To: git
The POSIX-function fork is not supported on Windows. Use our
start_command API instead.
As this is the last call-site that depends on the fork-stub in
compat/mingw.h, remove that as well.
Signed-off-by: Erik Faye-Lund <kusmabite@gmail.com>
---
builtin/upload-archive.c | 62 ++++++++++++----------------------------------
compat/mingw.h | 2 -
2 files changed, 16 insertions(+), 48 deletions(-)
diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c
index 73f788e..e05172a 100644
--- a/builtin/upload-archive.c
+++ b/builtin/upload-archive.c
@@ -6,6 +6,7 @@
#include "archive.h"
#include "pkt-line.h"
#include "sideband.h"
+#include "run-command.h"
static const char upload_archive_usage[] =
"git upload-archive <repo>";
@@ -18,28 +19,16 @@ static const char lostchild[] =
#define MAX_ARGS (64)
-static int run_upload_archive(int argc, const char **argv, const char *prefix)
+static void prepare_argv(const char **sent_argv, const char **argv)
{
- const char *sent_argv[MAX_ARGS];
const char *arg_cmd = "argument ";
char *p, buf[4096];
int sent_argc;
int len;
- if (argc != 2)
- usage(upload_archive_usage);
-
- if (strlen(argv[1]) + 1 > sizeof(buf))
- die("insanely long repository name");
-
- strcpy(buf, argv[1]); /* enter-repo smudges its argument */
-
- if (!enter_repo(buf, 0))
- die("'%s' does not appear to be a git repository", buf);
-
/* put received options in sent_argv[] */
sent_argc = 1;
- sent_argv[0] = "git-upload-archive";
+ sent_argv[0] = "archive";
for (p = buf;;) {
/* This will die if not enough free space in buf */
len = packet_read_line(0, p, (buf + sizeof buf) - p);
@@ -62,9 +51,6 @@ static int run_upload_archive(int argc, const char **argv, const char *prefix)
*p++ = 0;
}
sent_argv[sent_argc] = NULL;
-
- /* parse all options sent by the client */
- return write_archive(sent_argc, sent_argv, prefix, 0);
}
__attribute__((format (printf, 1, 2)))
@@ -96,38 +82,22 @@ static ssize_t process_input(int child_fd, int band)
int cmd_upload_archive(int argc, const char **argv, const char *prefix)
{
- pid_t writer;
- int fd1[2], fd2[2];
- /*
- * Set up sideband subprocess.
- *
- * We (parent) monitor and read from child, sending its fd#1 and fd#2
- * multiplexed out to our fd#1. If the child dies, we tell the other
- * end over channel #3.
- */
- if (pipe(fd1) < 0 || pipe(fd2) < 0) {
- int err = errno;
- packet_write(1, "NACK pipe failed on the remote side\n");
- die("upload-archive: %s", strerror(err));
- }
- writer = fork();
- if (writer < 0) {
+ const char *sent_argv[MAX_ARGS];
+ struct child_process cld = { sent_argv };
+ cld.out = cld.err = -1;
+ cld.git_cmd = 1;
+
+ if (argc != 2)
+ usage(upload_archive_usage);
+
+ prepare_argv(sent_argv, argv);
+ if (start_command(&cld)) {
int err = errno;
packet_write(1, "NACK fork failed on the remote side\n");
die("upload-archive: %s", strerror(err));
}
- if (!writer) {
- /* child - connect fd#1 and fd#2 to the pipe */
- dup2(fd1[1], 1);
- dup2(fd2[1], 2);
- close(fd1[1]); close(fd2[1]);
- close(fd1[0]); close(fd2[0]); /* we do not read from pipe */
-
- exit(run_upload_archive(argc, argv, prefix));
- }
/* parent - read from child, multiplex and send out to fd#1 */
- close(fd1[1]); close(fd2[1]); /* we do not write to pipe */
packet_write(1, "ACK\n");
packet_flush(1);
@@ -135,9 +105,9 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix)
struct pollfd pfd[2];
int status;
- pfd[0].fd = fd1[0];
+ pfd[0].fd = cld.out;
pfd[0].events = POLLIN;
- pfd[1].fd = fd2[0];
+ pfd[1].fd = cld.err;
pfd[1].events = POLLIN;
if (poll(pfd, 2, -1) < 0) {
if (errno != EINTR) {
@@ -156,7 +126,7 @@ int cmd_upload_archive(int argc, const char **argv, const char *prefix)
if (process_input(pfd[0].fd, 1))
continue;
- if (waitpid(writer, &status, 0) < 0)
+ if (waitpid(cld.pid, &status, 0) < 0)
error_clnt("%s", lostchild);
else if (!WIFEXITED(status) || WEXITSTATUS(status) > 0)
error_clnt("%s", deadchild);
diff --git a/compat/mingw.h b/compat/mingw.h
index ce9dd98..9cb6eb9 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -85,8 +85,6 @@ static inline int symlink(const char *oldpath, const char *newpath)
{ errno = ENOSYS; return -1; }
static inline int fchmod(int fildes, mode_t mode)
{ errno = ENOSYS; return -1; }
-static inline pid_t fork(void)
-{ errno = ENOSYS; return -1; }
static inline unsigned int alarm(unsigned int seconds)
{ return 0; }
static inline int fsync(int fd)
--
1.7.6.135.ge14e3f
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH/RFC 3/3] upload-archive: use start_command instead of fork
2011-07-07 11:43 ` [PATCH/RFC 3/3] upload-archive: use start_command instead of fork Erik Faye-Lund
@ 2011-07-07 18:21 ` Johannes Sixt
2011-07-07 18:39 ` Erik Faye-Lund
2011-07-07 19:15 ` Jeff King
1 sibling, 1 reply; 11+ messages in thread
From: Johannes Sixt @ 2011-07-07 18:21 UTC (permalink / raw)
To: Erik Faye-Lund; +Cc: git
Am 07.07.2011 13:43, schrieb Erik Faye-Lund:
> - if (!enter_repo(buf, 0))
> - die("'%s' does not appear to be a git repository", buf);
> -
> /* put received options in sent_argv[] */
> sent_argc = 1;
> - sent_argv[0] = "git-upload-archive";
> + sent_argv[0] = "archive";
Is git-archive a valid replacement of enter_repo() followed by
git-upload-archive?
-- Hannes
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH/RFC 3/3] upload-archive: use start_command instead of fork
2011-07-07 18:21 ` Johannes Sixt
@ 2011-07-07 18:39 ` Erik Faye-Lund
0 siblings, 0 replies; 11+ messages in thread
From: Erik Faye-Lund @ 2011-07-07 18:39 UTC (permalink / raw)
To: Johannes Sixt; +Cc: git
On Thu, Jul 7, 2011 at 8:21 PM, Johannes Sixt <j6t@kdbg.org> wrote:
> Am 07.07.2011 13:43, schrieb Erik Faye-Lund:
>> - if (!enter_repo(buf, 0))
>> - die("'%s' does not appear to be a git repository", buf);
>> -
>> /* put received options in sent_argv[] */
>> sent_argc = 1;
>> - sent_argv[0] = "git-upload-archive";
>> + sent_argv[0] = "archive";
>
> Is git-archive a valid replacement of enter_repo() followed by
> git-upload-archive?
>
What do you mean "enter_repo() followed by git-upload-archive"? Don't
you mean "enter_repo() followed by write_archive"? It does work for
me, and the test-suite didn't reveal any breakages either.
write_archive gets called by both versions, but my version doesn't
call enter_repo directly. It is however called by git-daemon before
starting git-upload-archive, so perhaps that's why it works for me.
And that's a regression indeed; I don't respect the path-argument. So
expect a new version over the week-end ;)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH/RFC 3/3] upload-archive: use start_command instead of fork
2011-07-07 11:43 ` [PATCH/RFC 3/3] upload-archive: use start_command instead of fork Erik Faye-Lund
2011-07-07 18:21 ` Johannes Sixt
@ 2011-07-07 19:15 ` Jeff King
2011-07-07 22:25 ` Erik Faye-Lund
1 sibling, 1 reply; 11+ messages in thread
From: Jeff King @ 2011-07-07 19:15 UTC (permalink / raw)
To: Erik Faye-Lund; +Cc: git
On Thu, Jul 07, 2011 at 01:43:09PM +0200, Erik Faye-Lund wrote:
> The POSIX-function fork is not supported on Windows. Use our
> start_command API instead.
Is start_command the right solution? From my reading, the fork is
actually because we want to set up a sideband multiplexer. Should we not
just be using start_async() to start a thread, as we do in receive-pack?
-Peff
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH/RFC 3/3] upload-archive: use start_command instead of fork
2011-07-07 19:15 ` Jeff King
@ 2011-07-07 22:25 ` Erik Faye-Lund
2011-07-07 22:27 ` Jeff King
0 siblings, 1 reply; 11+ messages in thread
From: Erik Faye-Lund @ 2011-07-07 22:25 UTC (permalink / raw)
To: Jeff King; +Cc: git
On Thu, Jul 7, 2011 at 9:15 PM, Jeff King <peff@peff.net> wrote:
> On Thu, Jul 07, 2011 at 01:43:09PM +0200, Erik Faye-Lund wrote:
>
>> The POSIX-function fork is not supported on Windows. Use our
>> start_command API instead.
>
> Is start_command the right solution? From my reading, the fork is
> actually because we want to set up a sideband multiplexer. Should we not
> just be using start_async() to start a thread, as we do in receive-pack?
I considered that, but discarded it because I figured it required me
to plug through a file descriptor all the way through the code. But
perhaps I was wrong, and dup2 will make that job a lot easier?
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH/RFC 3/3] upload-archive: use start_command instead of fork
2011-07-07 22:25 ` Erik Faye-Lund
@ 2011-07-07 22:27 ` Jeff King
2011-07-07 22:37 ` Erik Faye-Lund
0 siblings, 1 reply; 11+ messages in thread
From: Jeff King @ 2011-07-07 22:27 UTC (permalink / raw)
To: Erik Faye-Lund; +Cc: git
On Fri, Jul 08, 2011 at 12:25:00AM +0200, Erik Faye-Lund wrote:
> On Thu, Jul 7, 2011 at 9:15 PM, Jeff King <peff@peff.net> wrote:
> > On Thu, Jul 07, 2011 at 01:43:09PM +0200, Erik Faye-Lund wrote:
> >
> >> The POSIX-function fork is not supported on Windows. Use our
> >> start_command API instead.
> >
> > Is start_command the right solution? From my reading, the fork is
> > actually because we want to set up a sideband multiplexer. Should we not
> > just be using start_async() to start a thread, as we do in receive-pack?
>
> I considered that, but discarded it because I figured it required me
> to plug through a file descriptor all the way through the code. But
> perhaps I was wrong, and dup2 will make that job a lot easier?
Yeah, exactly. The current code is already using dup2 in the same way.
-Peff
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH/RFC 3/3] upload-archive: use start_command instead of fork
2011-07-07 22:27 ` Jeff King
@ 2011-07-07 22:37 ` Erik Faye-Lund
2011-07-07 22:44 ` Jeff King
0 siblings, 1 reply; 11+ messages in thread
From: Erik Faye-Lund @ 2011-07-07 22:37 UTC (permalink / raw)
To: Jeff King; +Cc: git
On Fri, Jul 8, 2011 at 12:27 AM, Jeff King <peff@peff.net> wrote:
> On Fri, Jul 08, 2011 at 12:25:00AM +0200, Erik Faye-Lund wrote:
>
>> On Thu, Jul 7, 2011 at 9:15 PM, Jeff King <peff@peff.net> wrote:
>> > On Thu, Jul 07, 2011 at 01:43:09PM +0200, Erik Faye-Lund wrote:
>> >
>> >> The POSIX-function fork is not supported on Windows. Use our
>> >> start_command API instead.
>> >
>> > Is start_command the right solution? From my reading, the fork is
>> > actually because we want to set up a sideband multiplexer. Should we not
>> > just be using start_async() to start a thread, as we do in receive-pack?
>>
>> I considered that, but discarded it because I figured it required me
>> to plug through a file descriptor all the way through the code. But
>> perhaps I was wrong, and dup2 will make that job a lot easier?
>
> Yeah, exactly. The current code is already using dup2 in the same way.
>
It does, but I'm not entirely sure how dup2 works when start_async is
implemented with threads. Won't cause the multiplexer to fail (the
multiplexer and the archive-thread needs different stdouts), because
file descriptors are process-resources, and not thread-resources?
I guess I could dup stdout/stderr before dup2'ing, and have the
multiplexer write to explicitly to the duped fds. It's starting to
sound very confusing to my ears, but perhaps it's the best option
still ;)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH/RFC 3/3] upload-archive: use start_command instead of fork
2011-07-07 22:37 ` Erik Faye-Lund
@ 2011-07-07 22:44 ` Jeff King
0 siblings, 0 replies; 11+ messages in thread
From: Jeff King @ 2011-07-07 22:44 UTC (permalink / raw)
To: Erik Faye-Lund; +Cc: git
On Fri, Jul 08, 2011 at 12:37:48AM +0200, Erik Faye-Lund wrote:
> > Yeah, exactly. The current code is already using dup2 in the same way.
>
> It does, but I'm not entirely sure how dup2 works when start_async is
> implemented with threads. Won't cause the multiplexer to fail (the
> multiplexer and the archive-thread needs different stdouts), because
> file descriptors are process-resources, and not thread-resources?
Oh, right. I'm being a moron. Sorry.
> I guess I could dup stdout/stderr before dup2'ing, and have the
> multiplexer write to explicitly to the duped fds. It's starting to
> sound very confusing to my ears, but perhaps it's the best option
> still ;)
Yes, you would have to dup stdout in the muxer to a new fd, then write
to that explicitly. And then you would be free to dup the write half of
the async pipe to stdout. It's not all that complicated, but maybe it is
simpler and more obvious (especially to a later reader of the code) to
just run a separate command.
-Peff
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-07-07 22:44 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-07 11:43 [PATCH/RFC 0/3] port upload-archive to windows Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 1/3] compat/win32/sys/poll.c: upgrade from upstream Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 2/3] mingw: fix compilation of poll-emulation Erik Faye-Lund
2011-07-07 11:43 ` [PATCH/RFC 3/3] upload-archive: use start_command instead of fork Erik Faye-Lund
2011-07-07 18:21 ` Johannes Sixt
2011-07-07 18:39 ` Erik Faye-Lund
2011-07-07 19:15 ` Jeff King
2011-07-07 22:25 ` Erik Faye-Lund
2011-07-07 22:27 ` Jeff King
2011-07-07 22:37 ` Erik Faye-Lund
2011-07-07 22:44 ` Jeff King
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 NNTP newsgroup(s).