diff --git a/mercurial/cext/osutil.c b/mercurial/cext/osutil.c --- a/mercurial/cext/osutil.c +++ b/mercurial/cext/osutil.c @@ -20,6 +20,7 @@ #include #else #include +#include #include #include #include @@ -1111,6 +1112,25 @@ } #endif /* defined(HAVE_LINUX_STATFS) || defined(HAVE_BSD_STATFS) */ +static PyObject *unblocksignal(PyObject *self, PyObject *args) +{ + int sig = 0; + int r; + if (!PyArg_ParseTuple(args, "i", &sig)) + return NULL; + sigset_t set; + r = sigemptyset(&set); + if (r != 0) + return PyErr_SetFromErrno(PyExc_OSError); + r = sigaddset(&set, sig); + if (r != 0) + return PyErr_SetFromErrno(PyExc_OSError); + r = sigprocmask(SIG_UNBLOCK, &set, NULL); + if (r != 0) + return PyErr_SetFromErrno(PyExc_OSError); + Py_RETURN_NONE; +} + #endif /* ndef _WIN32 */ static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs) @@ -1291,6 +1311,8 @@ {"getfstype", (PyCFunction)getfstype, METH_VARARGS, "get filesystem type (best-effort)\n"}, #endif + {"unblocksignal", (PyCFunction)unblocksignal, METH_VARARGS, + "change signal mask to unblock a given signal\n"}, #endif /* ndef _WIN32 */ #ifdef __APPLE__ { @@ -1301,7 +1323,7 @@ {NULL, NULL} }; -static const int version = 1; +static const int version = 2; #ifdef IS_PY3K static struct PyModuleDef osutil_module = { diff --git a/mercurial/policy.py b/mercurial/policy.py --- a/mercurial/policy.py +++ b/mercurial/policy.py @@ -74,7 +74,7 @@ (r'cext', r'bdiff'): 1, (r'cext', r'diffhelpers'): 1, (r'cext', r'mpatch'): 1, - (r'cext', r'osutil'): 1, + (r'cext', r'osutil'): 2, (r'cext', r'parsers'): 4, } diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -163,6 +163,10 @@ setprocname = osutil.setprocname except AttributeError: pass +try: + unblocksignal = osutil.unblocksignal +except AttributeError: + pass # Python compatibility