new framework to inhibit thread cancellation when needed

with these small changes, libc functions which need to call functions
which are cancellation points, but which themselves must not be
cancellation points, can use the CANCELPT_INHIBIT and CANCELPT_RESUME
macros to temporarily inhibit all cancellation.
This commit is contained in:
Rich Felker
2011-04-05 18:00:28 -04:00
parent 918a40f257
commit 729cb49f52
3 changed files with 17 additions and 5 deletions

View File

@ -57,9 +57,19 @@ static void cancel_handler(int sig, siginfo_t *si, void *ctx)
static void cancelpt(int x)
{
struct pthread *self = __pthread_self();
if (self->canceldisable) return;
if ((self->cancelpoint+=x)==1 && x>=0 && self->cancel)
docancel(self);
switch (x) {
case 1:
self->cancelpoint++;
case 0:
if (self->cancel && self->cancelpoint==1 && !self->canceldisable)
docancel(self);
break;
case -1:
self->cancelpoint--;
break;
default:
self->canceldisable += x;
}
}
/* "rsyscall" is a mechanism by which a thread can synchronously force all