summaryrefslogtreecommitdiffstats
path: root/libexec/rtld-elf
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/rtld-elf')
-rw-r--r--libexec/rtld-elf/alpha/lockdflt.c12
-rw-r--r--libexec/rtld-elf/amd64/lockdflt.c12
-rw-r--r--libexec/rtld-elf/i386/lockdflt.c12
-rw-r--r--libexec/rtld-elf/lockdflt.c12
4 files changed, 32 insertions, 16 deletions
diff --git a/libexec/rtld-elf/alpha/lockdflt.c b/libexec/rtld-elf/alpha/lockdflt.c
index 6f278c3..c926950 100644
--- a/libexec/rtld-elf/alpha/lockdflt.c
+++ b/libexec/rtld-elf/alpha/lockdflt.c
@@ -51,8 +51,11 @@ void
lockdflt_acquire(void *lock)
{
LockDflt *l = (LockDflt *)lock;
- sigprocmask(SIG_BLOCK, &l->lock_mask, &l->old_mask);
- assert(l->depth == 0);
+ sigset_t old_mask;
+
+ sigprocmask(SIG_BLOCK, &l->lock_mask, &old_mask);
+ if (l->depth == 0)
+ l->old_mask = old_mask;
l->depth++;
}
@@ -81,9 +84,10 @@ void
lockdflt_release(void *lock)
{
LockDflt *l = (LockDflt *)lock;
- assert(l->depth == 1);
l->depth--;
- sigprocmask(SIG_SETMASK, &l->old_mask, NULL);
+ assert(l->depth >= 0);
+ if (l->depth == 0)
+ sigprocmask(SIG_SETMASK, &l->old_mask, NULL);
}
void
diff --git a/libexec/rtld-elf/amd64/lockdflt.c b/libexec/rtld-elf/amd64/lockdflt.c
index 6f278c3..c926950 100644
--- a/libexec/rtld-elf/amd64/lockdflt.c
+++ b/libexec/rtld-elf/amd64/lockdflt.c
@@ -51,8 +51,11 @@ void
lockdflt_acquire(void *lock)
{
LockDflt *l = (LockDflt *)lock;
- sigprocmask(SIG_BLOCK, &l->lock_mask, &l->old_mask);
- assert(l->depth == 0);
+ sigset_t old_mask;
+
+ sigprocmask(SIG_BLOCK, &l->lock_mask, &old_mask);
+ if (l->depth == 0)
+ l->old_mask = old_mask;
l->depth++;
}
@@ -81,9 +84,10 @@ void
lockdflt_release(void *lock)
{
LockDflt *l = (LockDflt *)lock;
- assert(l->depth == 1);
l->depth--;
- sigprocmask(SIG_SETMASK, &l->old_mask, NULL);
+ assert(l->depth >= 0);
+ if (l->depth == 0)
+ sigprocmask(SIG_SETMASK, &l->old_mask, NULL);
}
void
diff --git a/libexec/rtld-elf/i386/lockdflt.c b/libexec/rtld-elf/i386/lockdflt.c
index 6f278c3..c926950 100644
--- a/libexec/rtld-elf/i386/lockdflt.c
+++ b/libexec/rtld-elf/i386/lockdflt.c
@@ -51,8 +51,11 @@ void
lockdflt_acquire(void *lock)
{
LockDflt *l = (LockDflt *)lock;
- sigprocmask(SIG_BLOCK, &l->lock_mask, &l->old_mask);
- assert(l->depth == 0);
+ sigset_t old_mask;
+
+ sigprocmask(SIG_BLOCK, &l->lock_mask, &old_mask);
+ if (l->depth == 0)
+ l->old_mask = old_mask;
l->depth++;
}
@@ -81,9 +84,10 @@ void
lockdflt_release(void *lock)
{
LockDflt *l = (LockDflt *)lock;
- assert(l->depth == 1);
l->depth--;
- sigprocmask(SIG_SETMASK, &l->old_mask, NULL);
+ assert(l->depth >= 0);
+ if (l->depth == 0)
+ sigprocmask(SIG_SETMASK, &l->old_mask, NULL);
}
void
diff --git a/libexec/rtld-elf/lockdflt.c b/libexec/rtld-elf/lockdflt.c
index 6f278c3..c926950 100644
--- a/libexec/rtld-elf/lockdflt.c
+++ b/libexec/rtld-elf/lockdflt.c
@@ -51,8 +51,11 @@ void
lockdflt_acquire(void *lock)
{
LockDflt *l = (LockDflt *)lock;
- sigprocmask(SIG_BLOCK, &l->lock_mask, &l->old_mask);
- assert(l->depth == 0);
+ sigset_t old_mask;
+
+ sigprocmask(SIG_BLOCK, &l->lock_mask, &old_mask);
+ if (l->depth == 0)
+ l->old_mask = old_mask;
l->depth++;
}
@@ -81,9 +84,10 @@ void
lockdflt_release(void *lock)
{
LockDflt *l = (LockDflt *)lock;
- assert(l->depth == 1);
l->depth--;
- sigprocmask(SIG_SETMASK, &l->old_mask, NULL);
+ assert(l->depth >= 0);
+ if (l->depth == 0)
+ sigprocmask(SIG_SETMASK, &l->old_mask, NULL);
}
void
OpenPOWER on IntegriCloud