Release the global interpreter lock around the most important
functions that might block or pause
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index fe75669..64f5c42 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -633,12 +633,16 @@
 
   switch (ARG_COUNT(arg)) {
   case 0:
+    Py_BEGIN_ALLOW_THREADS
     rtn = wgetch(self->win);
+    Py_END_ALLOW_THREADS
     break;
   case 2:
     if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
       return NULL;
+    Py_BEGIN_ALLOW_THREADS
     rtn = mvwgetch(self->win,y,x);
+    Py_END_ALLOW_THREADS
     break;
   default:
     PyErr_SetString(PyExc_TypeError, "getch requires 0 or 2 arguments");
@@ -657,12 +661,16 @@
 
   switch (ARG_COUNT(arg)) {
   case 0:
+    Py_BEGIN_ALLOW_THREADS
     rtn = wgetch(self->win);
+    Py_END_ALLOW_THREADS
     break;
   case 2:
     if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
       return NULL;
+    Py_BEGIN_ALLOW_THREADS
     rtn = mvwgetch(self->win,y,x);
+    Py_END_ALLOW_THREADS
     break;
   default:
     PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments");
@@ -685,27 +693,37 @@
 
   switch (ARG_COUNT(arg)) {
   case 0:
+    Py_BEGIN_ALLOW_THREADS
     rtn2 = wgetstr(self->win,rtn);
+    Py_END_ALLOW_THREADS
     break;
   case 1:
     if (!PyArg_Parse(arg,"i;n", &n))
       return NULL;
+    Py_BEGIN_ALLOW_THREADS
     rtn2 = wgetnstr(self->win,rtn,n);
+    Py_END_ALLOW_THREADS
     break;
   case 2:
     if (!PyArg_Parse(arg,"(ii);y,x",&y,&x))
       return NULL;
+    Py_BEGIN_ALLOW_THREADS
     rtn2 = mvwgetstr(self->win,y,x,rtn);
+    Py_END_ALLOW_THREADS
     break;
   case 3:
     if (!PyArg_Parse(arg,"(iii);y,x,n", &y, &x, &n))
       return NULL;
 #if defined(__sgi__) || defined(__sun__)
  /* Untested */
+    Py_BEGIN_ALLOW_THREADS
     rtn2 = wmove(self->win,y,x)==ERR ? ERR :
       wgetnstr(self->win, rtn, n);
+    Py_END_ALLOW_THREADS
 #else
+    Py_BEGIN_ALLOW_THREADS
     rtn2 = mvwgetnstr(self->win, y, x, rtn, n);
+    Py_END_ALLOW_THREADS
 #endif
     break;
   default:
@@ -996,6 +1014,7 @@
      PyObject * arg;
 {
   int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
+  int rtn;
 
   if (self->win->_flags & _ISPAD) {
     switch(ARG_COUNT(arg)) {
@@ -1006,20 +1025,26 @@
 		       &pminrow, &pmincol, &sminrow, 
 		       &smincol, &smaxrow, &smaxcol))
 	return NULL;
-      return PyCursesCheckERR(pnoutrefresh(self->win,
-				       pminrow, pmincol, sminrow, 
-				       smincol, smaxrow, smaxcol),
-			      "pnoutrefresh");
+      Py_BEGIN_ALLOW_THREADS
+      rtn = pnoutrefresh(self->win,
+			 pminrow, pmincol, sminrow, 
+			 smincol, smaxrow, smaxcol),
+      Py_END_ALLOW_THREADS
+      return PyCursesCheckERR(rtn, "pnoutrefresh");
     default:
       PyErr_SetString(PyCursesError, 
-		      "noutrefresh was called for a pad;" \
+		      "noutrefresh() called for a pad " 
 		      "requires 6 arguments");
       return NULL;
     }
   } else {
     if (!PyArg_NoArgs(arg))
       return NULL;    
-    return PyCursesCheckERR(wnoutrefresh(self->win), "wnoutrefresh");
+
+    Py_BEGIN_ALLOW_THREADS
+    rtn = wnoutrefresh(self->win);
+    Py_END_ALLOW_THREADS
+    return PyCursesCheckERR(rtn, "wnoutrefresh");
   }
 }
 
@@ -1057,6 +1082,7 @@
      PyObject * arg;
 {
   int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
+  int rtn;
   
   if (self->win->_flags & _ISPAD) {
     switch(ARG_COUNT(arg)) {
@@ -1067,19 +1093,26 @@
 		       &pminrow, &pmincol, &sminrow, 
 		       &smincol, &smaxrow, &smaxcol))
 	return NULL;
-      return PyCursesCheckERR(prefresh(self->win,
-				       pminrow, pmincol, sminrow, 
-				       smincol, smaxrow, smaxcol),
-			      "prefresh");
+
+      Py_BEGIN_ALLOW_THREADS
+      rtn = prefresh(self->win,
+		     pminrow, pmincol, sminrow, 
+		     smincol, smaxrow, smaxcol),
+	
+      Py_END_ALLOW_THREADS
+      return PyCursesCheckERR(rtn, "prefresh");
     default:
       PyErr_SetString(PyCursesError, 
-		      "refresh was called for a pad; requires 6 arguments");
+		      "refresh() for a pad requires 6 arguments");
       return NULL;
     }
   } else {
     if (!PyArg_NoArgs(arg))
       return NULL;    
-    return PyCursesCheckERR(wrefresh(self->win), "wrefresh");
+    Py_BEGIN_ALLOW_THREADS
+    rtn = wrefresh(self->win);
+    Py_END_ALLOW_THREADS
+    return PyCursesCheckERR(rtn);    
   }
 }