From 568a451a90a14b101ed357235a5055de2940f16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Fri, 30 Jan 2015 08:15:28 +0100 Subject: [PATCH] openbsd: incoporate remarks - consolidate target_record_sp_limit and target_get_sp_limit functions for aarch64, powerpc, arm-ios and openbsd as there are all without segmented stacks (no need to duplicate functions). - rename __load_self function to rust_load_self - use a mutex inner load_self() as underline implementation is not thread-safe --- src/libstd/sys/common/stack.rs | 54 +++++++++++----------------------- src/libstd/sys/unix/os.rs | 11 +++++-- src/rt/rust_builtin.c | 2 +- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/src/libstd/sys/common/stack.rs b/src/libstd/sys/common/stack.rs index cd5458a2109c..8dd2f154fa8e 100644 --- a/src/libstd/sys/common/stack.rs +++ b/src/libstd/sys/common/stack.rs @@ -227,25 +227,15 @@ pub unsafe fn record_sp_limit(limit: uint) { } // aarch64 - FIXME(AARCH64): missing... - #[cfg(target_arch = "aarch64")] - unsafe fn target_record_sp_limit(_: uint) { - } - // powerpc - FIXME(POWERPC): missing... - #[cfg(target_arch = "powerpc")] + // arm-ios - iOS segmented stack is disabled for now, see related notes + // openbsd - segmented stack is disabled + #[cfg(any(target_arch = "aarch64", + target_arch = "powerpc", + all(target_arch = "arm", target_os = "ios"), + target_os = "openbsd"))] unsafe fn target_record_sp_limit(_: uint) { } - - - // iOS segmented stack is disabled for now, see related notes - #[cfg(all(target_arch = "arm", target_os = "ios"))] #[inline(always)] - unsafe fn target_record_sp_limit(_: uint) { - } - - #[cfg(target_os = "openbsd")] #[inline(always)] - unsafe fn target_record_sp_limit(_: uint) { - // segmented stack is disabled - } } /// The counterpart of the function above, this function will fetch the current @@ -332,28 +322,18 @@ pub unsafe fn get_sp_limit() -> uint { } // aarch64 - FIXME(AARCH64): missing... - #[cfg(target_arch = "aarch64")] + // powerpc - FIXME(POWERPC): missing... + // arm-ios - iOS doesn't support segmented stacks yet. + // openbsd - OpenBSD doesn't support segmented stacks. + // + // This function might be called by runtime though + // so it is unsafe to unreachable, let's return a fixed constant. + #[cfg(any(target_arch = "aarch64", + target_arch = "powerpc", + all(target_arch = "arm", target_os = "ios"), + target_os = "openbsd"))] + #[inline(always)] unsafe fn target_get_sp_limit() -> uint { 1024 } - - // powepc - FIXME(POWERPC): missing... - #[cfg(target_arch = "powerpc")] - unsafe fn target_get_sp_limit() -> uint { - 1024 - } - - // iOS doesn't support segmented stacks yet. This function might - // be called by runtime though so it is unsafe to mark it as - // unreachable, let's return a fixed constant. - #[cfg(all(target_arch = "arm", target_os = "ios"))] #[inline(always)] - unsafe fn target_get_sp_limit() -> uint { - 1024 - } - - #[cfg(target_os = "openbsd")] #[inline(always)] - unsafe fn target_get_sp_limit() -> uint { - // segmented stack is disabled - 1024 - } } diff --git a/src/libstd/sys/unix/os.rs b/src/libstd/sys/unix/os.rs index dd39501a7cbd..9faa4a038ba2 100644 --- a/src/libstd/sys/unix/os.rs +++ b/src/libstd/sys/unix/os.rs @@ -217,11 +217,18 @@ pub fn load_self() -> Option> { #[cfg(target_os = "openbsd")] pub fn load_self() -> Option> { + use sync::{StaticMutex, MUTEX_INIT}; + + static LOCK: StaticMutex = MUTEX_INIT; + extern { - fn __load_self() -> *const c_char; + fn rust_load_self() -> *const c_char; } + + let _guard = LOCK.lock(); + unsafe { - let v = __load_self(); + let v = rust_load_self(); if v.is_null() { None } else { diff --git a/src/rt/rust_builtin.c b/src/rt/rust_builtin.c index 372ff0f21472..382cbf0d5d12 100644 --- a/src/rt/rust_builtin.c +++ b/src/rt/rust_builtin.c @@ -204,7 +204,7 @@ int *__dfly_error(void) { return __error(); } #include #include -const char * __load_self() { +const char * rust_load_self() { static char *self = NULL; if (self == NULL) {