diff --git a/Doc/lib/libsignal.tex b/Doc/lib/libsignal.tex
index 3029385..e3aa171 100644
--- a/Doc/lib/libsignal.tex
+++ b/Doc/lib/libsignal.tex
@@ -18,6 +18,10 @@
 implementation.
 
 \item
+There is no way to ``block'' signals temporarily from critical
+sections (since this is not supported by all \UNIX{} flavors).
+
+\item
 Although Python signal handlers are called asynchronously as far as
 the Python user is concerned, they can only occur between the
 ``atomic'' instructions of the Python interpreter.  This means that
@@ -88,16 +92,6 @@
   One more than the number of the highest signal number.
 \end{datadesc}
 
-\begin{datadesc}{SIG_BLOCK}
-\end{datadesc}
-\begin{datadesc}{SIG_UNBLOCK}
-\end{datadesc}
-\begin{datadesc}{SIG_SETMASK}
-  These constants are for use as the first parameter of the
-  \function{sigprocmask} function described below.
-\end{datadesc}
-
-
 The \module{signal} module defines the following functions:
 
 \begin{funcdesc}{alarm}{time}
@@ -150,46 +144,6 @@
 \obindex{frame}
 \end{funcdesc}
 
-The following functions are supported if your platform does.  Most
-modern \UNIX-alikes now do.
-
-\begin{funcdesc}{sigpending}{}
-  Return the set of pending signals, i.e. a list containing the
-  numbers of those signals that have been raised while blocked.
-  \versionadded{2.3}
-\end{funcdesc}
-
-\begin{funcdesc}{sigprocmask}{how, sigset}
-  Change the list of currently blocked signals.  The parameter
-  \var{how} should be one of \constant{SIG_BLOCK},
-  \constant{SIG_UNBLOCK} or \constant{SIG_SETMASK} and \var{sigset}
-  should be a sequence of signal numbers.  The behaviour of the call
-  depends on the value of \var{how}:
-
-  \begin{tableii}{l|l}{textrm}{Value of \var{how}}{Behaviour of call}
-    \lineii{\constant{SIG_BLOCK}}
-	   {The set of blocked signals is the union of the current set
-            and \var{sigset}.}
-    \lineii{\constant{SIG_UNBLOCK}}      
-           {The signals in \var{sigset} are removed from the current
-            set of blocked signals.  It is legal to attempt to unblock 
-            a signal which is not blocked.}
-    \lineii{\constant{SIG_SETMASK}}
-	   {The set of blocked signals is set to the \var{sigset}.}
-  \end{tableii}
-
-  A list contating the numbers of the previously blocked signals is
-  returned.
-  \versionadded{2.3}
-\end{funcdesc}
-
-\begin{funcdesc}{sigsuspend}{sigset}
-  Temporarily replace the signal mask with \var{sigset} (which should
-  be a sequnce of signal numbers) and suspend the process until a
-  signal is received.
-  \versionadded{2.3}
-\end{funcdesc}
-
 \subsection{Example}
 \nodename{Signal Example}
 
diff --git a/Doc/whatsnew/whatsnew23.tex b/Doc/whatsnew/whatsnew23.tex
index 362db5f..de46869 100644
--- a/Doc/whatsnew/whatsnew23.tex
+++ b/Doc/whatsnew/whatsnew23.tex
@@ -1485,10 +1485,8 @@
 location.
 
 \item Support for more advanced POSIX signal handling was added
-to the \module{signal} module by adding the \function{sigpending},
-\function{sigprocmask} and \function{sigsuspend} functions where supported
-by the platform.  These functions make it possible to avoid some previously
-unavoidable race conditions with signal handling.
+to the \module{signal} but then removed again as it proved impossible
+to make it work reliably across platforms.
 
 \item The \module{socket} module now supports timeouts.  You
 can call the \method{settimeout(\var{t})} method on a socket object to
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 737f160..c984361 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -64,64 +64,3 @@
     if verbose:
         print "KeyboardInterrupt (assume the alarm() went off)"
 
-
-if hasattr(signal, "sigprocmask"):
-    class HupDelivered(Exception):
-        pass
-    def hup(signum, frame):
-        raise HupDelivered
-    def hup2(signum, frame):
-        signal.signal(signal.SIGHUP, hup)
-        return
-    signal.signal(signal.SIGHUP, hup)
-
-    if verbose:
-        print "blocking SIGHUP"
-
-    defaultmask = signal.sigprocmask(signal.SIG_BLOCK, [signal.SIGHUP])
-
-    if verbose:
-        print "sending SIGHUP"
-
-    try:
-        os.kill(pid, signal.SIGHUP)
-    except HupDelivered:
-        raise TestFailed, "HUP not blocked"
-
-    if signal.SIGHUP not in signal.sigpending():
-        raise TestFailed, "HUP not pending"
-
-    if verbose:
-        print "unblocking SIGHUP"
-
-    try:
-        signal.sigprocmask(signal.SIG_UNBLOCK, [signal.SIGHUP])
-    except HupDelivered:
-        pass
-    else:
-        raise TestFailed, "HUP not delivered"
-
-    if verbose:
-        print "testing sigsuspend"
-
-    signal.sigprocmask(signal.SIG_BLOCK, [signal.SIGHUP])
-    signal.signal(signal.SIGHUP, hup2)
-
-    if not os.fork():
-        time.sleep(2)
-        os.kill(pid, signal.SIGHUP)
-        time.sleep(2)
-        os.kill(pid, signal.SIGHUP)
-        os._exit(0)
-    else:
-        try:
-            signal.sigsuspend(defaultmask)
-        except:
-            raise TestFailed, "sigsuspend erroneously raised"
-
-        try:
-            signal.sigsuspend(defaultmask)
-        except HupDelivered:
-            pass
-        else:
-            raise TestFailed, "sigsupsend didn't raise"
diff --git a/Misc/NEWS b/Misc/NEWS
index 5527a1b..877fb9e 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -982,9 +982,6 @@
   of sizeof(int)!=sizeof(long)!=sizeof(void*) is delayed until dl.open
   is called.
 
-- signal.sigpending, signal.sigprocmask and signal.sigsuspend have
-  been added where available.
-
 - The sys module acquired a new attribute, api_version, which evaluates
   to the value of the PYTHON_API_VERSION macro with which the
   interpreter was compiled.
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 2224ec9..e278dd1 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -269,153 +269,6 @@
 None -- if an unknown handler is in effect\n\
 anything else -- the callable Python object used as a handler");
 
