• Tom Lane's avatar
    In libpq for Windows, call WSAStartup once and WSACleanup not at all. · 7d00a6b2
    Tom Lane authored
    The Windows documentation insists that every WSAStartup call should
    have a matching WSACleanup call.  However, if that ever had actual
    relevance, it wasn't in this century.  Every remotely-modern Windows
    kernel is capable of cleaning up when a process exits without doing
    that, and must be so to avoid resource leaks in case of a process
    crash.  Moreover, Postgres backends have done WSAStartup without
    WSACleanup since commit 4cdf51e6 in 2004, and we've never seen any
    indication of a problem with that.
    
    libpq's habit of doing WSAStartup during connection start and
    WSACleanup during shutdown is also rather inefficient, since a
    series of non-overlapping connection requests leads to repeated,
    quite expensive DLL unload/reload cycles.  We document a workaround
    for that (having the application call WSAStartup for itself), but
    that's just a kluge.  It's also worth noting that it's far from
    uncommon for applications to exit without doing PQfinish, and
    we've not heard reports of trouble from that either.
    
    However, the real reason for acting on this is that recent
    experiments by Alexander Lakhin suggest that calling WSACleanup
    during PQfinish might be triggering the symptom we occasionally see
    that a process using libpq fails to emit expected stdio output.
    
    Therefore, let's change libpq so that it calls WSAStartup only
    once per process, during the first connection attempt, and never
    calls WSACleanup at all.
    
    While at it, get rid of the only other WSACleanup call in our code
    tree, in pg_dump/parallel.c; that presumably is equally useless.
    
    If this proves to suppress the fairly-common ecpg test failures
    we see on Windows, I'll back-patch, but for now let's just do it
    in HEAD and see what happens.
    
    Discussion: https://postgr.es/m/ac976d8c-03df-d6b8-025c-15a2de8d9af1@postgrespro.ru
    7d00a6b2
fe-connect.c 181 KB