Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7d00a6b

Browse files
committed
In libpq for Windows, call WSAStartup once and WSACleanup not at all.
The Windows documentation insists that every WSAStartup call shouldhave a matching WSACleanup call. However, if that ever had actualrelevance, it wasn't in this century. Every remotely-modern Windowskernel is capable of cleaning up when a process exits without doingthat, and must be so to avoid resource leaks in case of a processcrash. Moreover, Postgres backends have done WSAStartup withoutWSACleanup since commit4cdf51e in 2004, and we've never seen anyindication of a problem with that.libpq's habit of doing WSAStartup during connection start andWSACleanup during shutdown is also rather inefficient, since aseries of non-overlapping connection requests leads to repeated,quite expensive DLL unload/reload cycles. We document a workaroundfor that (having the application call WSAStartup for itself), butthat's just a kluge. It's also worth noting that it's far fromuncommon for applications to exit without doing PQfinish, andwe've not heard reports of trouble from that either.However, the real reason for acting on this is that recentexperiments by Alexander Lakhin suggest that calling WSACleanupduring PQfinish might be triggering the symptom we occasionally seethat a process using libpq fails to emit expected stdio output.Therefore, let's change libpq so that it calls WSAStartup onlyonce per process, during the first connection attempt, and nevercalls WSACleanup at all.While at it, get rid of the only other WSACleanup call in our codetree, in pg_dump/parallel.c; that presumably is equally useless.If this proves to suppress the fairly-common ecpg test failureswe see on Windows, I'll back-patch, but for now let's just do itin HEAD and see what happens.Discussion:https://postgr.es/m/ac976d8c-03df-d6b8-025c-15a2de8d9af1@postgrespro.ru
1 parent5408498 commit7d00a6b

File tree

3 files changed

+18
-44
lines changed

3 files changed

+18
-44
lines changed

‎doc/src/sgml/libpq.sgml

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -91,21 +91,6 @@
9191
</para>
9292
</warning>
9393

94-
<note>
95-
<para>
96-
On Windows, there is a way to improve performance if a single
97-
database connection is repeatedly started and shutdown. Internally,
98-
libpq calls <function>WSAStartup()</function> and <function>WSACleanup()</function> for connection startup
99-
and shutdown, respectively. <function>WSAStartup()</function> increments an internal
100-
Windows library reference count which is decremented by <function>WSACleanup()</function>.
101-
When the reference count is just one, calling <function>WSACleanup()</function> frees
102-
all resources and all DLLs are unloaded. This is an expensive
103-
operation. To avoid this, an application can manually call
104-
<function>WSAStartup()</function> so resources will not be freed when the last database
105-
connection is closed.
106-
</para>
107-
</note>
108-
10994
<variablelist>
11095
<varlistentry id="libpq-PQconnectdbParams">
11196
<term><function>PQconnectdbParams</function><indexterm><primary>PQconnectdbParams</primary></indexterm></term>

‎src/bin/pg_dump/parallel.c

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -229,19 +229,6 @@ static char *readMessageFromPipe(int fd);
229229
(strncmp(msg, prefix, strlen(prefix)) == 0)
230230

231231

232-
/*
233-
* Shutdown callback to clean up socket access
234-
*/
235-
#ifdefWIN32
236-
staticvoid
237-
shutdown_parallel_dump_utils(intcode,void*unused)
238-
{
239-
/* Call the cleanup function only from the main thread */
240-
if (mainThreadId==GetCurrentThreadId())
241-
WSACleanup();
242-
}
243-
#endif
244-
245232
/*
246233
* Initialize parallel dump support --- should be called early in process
247234
* startup. (Currently, this is called whether or not we intend parallel
@@ -267,8 +254,7 @@ init_parallel_dump_utils(void)
267254
pg_log_error("WSAStartup failed: %d",err);
268255
exit_nicely(1);
269256
}
270-
/* ... and arrange to shut it down at exit */
271-
on_exit_nicely(shutdown_parallel_dump_utils,NULL);
257+
272258
parallel_init_done= true;
273259
}
274260
#endif

‎src/interfaces/libpq/fe-connect.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3871,23 +3871,30 @@ makeEmptyPGconn(void)
38713871
#ifdefWIN32
38723872

38733873
/*
3874-
* Make sure socket support is up and running.
3874+
* Make sure socket support is up and running in this process.
3875+
*
3876+
* Note: the Windows documentation says that we should eventually do a
3877+
* matching WSACleanup() call, but experience suggests that that is at
3878+
* least as likely to cause problems as fix them. So we don't.
38753879
*/
3876-
WSADATAwsaData;
3880+
staticboolwsastartup_done= false;
38773881

3878-
if (WSAStartup(MAKEWORD(1,1),&wsaData))
3879-
returnNULL;
3882+
if (!wsastartup_done)
3883+
{
3884+
WSADATAwsaData;
3885+
3886+
if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0)
3887+
returnNULL;
3888+
wsastartup_done= true;
3889+
}
3890+
3891+
/* Forget any earlier error */
38803892
WSASetLastError(0);
3881-
#endif
3893+
#endif/* WIN32 */
38823894

38833895
conn= (PGconn*)malloc(sizeof(PGconn));
38843896
if (conn==NULL)
3885-
{
3886-
#ifdefWIN32
3887-
WSACleanup();
3888-
#endif
38893897
returnconn;
3890-
}
38913898

38923899
/* Zero all pointers and booleans */
38933900
MemSet(conn,0,sizeof(PGconn));
@@ -4080,10 +4087,6 @@ freePGconn(PGconn *conn)
40804087
termPQExpBuffer(&conn->workBuffer);
40814088

40824089
free(conn);
4083-
4084-
#ifdefWIN32
4085-
WSACleanup();
4086-
#endif
40874090
}
40884091

40894092
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp