Index: src/backend/libpq/pqcomm.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/libpq/pqcomm.c,v retrieving revision 1.191 diff -c -r1.191 pqcomm.c *** src/backend/libpq/pqcomm.c 3 Mar 2007 19:32:54 -0000 1.191 --- src/backend/libpq/pqcomm.c 14 May 2007 13:52:05 -0000 *************** *** 261,266 **** --- 261,291 ---- snprintf(portNumberStr, sizeof(portNumberStr), "%d", portNumber); service = portNumberStr; } + #ifdef WIN32 + /* Win32 doesn't have Unix sockets, but will allow multiple processes + * to listen on the same port. This interlock is to prevent that. + */ + { + char mutexName[64]; + HANDLE mutex; + + sprintf(mutexName,"postgresql.interlock.%i", portNumber); + mutex = CreateMutex(NULL, FALSE, mutexName); + if (mutex == NULL) + ereport(FATAL, + (errmsg_internal("could not create interlocking mutex: %li", + GetLastError()))); + + if (GetLastError() == ERROR_ALREADY_EXISTS) + ereport(FATAL, + (errcode(ERRCODE_LOCK_FILE_EXISTS), + errmsg("interlock mutex \"%s\" already exists", mutexName), + errhint("Is another postgres listening on port %i", portNumber))); + + /* Intentionally leak the handle until process exit, so the mutex + * isn't freed. It will be automatically freed when the process exits. */ + } + #endif ret = pg_getaddrinfo_all(hostName, service, &hint, &addrs); if (ret || !addrs)