Thread

Commits

  1. Avoid concurrent calls to bindtextdomain().

  2. Clean up Windows-specific mutex code in libpq and ecpglib.

  1. Avoiding concurrent calls to bindtextdomain()

    Tom Lane <tgl@sss.pgh.pa.us> — 2024-02-05T20:03:36Z

    According to the discussion in [1], it's not as safe as we supposed
    to allow different threads to call bindtextdomain() concurrently.
    Here is a patchset to prevent that by acquiring a mutex around
    the libpq and ecpglib calls that are at risk.
    
    In libpq, this would've required yet a third copy of the
    Windows-specific ugliness in default_threadlock() and pgtls_init().
    I didn't particularly want to do that, so I stole some ideas
    from ecpglib to create a more POSIX-compliant emulation of
    pthread_mutex_lock().  0001 attached is the refactoring needed
    to make that happen, and then 0002 is the actual bug fix.
    
    0001 also gets rid of the possibility that pthread_mutex_init/
    pthread_mutex_lock could fail due to malloc failure.  This seems
    important since default_threadlock() assumes that pthread_mutex_lock
    cannot fail in practice.  I observe that ecpglib also assumes that,
    although it's using CreateMutex() which has documented failure
    conditions.  So I wonder if we ought to copy this implementation
    back into ecpglib; but I've not done that here.
    
    			regards, tom lane
    
    [1] https://www.postgresql.org/message-id/flat/18312-bbbabc8113592b78%40postgresql.org
    
    
  2. Re: Avoiding concurrent calls to bindtextdomain()

    Tom Lane <tgl@sss.pgh.pa.us> — 2024-02-08T18:08:21Z

    I wrote:
    > 0001 also gets rid of the possibility that pthread_mutex_init/
    > pthread_mutex_lock could fail due to malloc failure.  This seems
    > important since default_threadlock() assumes that pthread_mutex_lock
    > cannot fail in practice.  I observe that ecpglib also assumes that,
    > although it's using CreateMutex() which has documented failure
    > conditions.  So I wonder if we ought to copy this implementation
    > back into ecpglib; but I've not done that here.
    
    The cfbot seemed happy with v1, so here's a v2 that does copy that
    code back into ecpglib.  (I kind of wonder why this code exists in
    libpq + ecpglib at all, rather than in src/port/; but that seems
    like a refactoring exercise for another day.)
    
    I double-checked that all the pthread_mutex_t variables in libpq
    and ecpglib are static, so the change in that struct should not
    pose an ABI hazard for back-patching.
    
    Barring objections, I plan to push this pretty soon.
    
    			regards, tom lane