This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: No thread safety in clock_gettime (hires_ns::prime)


On Nov 26 19:07, Houder wrote:
> On Mon, 26 Nov 2018 18:01:40, Corinna Vinschen  wrote:
> > 
> > On Nov 23 11:27, James E. King III wrote:
> [snip]
> 
> > > I found that a call to
> > > clock_gettime(CLOCK_MONOTONIC, ..) has a one-time initialization that
> > > is not thread-safe.  If two threads call this at the same time, they
> > > will race.  The results I am seeing are typically that one of the two
> > > callers get a timespec structure with zero values, and no error return
> > > code from the call.
> > 
> > Thanks for the testcase, but I can't reproduce the problem, neither on
> > 32 bit nor on 64 bit.  I tweaked your makefile to have a 100K loop I
> > started multiple times with differently optimzed code, but to no avail.
> > 
> > To account for that, I inspected the code doing the initialization and
> > found that it uses REALTIME priority when trying to make sure multiple
> > threads don't collide.  This is a bit on the dangerous side, apparently.
> > 
> > I tweaked the code to use a spinlock instead.
> > 
> > I'm just about to upload new developer snapshots to
> > https://cygwin.com/snapshots/
> > 
> > Should be up in 10 mins or so.  Can you please try if this fixes the
> > problem for you?
> 
>  - only replaced the cygwin1.dll ...
> 
> Henri
> 
> 64-@@ uname -a
> CYGWIN_NT-6.1 Seven 2.11.3(0.329/5/3)  x86_64 Cygwin
> 64-@@ ls -l /bin/cygwin1*
> -rwxr-xr-x 1 Henri None 3339661 Nov  8 14:36 /bin/cygwin1-2.11.2.X
> -rwxr-xr-x 1 Henri None 3337995 Nov 26 18:43 /bin/cygwin1-64-20181126.X
> -rwxr-xr-x 1 Henri None 3337995 Nov 26 18:43 /bin/cygwin1.dll
> 64-@@ cd threads
> 64-@@ make test
> 64-@@ make test
> 64-@@ make test
> 64-@@ make test
> 64-@@ make test
> 64-@@ make test
> 64-@@ make test
> 64-@@ make test
> 64-@@ vi Makefile
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ #... wait a while ...
> 64-@@ for loop in {1..100}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..1000}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..1000}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..1000}; do ./cyg_hires_clock_race.exe; done
> 64-@@ for loop in {1..10000}; do ./cyg_hires_clock_race.exe; done
> 64-@@# That is enough!

Thanks a lot for testing!  (Particulary since I couldn't even
reproduce this on W7)


Corinna

-- 
Corinna Vinschen
Cygwin Maintainer

Attachment: signature.asc
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]