-#ifdef HAVE_SIGPROCMASK /* we assume that having SIGPROCMASK is enough
-			   to guarantee full POSIX signal handling */
-/* returns 0 for success, <0 for failure (with exception set) */
-static int
-_signal_list_to_sigset(PyObject* seq, sigset_t* set, char* mesg)
-{
-	int i, len, val;
-
-	seq = PySequence_Fast(seq, mesg);
-	if (!seq)
-		return -1;
-
-	len = PySequence_Fast_GET_SIZE(seq);
-
-	sigemptyset(set);
-
-	for (i = 0; i < len; i++) {
-		val = PyInt_AsLong(PySequence_Fast_GET_ITEM(seq, i));
-		if (val == -1 && PyErr_Occurred()) {
-			Py_DECREF(seq);
-			return -1;
-		}
-		if (sigaddset(set, val) < 0) {
-			Py_DECREF(seq);
-			PyErr_SetFromErrno(PyExc_ValueError);
-			return -1;
-		}
-	}
-	
-	Py_DECREF(seq);
-	return 0;
-}
-
-static PyObject*
-_signal_sigset_to_list(sigset_t* set)
-{
-	PyObject* ret;
-	PyObject* ob;
-	int i;
-
-	ret = PyList_New(0);
-	if (!ret)
-		return NULL;
-
-	for (i = 1; i < NSIG; i++) {
-		if (sigismember(set, i)) {
-			ob = PyInt_FromLong(i);
-			if (!ob) {
-				Py_DECREF(ret);
-				return NULL;
-			}
-			PyList_Append(ret, ob);
-			Py_DECREF(ob);
-		}
-	}
-
-	return ret;
-}
-
-static PyObject*
-signal_sigprocmask(PyObject* self, PyObject* args)
-{
-	int how;
-	sigset_t newset, oldset;
-	PyObject* seq;
-
-	if (!PyArg_ParseTuple(args, "iO", &how, &seq))
-		return NULL;
-	
-	if (_signal_list_to_sigset(seq, &newset,
-				   "sigprocmask requires a sequence") < 0)
-		return NULL;
-
-	if (sigprocmask(how, &newset, &oldset) < 0) {
-		return PyErr_SetFromErrno(PyExc_ValueError);
-	}
-	
-	if (PyErr_CheckSignals())
-		return NULL;
-
-	return _signal_sigset_to_list(&oldset);
-}
-
-PyDoc_STRVAR(sigprocmask_doc,
-"sigprocmask(how, sigset) -> sigset\n\
-\n\
-Change the list of currently blocked signals.  The parameter how should be\n\
-one of SIG_BLOCK, SIG_UNBLOCK or SIG_SETMASK and sigset should be a\n\
-sequence of signal numbers.  The behaviour of the call depends on the value\n\
-of how:\n\
-\n\
-  SIG_BLOCK\n\
-    The set of blocked signals is the union of the current set and the\n\
-    sigset argument.\n\
-  SIG_UNBLOCK\n\
-    The signals in sigset are removed from the current set of blocked\n\
-    signals.  It is legal to attempt to unblock a signal which is not\n\
-    blocked.\n\
-  SIG_SETMASK\n\
-    The set of blocked signals is set to the argument set.\n\
-\n\
-A list contating the numbers of the previously blocked signals is returned.");
-
-static PyObject*
-signal_sigpending(PyObject* self)
-{
-	sigset_t set;
-
-	if (sigpending(&set) < 0) {
-		return PyErr_SetFromErrno(PyExc_ValueError);
-	}
-	
-	return _signal_sigset_to_list(&set);
-}
-
-PyDoc_STRVAR(sigpending_doc,
-"sigpending() -> sigset\n\
-\n\
-Return the set of pending signals, i.e. a list containing the numbers of\n\
-those signals that have been raised while blocked.");
-
-static PyObject*
-signal_sigsuspend(PyObject* self, PyObject* arg)
-{
-	sigset_t set;
-
-	if (_signal_list_to_sigset(arg, &set, 
-				   "sigsuspend requires a sequence") < 0)
-		return NULL;
-	
-	Py_BEGIN_ALLOW_THREADS
-	sigsuspend(&set);
-	Py_END_ALLOW_THREADS
-
-	if (PyErr_CheckSignals())
-		return NULL;
-
-	Py_INCREF(Py_None);
-	return Py_None;
-}
-
-PyDoc_STRVAR(sigsuspend_doc,
-"sigsuspend(sigset) -> None\n\
-\n\
-Temporarily replace the signal mask with sigset (which should be a sequence\n\
-of signal numbers) and suspend the process until a signal is received.");
-#endif
 
 /* List of functions defined in the module */
 static PyMethodDef signal_methods[] = {
@@ -430,14 +283,6 @@
 #endif
 	{"default_int_handler", signal_default_int_handler, 
 	 METH_VARARGS, default_int_handler_doc},
-#ifdef HAVE_SIGPROCMASK
-	{"sigprocmask",         (PyCFunction)signal_sigprocmask, 
-	 METH_VARARGS,          sigprocmask_doc},
-	{"sigpending",          (PyCFunction)signal_sigpending, 
-	 METH_NOARGS,           sigpending_doc},
-	{"sigsuspend",          (PyCFunction)signal_sigsuspend, 
-	 METH_O,                sigsuspend_doc},
-#endif
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -453,10 +298,6 @@
 pause() -- wait until a signal arrives [Unix only]\n\
 default_int_handler() -- default SIGINT handler\n\
 \n\
-sigpending()  |\n\
-sigprocmask() |-- posix signal mask handling [Unix only]\n\
-sigsuspend()  |\n\
-\n\
 Constants:\n\
 \n\
 SIG_DFL -- used to refer to the system default handler\n\
@@ -705,18 +546,6 @@
 	PyDict_SetItemString(d, "SIGINFO", x);
         Py_XDECREF(x);
 #endif
-#ifdef HAVE_SIGPROCMASK
-	x = PyInt_FromLong(SIG_BLOCK);
-	PyDict_SetItemString(d, "SIG_BLOCK", x);
-        Py_XDECREF(x);
-	x = PyInt_FromLong(SIG_UNBLOCK);
-	PyDict_SetItemString(d, "SIG_UNBLOCK", x);
-        Py_XDECREF(x);
-	x = PyInt_FromLong(SIG_SETMASK);
-	PyDict_SetItemString(d, "SIG_SETMASK", x);
-        Py_XDECREF(x);
-#endif
-
         if (!PyErr_Occurred())
                 return;
 
