[libc-commits] [libc] 123a532 - [libc] Add sigfillset and sigdelset

Alex Brachet via libc-commits libc-commits at lists.llvm.org
Wed Apr 1 12:08:51 PDT 2020


Author: Alex Brachet
Date: 2020-04-01T15:07:49-04:00
New Revision: 123a5328f919bab8ea1344c05e9edc2c506c9d51

URL: https://github.com/llvm/llvm-project/commit/123a5328f919bab8ea1344c05e9edc2c506c9d51
DIFF: https://github.com/llvm/llvm-project/commit/123a5328f919bab8ea1344c05e9edc2c506c9d51.diff

LOG: [libc] Add sigfillset and sigdelset

Summary: Add's `sigfillset` and `sigdelset` which will be used in D76676.

Reviewers: sivachandra, PaulkaToast

Reviewed By: sivachandra

Subscribers: mgorny, MaskRay, tschuett, libc-commits

Differential Revision: https://reviews.llvm.org/D76936

Added: 
    libc/src/signal/linux/sigdelset.cpp
    libc/src/signal/linux/sigfillset.cpp
    libc/src/signal/sigdelset.h
    libc/src/signal/sigfillset.h
    libc/test/src/signal/sigdelset_test.cpp
    libc/test/src/signal/sigfillset_test.cpp

Modified: 
    libc/src/signal/linux/CMakeLists.txt
    libc/src/signal/linux/signal.h
    libc/test/src/signal/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/libc/src/signal/linux/CMakeLists.txt b/libc/src/signal/linux/CMakeLists.txt
index a3017e406ee1..7992703a42d2 100644
--- a/libc/src/signal/linux/CMakeLists.txt
+++ b/libc/src/signal/linux/CMakeLists.txt
@@ -94,3 +94,29 @@ add_entrypoint_object(
     sigaction
     signal_h
 )
+
+add_entrypoint_object(
+  sigfillset
+  SRCS
+    sigfillset.cpp
+  HDRS
+    signal.h
+    ../sigfillset.h
+  DEPENDS
+    __errno_location
+    errno_h
+    signal_h
+)
+
+add_entrypoint_object(
+  sigdelset
+  SRCS
+    sigdelset.cpp
+  HDRS
+    signal.h
+    ../sigdelset.h
+  DEPENDS
+    __errno_location
+    errno_h
+    signal_h
+)

diff  --git a/libc/src/signal/linux/sigdelset.cpp b/libc/src/signal/linux/sigdelset.cpp
new file mode 100644
index 000000000000..b04ec56cc33e
--- /dev/null
+++ b/libc/src/signal/linux/sigdelset.cpp
@@ -0,0 +1,28 @@
+//===----------------- Linux implementation of sigdelset ------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/signal/sigdelset.h"
+#include "include/errno.h"
+#include "src/errno/llvmlibc_errno.h"
+#include "src/signal/linux/signal.h"
+
+#include "src/__support/common.h"
+
+namespace __llvm_libc {
+
+int LLVM_LIBC_ENTRYPOINT(sigdelset)(sigset_t *set, int signum) {
+  if (!set || (unsigned)(signum - 1) >= (8 * sizeof(sigset_t))) {
+    llvmlibc_errno = EINVAL;
+    return -1;
+  }
+  auto *sigset = reinterpret_cast<__llvm_libc::Sigset *>(set);
+  sigset->delset(signum);
+  return 0;
+}
+
+} // namespace __llvm_libc

