git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Dmitry Potapov <dpotapov@gmail.com>
To: Johannes Sixt <j6t@kdbg.org>
Cc: kusmabite@gmail.com, msysgit <msysgit@googlegroups.com>,
	git@vger.kernel.org,
	"Andrzej K. Haczewski" <ahaczewski@gmail.com>
Subject: Re: [PATCH 1/5] MSVC: Windows-native implementation for subset of Pthreads API
Date: Wed, 13 Jan 2010 15:53:12 +0300	[thread overview]
Message-ID: <20100113125312.GD10586@dpotapov.dyndns.org> (raw)
In-Reply-To: <201001122213.38287.j6t@kdbg.org>

On Tue, Jan 12, 2010 at 10:13:38PM +0100, Johannes Sixt wrote:
> On Freitag, 8. Januar 2010, Erik Faye-Lund wrote:
> > On Fri, Jan 8, 2010 at 4:32 AM, Dmitry Potapov <dpotapov@gmail.com> wrote:
> > > AFAIK, Win32 API assumes that reading LONG is always atomic, so
> > > the critical section is not really necesary here, but you need
> > > to declare 'waiters' as 'volatile':
> >
> > "Simple reads and writes to properly-aligned 32-bit variables are
> > atomic operations."
> > http://msdn.microsoft.com/en-us/library/ms684122(VS.85).aspx
> 
> But then the next sentence is:
> 
> "However, access is not guaranteed to be synchronized. If two threads are 
> reading and writing from the same variable, you cannot determine if one 
> thread will perform its read operation before the other performs its write 
> operation."
> 
> This goes without saying, IOW, those Microsofties don't know what they write, 
> which makes the documentation a bit less trustworthy.

The fact that Microsoft documentation is not written by brightest people
in the world is well known...

> 
> Nevertheless, I rewrote the code to use Interlocked* functions, and then read 
> the documentation again. InterlockedIncrement reads, for example:
> 
> "... This function is atomic with respect to calls to other interlocked 
> functions."

I have no clue what the author meant here. Perhaps Microsoft wanted to
reserve the right to implement Interlocked functions using an internal
lock on those architectures that do not have atomic operations. (For
instance, ARMv5 does not have atomic operations).

But any sane implementation of a critical section primitive requires
some operation that is atomic with respect to the user space (or you
kill the performance by calling some syscall in noncontentious case).
For instance, the Linux kernel provides this possibility by providing
__kernel_cmpxchg for ARM, which can be used to implement all other
synchronization primitives such mutexes and conditions. (Or on some
small MMU-less embedded system, disabling interrupts or the scheduler
lock is used). So, any sane implementation should atomic not only in
respect to other Interlock functions but also other synchronization
primitives.

In any case, on x86, it is implemented as _InterlockedIncrement, which
is a built-in function that generates the appropriate assembler instruction.

> 
> In particular, it doesn't say that it is atomic WRT reads such as we have 
> here:
> 
> > >> +     /* we're done waiting, so make sure we decrease waiters count */
> > >> +     EnterCriticalSection(&cond->waiters_lock);
> > >> +     --cond->waiters;
> > >> +     LeaveCriticalSection(&cond->waiters_lock);

and these lines should be replaced with

  InterlockedDecrement(&cond->waiters)

so it will be safe even on utterly idiotic implementation of Interlocked
functions that uses some internal lock; and as I said earlier on x86,
Interlocked functions are translated in appropriate assembler instructions.


Dmitry

  reply	other threads:[~2010-01-13 12:55 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-07 21:54 [PATCH 0/5] Miscellaneous improvements on Windows Johannes Sixt
2010-01-07 21:54 ` [PATCH 1/5] MSVC: Windows-native implementation for subset of Pthreads API Johannes Sixt
2010-01-08  3:32   ` Dmitry Potapov
2010-01-08 10:58     ` Erik Faye-Lund
2010-01-08 20:40       ` Johannes Sixt
2010-01-08 21:37         ` Dmitry Potapov
2010-01-12 21:13       ` Johannes Sixt
2010-01-13 12:53         ` Dmitry Potapov [this message]
2010-01-13 18:40           ` Johannes Sixt
2010-01-14  5:12             ` Dmitry Potapov
2010-01-14 13:43               ` Peter Harris
2010-01-14 19:55               ` Johannes Sixt
2010-01-07 21:54 ` [PATCH 2/5] MinGW: enable pthreads Johannes Sixt
2010-01-07 21:54 ` [PATCH 3/5] Windows: boost startup by avoiding a static dependency on shell32.dll Johannes Sixt
2010-01-07 21:55 ` [PATCH 4/5] Windows: simplify the pipe(2) implementation Johannes Sixt
2010-01-07 21:55 ` [PATCH 5/5] Windows: avoid the "dup dance" when spawning a child process Johannes Sixt
2010-01-15 20:12 ` [PATCH v2 0/7] Miscellaneous improvements on Windows Johannes Sixt
2010-01-15 20:12   ` [PATCH v2 1/7] Windows: disable Python Johannes Sixt
2010-01-15 20:12   ` [PATCH v2 2/7] Windows: boost startup by avoiding a static dependency on shell32.dll Johannes Sixt
2010-01-15 20:12   ` [PATCH v2 3/7] Windows: simplify the pipe(2) implementation Johannes Sixt
2010-01-15 20:12   ` [PATCH v2 4/7] Windows: avoid the "dup dance" when spawning a child process Johannes Sixt
2010-01-15 20:12   ` [PATCH v2 5/7] MSVC: Fix an "incompatible pointer types" compiler warning Johannes Sixt
2010-01-15 20:12   ` [PATCH v2 6/7] MSVC: Windows-native implementation for subset of Pthreads API Johannes Sixt
2010-01-15 20:12   ` [PATCH v2 7/7] Do not use date.c:tm_to_time_t() from compat/mingw.c 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=20100113125312.GD10586@dpotapov.dyndns.org \
    --to=dpotapov@gmail.com \
    --cc=ahaczewski@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=j6t@kdbg.org \
    --cc=kusmabite@gmail.com \
    --cc=msysgit@googlegroups.com \
    /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 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).