Adapted from a patch by Barry Scott, SF patch #102875 and SF bug
#125981: closing sockets was not thread-safe.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index e9b3aad..11e87bc 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -904,14 +904,15 @@
 static PyObject *
 PySocketSock_close(PySocketSockObject *s, PyObject *args)
 {
+	SOCKET_T fd;
 	if (!PyArg_ParseTuple(args, ":close"))
 		return NULL;
-	if (s->sock_fd != -1) {
+	if ((fd = s->sock_fd) != -1) {
+		s->sock_fd = -1;
 		Py_BEGIN_ALLOW_THREADS
-		(void) SOCKETCLOSE(s->sock_fd);
+		(void) SOCKETCLOSE(fd);
 		Py_END_ALLOW_THREADS
 	}
-	s->sock_fd = -1;
 	Py_INCREF(Py_None);
 	return Py_None;
 }