diff  --git a/libc/src/signal/linux/sigfillset.cpp b/libc/src/signal/linux/sigfillset.cpp
new file mode 100644
index 000000000000..6c10da334993
--- /dev/null
+++ b/libc/src/signal/linux/sigfillset.cpp
@@ -0,0 +1,28 @@
+//===----------------- Linux implementation of sigfillset -----------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/signal/sigfillset.h"
+#include "include/errno.h"
+#include "src/errno/llvmlibc_errno.h"
+#include "src/signal/linux/signal.h"
+
+#include "src/__support/common.h"
+
+namespace __llvm_libc {
+
+int LLVM_LIBC_ENTRYPOINT(sigfillset)(sigset_t *set) {
+  if (!set) {
+    llvmlibc_errno = EINVAL;
+    return -1;
+  }
+  auto *sigset = reinterpret_cast<__llvm_libc::Sigset *>(set);
+  *sigset = __llvm_libc::Sigset::fullset();
+  return 0;
+}
+
+} // namespace __llvm_libc

diff  --git a/libc/src/signal/linux/signal.h b/libc/src/signal/linux/signal.h
index 93b33596580f..9a02ea7d847d 100644
--- a/libc/src/signal/linux/signal.h
+++ b/libc/src/signal/linux/signal.h
@@ -26,9 +26,9 @@ struct Sigset {
   constexpr static Sigset fullset() { return {-1UL}; }
   constexpr static Sigset emptySet() { return {0}; }
 
-  constexpr void addset(int signal) {
-    nativeSigset |= (1L << (signal - 1));
-  }
+  constexpr void addset(int signal) { nativeSigset |= (1L << (signal - 1)); }
+
+  constexpr void delset(int signal) { nativeSigset &= ~(1L << (signal - 1)); }
 
   operator sigset_t() const { return nativeSigset; }
 };
@@ -39,16 +39,15 @@ static inline int block_all_signals(Sigset &set) {
   sigset_t nativeSigset = all;
   sigset_t oldSet = set;
   int ret = __llvm_libc::syscall(SYS_rt_sigprocmask, SIG_BLOCK, &nativeSigset,
-                              &oldSet, sizeof(sigset_t));
+                                 &oldSet, sizeof(sigset_t));
   set = {oldSet};
   return ret;
 }
 
 static inline int restore_signals(const Sigset &set) {
   sigset_t nativeSigset = set;
-  return __llvm_libc::syscall(SYS_rt_sigprocmask, SIG_SETMASK,
-                              &nativeSigset, nullptr,
-                              sizeof(sigset_t));
+  return __llvm_libc::syscall(SYS_rt_sigprocmask, SIG_SETMASK, &nativeSigset,
+                              nullptr, sizeof(sigset_t));
 }
 
 } // namespace __llvm_libc

