Add `sigset64_t` and accompanying functions.
This doesn't address `struct sigaction` and `sigaction`. That will
come later.
Bug: http://b/72493232
Test: ran tests
Change-Id: I4134346757ce3a4dac6feae413361cec16223386
diff --git a/libc/private/ScopedSignalBlocker.h b/libc/private/ScopedSignalBlocker.h
index c3ab307..7582068 100644
--- a/libc/private/ScopedSignalBlocker.h
+++ b/libc/private/ScopedSignalBlocker.h
@@ -20,14 +20,13 @@
#include <signal.h>
#include "bionic_macros.h"
-#include "kernel_sigset_t.h"
class ScopedSignalBlocker {
public:
explicit ScopedSignalBlocker() {
- kernel_sigset_t set;
- set.fill();
- __rt_sigprocmask(SIG_SETMASK, &set, &old_set_, sizeof(set));
+ sigset64_t set;
+ sigfillset64(&set);
+ sigprocmask64(SIG_SETMASK, &set, &old_set_);
}
~ScopedSignalBlocker() {
@@ -35,11 +34,11 @@
}
void reset() {
- __rt_sigprocmask(SIG_SETMASK, &old_set_, nullptr, sizeof(old_set_));
+ sigprocmask64(SIG_SETMASK, &old_set_, nullptr);
}
private:
- kernel_sigset_t old_set_;
+ sigset64_t old_set_;
DISALLOW_COPY_AND_ASSIGN(ScopedSignalBlocker);
};
diff --git a/libc/private/SigSetConverter.h b/libc/private/SigSetConverter.h
new file mode 100644
index 0000000..7d0b215
--- /dev/null
+++ b/libc/private/SigSetConverter.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#pragma once
+
+union SigSetConverter {
+ int bsd;
+ sigset_t sigset;
+ sigset64_t sigset64;
+};
diff --git a/libc/private/kernel_sigset_t.h b/libc/private/kernel_sigset_t.h
deleted file mode 100644
index bdfb729..0000000
--- a/libc/private/kernel_sigset_t.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef LIBC_PRIVATE_KERNEL_SIGSET_T_H_
-#define LIBC_PRIVATE_KERNEL_SIGSET_T_H_
-
-#include <errno.h>
-#include <signal.h>
-
-#include <async_safe/log.h>
-
-// Our sigset_t is wrong for ARM and x86. It's 32-bit but the kernel expects 64 bits.
-// This means we can't support real-time signals correctly without breaking the ABI.
-// In the meantime, we can use this union to pass an appropriately-sized block of memory
-// to the kernel, at the cost of not being able to refer to real-time signals when
-// initializing from a sigset_t on LP32.
-union kernel_sigset_t {
- public:
- kernel_sigset_t() {
- }
-
- explicit kernel_sigset_t(int signal_number) {
- clear();
- if (!set(signal_number)) async_safe_fatal("kernel_sigset_t(%d)", signal_number);
- }
-
- explicit kernel_sigset_t(const sigset_t* value) {
- clear();
- set(value);
- }
-
- void clear() {
- __builtin_memset(this, 0, sizeof(*this));
- }
-
- bool clear(int signal_number) {
- int bit = bit_of(signal_number);
- if (bit == -1) return false;
- bits[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT));
- return true;
- }
-
- void fill() {
- __builtin_memset(this, 0xff, sizeof(*this));
- }
-
- bool is_set(int signal_number) {
- int bit = bit_of(signal_number);
- if (bit == -1) return false;
- return ((bits[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1) == 1;
- }
-
- bool set(int signal_number) {
- int bit = bit_of(signal_number);
- if (bit == -1) return false;
- bits[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT);
- return true;
- }
-
- void set(const sigset_t* value) {
- clear();
- bionic = *value;
- }
-
- sigset_t* get() {
- return &bionic;
- }
-
- sigset_t bionic;
- unsigned long bits[_KERNEL__NSIG/LONG_BIT];
-
- private:
- int bit_of(int signal_number) {
- int bit = signal_number - 1; // Signal numbers start at 1, but bit positions start at 0.
- if (bit < 0 || bit >= static_cast<int>(8*sizeof(*this))) {
- errno = EINVAL;
- return -1;
- }
- return bit;
- }
-};
-
-extern "C" int __rt_sigpending(const kernel_sigset_t*, size_t);
-extern "C" int __rt_sigprocmask(int, const kernel_sigset_t*, kernel_sigset_t*, size_t);
-extern "C" int __rt_sigsuspend(const kernel_sigset_t*, size_t);
-
-#endif