Re: BUG #16685: The ecpg thread/descriptor test fails sometimes on Windows
От | Tom Lane |
---|---|
Тема | Re: BUG #16685: The ecpg thread/descriptor test fails sometimes on Windows |
Дата | |
Msg-id | 380144.1603558463@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | 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 |
I wrote: > I'll bet that the correct fix is > static void > set_descriptors(struct descriptor *value) > { > + pthread_once(&descriptor_once, descriptor_key_init); > pthread_setspecific(descriptor_key, value); > } No, looking closer, there are only two calls of set_descriptors() and each of them is preceded by a call to get_descriptors(). So it should not be possible to get here without descriptor_key having been initialized. 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.) regards, tom lane
В списке pgsql-bugs по дате отправления: