summaryrefslogtreecommitdiffstats
path: root/third_party/rust/nix/src/ucontext.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/rust/nix/src/ucontext.rs
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/nix/src/ucontext.rs')
-rw-r--r--third_party/rust/nix/src/ucontext.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/third_party/rust/nix/src/ucontext.rs b/third_party/rust/nix/src/ucontext.rs
new file mode 100644
index 0000000000..b2a39f7699
--- /dev/null
+++ b/third_party/rust/nix/src/ucontext.rs
@@ -0,0 +1,47 @@
+#[cfg(not(target_env = "musl"))]
+use crate::errno::Errno;
+use crate::sys::signal::SigSet;
+#[cfg(not(target_env = "musl"))]
+use crate::Result;
+#[cfg(not(target_env = "musl"))]
+use std::mem;
+
+#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
+pub struct UContext {
+ context: libc::ucontext_t,
+}
+
+impl UContext {
+ #[cfg(not(target_env = "musl"))]
+ pub fn get() -> Result<UContext> {
+ let mut context = mem::MaybeUninit::<libc::ucontext_t>::uninit();
+ let res = unsafe { libc::getcontext(context.as_mut_ptr()) };
+ Errno::result(res).map(|_| unsafe {
+ UContext {
+ context: context.assume_init(),
+ }
+ })
+ }
+
+ #[cfg(not(target_env = "musl"))]
+ pub fn set(&self) -> Result<()> {
+ let res = unsafe {
+ libc::setcontext(&self.context as *const libc::ucontext_t)
+ };
+ Errno::result(res).map(drop)
+ }
+
+ pub fn sigmask_mut(&mut self) -> &mut SigSet {
+ unsafe {
+ &mut *(&mut self.context.uc_sigmask as *mut libc::sigset_t
+ as *mut SigSet)
+ }
+ }
+
+ pub fn sigmask(&self) -> &SigSet {
+ unsafe {
+ &*(&self.context.uc_sigmask as *const libc::sigset_t
+ as *const SigSet)
+ }
+ }
+}