Re: BUG #16685: The ecpg thread/descriptor test fails sometimes on Windows
От | Alexander Lakhin |
---|---|
Тема | Re: BUG #16685: The ecpg thread/descriptor test fails sometimes on Windows |
Дата | |
Msg-id | dedbf623-ae82-5635-a639-944395697799@gmail.com обсуждение исходный текст |
Ответ на | Re: BUG #16685: The ecpg thread/descriptor test fails sometimes on Windows (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: BUG #16685: The ecpg thread/descriptor test fails sometimes on Windows
|
Список | pgsql-bugs |
24.10.2020 19:54, Tom Lane wrote: > I'm forced to the conclusion that there's something wrong with > ECPG's emulation of pthread_once ... > > ... and now that I look at it, it seems just as obvious what > is wrong there: > > void > win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)) > { > if (!*once) > { > pthread_mutex_lock(&win32_pthread_once_lock); > if (!*once) > { > *once = true; > fn(); > } > pthread_mutex_unlock(&win32_pthread_once_lock); > } > } > > We should not set *once until AFTER we execute fn(). > Otherwise, other threads passing through pthread_once() > will mistakenly fall through, expecting the initialization > to be done already. > > (So in this view, adding a sleep just before fn() would > make the failure more reproducible.) Yes, adding "pg_usleep(1000L);" just before fn() leads to 15 of 100 tests failed (without the delay more than 100 iterations could pass successfully). And the reverse test construction: fn(); pg_usleep(1000L); *once = true; Makes all the tests (I ran 30x100 iterations) pass just fine. Thank you for looking into this! Best regards, Alexander
В списке pgsql-bugs по дате отправления: