diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 219a17cf11..95903d60f8 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -289,30 +289,15 @@ socket_close(int code, Datum arg) secure_close(MyProcPort); /* - * On most platforms, we leave the socket open until the process dies. - * This allows clients to perform a "synchronous close" if they care - * --- wait till the transport layer reports connection closure, and - * you can be sure the backend has exited. Saves a kernel call, too. + * Formerly we did an explicit close() here, but it seems better to + * leave the socket open until the process dies. This allows clients + * to perform a "synchronous close" if they care --- wait till the + * transport layer reports connection closure, and you can be sure the + * backend has exited. * - * However, that does not work on Windows: if the kernel closes the - * socket it will invoke an "abortive shutdown" that discards any data - * not yet sent to the client. (This is a flat-out violation of the - * TCP RFCs, but count on Microsoft not to care about that.) To get - * the spec-compliant "graceful shutdown" behavior, we must invoke - * closesocket() explicitly. When using OpenSSL, it seems that clean - * shutdown also requires an explicit shutdown() call. - * - * This code runs late enough during process shutdown that we should - * have finished all externally-visible shutdown activities, so that - * in principle it's good enough to act as a synchronous close on - * Windows too. But it's a lot more fragile than the other way. + * We do set sock to PGINVALID_SOCKET to prevent any further I/O, + * though. */ -#ifdef WIN32 - shutdown(MyProcPort->sock, SD_SEND); - closesocket(MyProcPort->sock); -#endif - - /* In any case, set sock to PGINVALID_SOCKET to prevent further I/O */ MyProcPort->sock = PGINVALID_SOCKET; } }