From: Johannes Sixt <j.sixt@viscovery.net>
To: "Andrzej K. Haczewski" <ahaczewski@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] MSVC: port pthread code to native Windows threads
Date: Wed, 04 Nov 2009 13:39:04 +0100 [thread overview]
Message-ID: <4AF175E8.7020400@viscovery.net> (raw)
In-Reply-To: <1257331059-26344-1-git-send-email-ahaczewski@gmail.com>
Please do not cull Cc list when you resend a patch, if possible.
After staring some time on the code, I have convinced myself that the
pthread_cond_wait and pthread_cond_signal implementation will work *in our
usage scenario* that has these preconditions:
- There is no more than one thread waiting on any particular condition
variable instance.
- pthread_cond_signal is called while the mutex is held.
- We retest the condition after pthread_cond_wait returns.
These conditions should be attached in BIG BOLD letters to this
implementation; particularly, the last one.
On to your patch...
The subject is a bit misleading, IMHO. You are not porting the
(p)threading code, but you are adding pthread_* function wrappers for Windows.
Your patch adds whitespace-at-eol. Please use git show --check to see where.
Andrzej K. Haczewski schrieb:
> Here is slightly modified patch with more comments where explanations were
> requested (ie. non atomic release mutex and wait).
>
> The implementation of conditional variable is based on ACE.
>
> The patch needs testing from someone capable of compiling Git on Windows
> and running it with msysgit environment. I can confirm that it compiles
> cleanly on both Linux and Windows. I modified Makefile only for MSVC
> part, so if you'd like to compile it with mingw or cygwin, proper
> corrections have to be made. I aim for native MSVC compilation, that's
> why I did it like that. That's also the reason I don't like
> having Pthreads for Win32 dependency - it's faster to use native
> calls than depend on 3rd party wrapper library to do it for you
> (ie. pthreads for win32 does allocations to implement POSIX
> standard, and full-conformance isn't required by Git, since Git uses
> only small subset of pthreads).
>
> One more motivation I had for the patch: as I was reading through
> archives I had a feeling that Git aims to be as lightweight
> as possible, hence removing additional dependencies (even for
> Windows platform) seems sensible to me.
>
> Signed-off-by: Andrzej K. Haczewski <ahaczewski@gmail.com>
Please drop words from the commit message that do not make sense once this
commit is in git's history. Look at existing commit messages to get a
feeling for the style. Do write about "why" (motivation), "how" (design
choices) and "how not" (dead ends that you tried).
> diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
> index 02f9246..c96d293 100644
> --- a/builtin-pack-objects.c
> +++ b/builtin-pack-objects.c
> @@ -1592,7 +1592,7 @@ struct thread_params {
>
> static pthread_cond_t progress_cond = PTHREAD_COND_INITIALIZER;
>
> -static void *threaded_find_deltas(void *arg)
> +static THREAD_FUNC(threaded_find_deltas, arg)
> ...
> - return NULL;
> + THREAD_RETURN(NULL);
See Erik's and Paolo's comments.
> @@ -2327,6 +2327,18 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
> #ifdef THREADED_DELTA_SEARCH
> if (!delta_search_threads) /* --threads=0 means autodetect */
> delta_search_threads = online_cpus();
> +
> +#ifdef _WIN32
> + /*
> + * Windows requires initialization of mutex (CRITICAL_SECTION)
> + * and conditional variable.
> + */
> + pthread_mutex_init(&read_mutex);
> + pthread_mutex_init(&cache_mutex);
> + pthread_mutex_init(&progress_mutex);
> + pthread_cond_init(&progress_cond, NULL);
> +#endif
I think it would be OK to drop '= PTHREAD_{MUTEX,COND}_INITIALIZER' and
use *_init function calls without the #ifdef. Likewise for *_destroy.
> +cleanup:
> +#if defined(THREADED_DELTA_SEARCH) && defined(_WIN32)
> + /* cleanup Windows threads thingies */
> + pthread_cond_destroy(&progress_cond);
> + pthread_mutex_destroy(&read_mutex);
> + pthread_mutex_destroy(&cache_mutex);
> + pthread_mutex_destroy(&progress_mutex);
> +#endif
> +
> return 0;
> }
> +
Drop this empty line at EOF.
> @@ -0,0 +1,143 @@
> +/*
> + * Header used to "adapt" pthread-based POSIX code to Windows API threads.
I think "adapt" is the right word here. You don't need to put it in quotes. ;)
> + *
> + * Copyright (C) 2009 Andrzej K. Haczewski <ahaczewski@gmail.com>
> + */
> +
> +#ifndef PTHREAD_H
> +#define PTHREAD_H
> +
> +#ifndef WIN32_LEAN_AND_MEAN
> +#define WIN32_LEAN_AND_MEAN
> +#endif
> +
> +#include <windows.h>
> +
> +/*
> + * don't include mingw.h for err_win_to_posix function - mingw.h doesn't
> + * have include-guards
So what? Is there an #include loop? Can't you add include guards?
> +static __inline int pthread_cond_init(pthread_cond_t *cond, const void *unused)
What's wrong with 'static inline int ...' (without the underscores)?
> +{
> + cond->waiters = 0;
> +
> + InitializeCriticalSection(&cond->waiters_lock);
> +
> + cond->sema = CreateSemaphore(NULL, 0, LONG_MAX, NULL);
> + if (NULL == cond->sema)
> + return -1;
> + return 0;
In case of failure, the pthread_* functions return the error number, not
-1. Moreover, we write
if (!cond->sema)
return err_win_to_posix(GetLastError());
or
return cond->sema ? 0 : err_win_to_posix(GetLastError());
> +static __inline int pthread_cond_wait(pthread_cond_t *cond, CRITICAL_SECTION *mutex)
> +{
> ...
> + /* let's wait */
> + if (0 != WaitForSingleObject(cond->sema, INFINITE))
> + ret = -1;
Mind the return value!
> +static __inline int pthread_cond_signal(pthread_cond_t *cond)
> +{
> ...
> + if (have_waiters)
> + return ReleaseSemaphore(cond->sema, 1, NULL) ? 0 : -1;
Return value again.
> +static __inline int pthread_create(pthread_t *t, const void *unused, DWORD (__stdcall *start_routine)(LPVOID), void *arg)
> +{
> + *t = CreateThread(NULL, 0, start_routine, arg, 0, NULL);
> +
> + if (NULL == *t) {
if (!*t)
> + errno = err_win_to_posix(GetLastError());
> + return -1;
Return value again. errno is not set.
> + } else {
> + errno = 0;
> + return 0;
> + }
> +}
> +
> +static __inline int pthread_join(pthread_t t, void **unused)
> +{
> ...
> + errno = err_win_to_posix(GetLastError());
> + return -1;
And again.
-- Hannes
next prev parent reply other threads:[~2009-11-04 12:39 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-03 21:30 [PATCH 0/1] Port of pthreads to Windows API threads Andrzej K. Haczewski
2009-11-03 21:30 ` [PATCH 1/1] MSVC: port pthread code to native Windows threads Andrzej K. Haczewski
2009-11-03 23:38 ` Johannes Schindelin
2009-11-04 2:34 ` Joshua Jensen
2009-11-04 7:44 ` Andrzej K. Haczewski
2009-11-04 8:24 ` Johannes Sixt
2009-11-04 11:02 ` Johannes Schindelin
2009-11-04 8:17 ` Andrzej K. Haczewski
2009-11-04 8:15 ` Johannes Sixt
2009-11-04 8:48 ` Michael Wookey
2009-11-04 10:53 ` Andrzej K. Haczewski
2009-11-04 10:37 ` [PATCH] " Andrzej K. Haczewski
2009-11-04 10:50 ` Erik Faye-Lund
2009-11-04 10:56 ` Andrzej K. Haczewski
2009-11-04 11:14 ` Paolo Bonzini
2009-11-04 11:23 ` Paolo Bonzini
2009-11-04 12:39 ` Johannes Sixt [this message]
2009-11-04 13:47 ` Andrzej K. Haczewski
2009-11-04 14:34 ` Johannes Sixt
2009-11-04 14:50 ` Andrzej K. Haczewski
2009-11-04 20:43 ` Daniel Barkalow
2009-11-04 21:17 ` Nicolas Pitre
2009-11-04 22:22 ` Daniel Barkalow
2009-11-05 0:27 ` Nicolas Pitre
2009-11-05 13:48 ` Dmitry Potapov
2009-11-04 14:14 ` Andrzej K. Haczewski
2009-11-04 14:19 ` Erik Faye-Lund
2009-11-04 14:04 ` Johannes Schindelin
2009-11-04 15:55 ` [PATCH] MSVC: Windows-native implementation for subset of Pthreads API Andrzej K. Haczewski
2009-11-04 18:10 ` Nicolas Pitre
2009-11-04 21:16 ` Andrzej K. Haczewski
2009-11-04 21:32 ` [PATCH] pack-objects: move thread autodetection closer to relevant code Nicolas Pitre
2009-11-06 7:20 ` Junio C Hamano
2009-11-04 21:41 ` [PATCH] MSVC: Windows-native implementation for subset of Pthreads API Erik Faye-Lund
2009-11-04 22:50 ` Andrzej K. Haczewski
2009-11-05 2:47 ` Nicolas Pitre
2009-11-05 9:00 ` Andrzej K. Haczewski
2009-11-05 9:41 ` Erik Faye-Lund
2009-11-05 10:18 ` Andrzej K. Haczewski
2009-11-05 12:27 ` Johannes Sixt
2009-11-05 12:53 ` Andrzej K. Haczewski
2009-11-05 19:25 ` Nicolas Pitre
2009-11-05 20:38 ` Andrzej K. Haczewski
2009-11-05 22:15 ` Nicolas Pitre
2009-11-04 21:52 ` Nicolas Pitre
2009-11-04 23:47 ` Andrzej K. Haczewski
2009-11-04 23:57 ` Andrzej K. Haczewski
2009-11-05 0:22 ` Nicolas Pitre
2009-11-05 8:51 ` Andrzej K. Haczewski
2009-11-05 19:22 ` Nicolas Pitre
2009-11-05 2:10 ` Nicolas Pitre
2009-11-05 8:45 ` Andrzej K. Haczewski
2009-11-05 19:17 ` Nicolas Pitre
2009-11-05 7:33 ` Johannes Sixt
2009-11-04 23:58 ` Junio C Hamano
2009-11-05 16:45 ` Andrzej K. Haczewski
2009-11-05 17:31 ` Johannes Sixt
2009-11-05 19:39 ` Nicolas Pitre
2009-11-05 20:09 ` Andrzej K. Haczewski
2009-11-05 20:36 ` Nicolas Pitre
2009-11-06 8:10 ` Andrzej K. Haczewski
2009-11-06 8:25 ` 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4AF175E8.7020400@viscovery.net \
--to=j.sixt@viscovery.net \
--cc=ahaczewski@gmail.com \
--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.
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.