Patch #575827: allow threads inside SSL creation.
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index 5f5e530..baaa097 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -186,47 +186,62 @@
 		goto fail;
 	}
 
+	Py_BEGIN_ALLOW_THREADS
 	self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
+	Py_END_ALLOW_THREADS
 	if (self->ctx == NULL) {
 		errstr = "SSL_CTX_new error";
 		goto fail;
 	}
 
 	if (key_file) {
-		if (SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
-						SSL_FILETYPE_PEM) < 1) {
+		Py_BEGIN_ALLOW_THREADS
+		ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
+						SSL_FILETYPE_PEM);
+		Py_END_ALLOW_THREADS
+		if (ret < 1) {
 			errstr = "SSL_CTX_use_PrivateKey_file error";
 			goto fail;
 		}
 
-		if (SSL_CTX_use_certificate_chain_file(self->ctx,
-						       cert_file) < 1) {
+		Py_BEGIN_ALLOW_THREADS
+		ret = SSL_CTX_use_certificate_chain_file(self->ctx,
+						       cert_file);
+		Py_END_ALLOW_THREADS
+		if (ret < 1) {
 			errstr = "SSL_CTX_use_certificate_chain_file error";
 			goto fail;
 		}
 	}
 
+	Py_BEGIN_ALLOW_THREADS
 	SSL_CTX_set_verify(self->ctx,
 			   SSL_VERIFY_NONE, NULL); /* set verify lvl */
 	self->ssl = SSL_new(self->ctx); /* New ssl struct */
+	Py_END_ALLOW_THREADS
 	SSL_set_fd(self->ssl, Sock->sock_fd);	/* Set the socket for SSL */
+	Py_BEGIN_ALLOW_THREADS
 	SSL_set_connect_state(self->ssl);
 
+
 	/* Actually negotiate SSL connection */
 	/* XXX If SSL_connect() returns 0, it's also a failure. */
 	ret = SSL_connect(self->ssl);
+	Py_END_ALLOW_THREADS
 	if (ret <= 0) {
 		PySSL_SetError(self, ret);
 		goto fail;
 	}
 	self->ssl->debug = 1;
 
+	Py_BEGIN_ALLOW_THREADS
 	if ((self->server_cert = SSL_get_peer_certificate(self->ssl))) {
 		X509_NAME_oneline(X509_get_subject_name(self->server_cert),
 				  self->server, X509_NAME_MAXLEN);
 		X509_NAME_oneline(X509_get_issuer_name(self->server_cert),
 				  self->issuer, X509_NAME_MAXLEN);
 	}
+	Py_END_ALLOW_THREADS
 	self->Socket = Sock;
 	Py_INCREF(self->Socket);
 	return self;