Skip to content

Commit

Permalink
openbsd: incoporate remarks
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
semarie committed Feb 1, 2015
1 parent 3096784 commit 568a451
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 40 deletions.
54 changes: 17 additions & 37 deletions src/libstd/sys/common/stack.rs
Expand Up @@ -227,24 +227,14 @@ 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")]
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)]
// 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) {
// segmented stack is disabled
}
}

Expand Down Expand Up @@ -332,28 +322,18 @@ pub unsafe fn get_sp_limit() -> uint {
}

// aarch64 - FIXME(AARCH64): missing...
#[cfg(target_arch = "aarch64")]
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)]
// 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 {
// segmented stack is disabled
1024
}
}
11 changes: 9 additions & 2 deletions src/libstd/sys/unix/os.rs
Expand Up @@ -217,11 +217,18 @@ pub fn load_self() -> Option<Vec<u8>> {

#[cfg(target_os = "openbsd")]
pub fn load_self() -> Option<Vec<u8>> {
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 {
Expand Down
2 changes: 1 addition & 1 deletion src/rt/rust_builtin.c
Expand Up @@ -204,7 +204,7 @@ int *__dfly_error(void) { return __error(); }
#include <sys/sysctl.h>
#include <limits.h>

const char * __load_self() {
const char * rust_load_self() {
static char *self = NULL;

if (self == NULL) {
Expand Down

0 comments on commit 568a451

Please sign in to comment.