Skip to content

Commit f674b08

Browse files
fix(android/aarch64): use libc::ucontext_t from Android NDK
1 parent 6029717 commit f674b08

2 files changed

Lines changed: 26 additions & 2 deletions

File tree

src/unix/linux_like/android/b32/arm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ s! {
3131

3232
pub struct __c_anonymous_uc_sigmask_with_padding {
3333
pub uc_sigmask: crate::sigset_t,
34-
/* Android has a wrong (smaller) sigset_t on x86. */
34+
/* Android has a wrong (smaller) sigset_t on ARM. */
3535
__padding_rt_sigset: Padding<u32>,
3636
}
3737

src/unix/linux_like/android/b64/aarch64/mod.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ s! {
6363
pub uc_flags: c_ulong,
6464
pub uc_link: *mut ucontext_t,
6565
pub uc_stack: crate::stack_t,
66-
pub uc_sigmask: crate::sigset_t,
66+
pub uc_sigmask__c_anonymous_union: __c_anonymous_uc_sigmask,
67+
/* The kernel adds extra padding after uc_sigmask to match
68+
* glibc sigset_t on ARM64. */
69+
__padding: Padding<[c_char; 128 - size_of::<crate::sigset_t>()]>,
6770
pub uc_mcontext: mcontext_t,
6871
}
6972

@@ -85,12 +88,33 @@ s! {
8588
}
8689

8790
s_no_extra_traits! {
91+
pub union __c_anonymous_uc_sigmask {
92+
uc_sigmask: crate::sigset_t,
93+
uc_sigmask64: crate::sigset64_t,
94+
}
95+
8896
#[repr(align(16))]
8997
pub struct max_align_t {
9098
priv_: [f32; 8],
9199
}
92100
}
93101

102+
cfg_if! {
103+
if #[cfg(feature = "extra_traits")] {
104+
impl PartialEq for __c_anonymous_uc_sigmask {
105+
fn eq(&self, other: &__c_anonymous_uc_sigmask) -> bool {
106+
unsafe { self.uc_sigmask == other.uc_sigmask }
107+
}
108+
}
109+
impl Eq for __c_anonymous_uc_sigmask {}
110+
impl hash::Hash for __c_anonymous_uc_sigmask {
111+
fn hash<H: hash::Hasher>(&self, state: &mut H) {
112+
unsafe { self.uc_sigmask.hash(state) }
113+
}
114+
}
115+
}
116+
}
117+
94118
pub const O_DIRECT: c_int = 0x10000;
95119
pub const O_DIRECTORY: c_int = 0x4000;
96120
pub const O_NOFOLLOW: c_int = 0x8000;

0 commit comments

Comments
 (0)