diff  --git a/libc/src/signal/sigdelset.h b/libc/src/signal/sigdelset.h
new file mode 100644
index 000000000000..05cc47ce4b9c
--- /dev/null
+++ b/libc/src/signal/sigdelset.h
@@ -0,0 +1,20 @@
+//===------------- Implementation header for sigdelset ---------*- C++ -*--===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_SIGNAL_SIGDELSET_H
+#define LLVM_LIBC_SRC_SIGNAL_SIGDELSET_H
+
+#include "include/signal.h"
+
+namespace __llvm_libc {
+
+int sigdelset(sigset_t *set, int signum);
+
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_SIGNAL_SIGDELSET_H

diff  --git a/libc/src/signal/sigfillset.h b/libc/src/signal/sigfillset.h
new file mode 100644
index 000000000000..facf67919a9f
--- /dev/null
+++ b/libc/src/signal/sigfillset.h
@@ -0,0 +1,20 @@
+//===------------- Implementation header for sigfillset --------*- C++ -*--===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_SIGNAL_SIGFILLSET_H
+#define LLVM_LIBC_SRC_SIGNAL_SIGFILLSET_H
+
+#include "include/signal.h"
+
+namespace __llvm_libc {
+
+int sigfillset(sigset_t *set);
+
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_SIGNAL_SIGFILLSET_H

diff  --git a/libc/test/src/signal/CMakeLists.txt b/libc/test/src/signal/CMakeLists.txt
index e198e416c8e6..67219c85227a 100644
--- a/libc/test/src/signal/CMakeLists.txt
+++ b/libc/test/src/signal/CMakeLists.txt
@@ -66,3 +66,34 @@ add_libc_unittest(
     __errno_location
     errno_h
 )
+
+add_libc_unittest(
+  sigfillset_test
+  SUITE
+    libc_signal_unittests
+  SRCS
+    sigfillset_test.cpp
+  DEPENDS
+    sigfillset
+    sigprocmask
+    signal_h
+    raise
+    errno_h
+    __errno_location
+)
+
+add_libc_unittest(
+  sigdelset_test
+  SUITE
+    libc_signal_unittests
+  SRCS
+    sigdelset_test.cpp
+  DEPENDS
+    sigdelset
+    sigfillset
+    sigprocmask
+    signal_h
+    raise
+    errno_h
+    __errno_location
+)

diff  --git a/libc/test/src/signal/sigdelset_test.cpp b/libc/test/src/signal/sigdelset_test.cpp
new file mode 100644
index 000000000000..d6e259ca4ca0
--- /dev/null
+++ b/libc/test/src/signal/sigdelset_test.cpp
@@ -0,0 +1,36 @@
+//===--------------------- Unittests for sigdelset ------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "include/errno.h"
+#include "include/signal.h"
+#include "src/signal/raise.h"
+#include "src/signal/sigdelset.h"
+#include "src/signal/sigfillset.h"
+#include "src/signal/sigprocmask.h"
+
+#include "utils/UnitTest/ErrnoSetterMatcher.h"
+#include "utils/UnitTest/Test.h"
+
+TEST(Sigdelset, Invalid) {
+  using __llvm_libc::testing::ErrnoSetterMatcher::Fails;
+  // Invalid set.
+  EXPECT_THAT(__llvm_libc::sigdelset(nullptr, SIGUSR1), Fails(EINVAL));
+
+  sigset_t set;
+  // Valid set, invalid signum.
+  EXPECT_THAT(__llvm_libc::sigdelset(&set, -1), Fails(EINVAL));
+}
+
+TEST(Sigdelset, UnblockOne) {
+  using __llvm_libc::testing::ErrnoSetterMatcher::Succeeds;
+  sigset_t set;
+  EXPECT_THAT(__llvm_libc::sigfillset(&set), Succeeds());
+  EXPECT_THAT(__llvm_libc::sigdelset(&set, SIGUSR1), Succeeds());
+  EXPECT_THAT(__llvm_libc::sigprocmask(SIG_SETMASK, &set, nullptr), Succeeds());
+  EXPECT_DEATH([] { __llvm_libc::raise(SIGUSR1); }, SIGUSR1);
+}

diff  --git a/libc/test/src/signal/sigfillset_test.cpp b/libc/test/src/signal/sigfillset_test.cpp
new file mode 100644
index 000000000000..35e6721ab6c6
--- /dev/null
+++ b/libc/test/src/signal/sigfillset_test.cpp
@@ -0,0 +1,29 @@
+//===-------------------- Unittests for sigfillset ------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "include/errno.h"
+#include "include/signal.h"
+#include "src/signal/raise.h"
+#include "src/signal/sigfillset.h"
+#include "src/signal/sigprocmask.h"
+
+#include "utils/UnitTest/ErrnoSetterMatcher.h"
+#include "utils/UnitTest/Test.h"
+
+TEST(Sigfillset, Invalid) {
+  using __llvm_libc::testing::ErrnoSetterMatcher::Fails;
+  EXPECT_THAT(__llvm_libc::sigfillset(nullptr), Fails(EINVAL));
+}
+
+TEST(Sigfillset, BlocksAll) {
+  using __llvm_libc::testing::ErrnoSetterMatcher::Succeeds;
+  sigset_t set;
+  EXPECT_THAT(__llvm_libc::sigfillset(&set), Succeeds());
+  EXPECT_THAT(__llvm_libc::sigprocmask(SIG_SETMASK, &set, nullptr), Succeeds());
+  EXPECT_EXITS([] { __llvm_libc::raise(SIGUSR1); }, 0);
+}


        


More information about the libc-commits mailing list