about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-05-07 18:13:15 -0700
committerBrian Anderson <banderson@mozilla.com>2013-05-15 12:19:14 -0700
commitbfd9aa9755149725e39d8024d693ed76f92a30df (patch)
tree45dff5217306f2f3c10ed1add0756f286acaf921
parent6a6076ae810d470dfb511712c303a4ee7ffedf00 (diff)
downloadrust-bfd9aa9755149725e39d8024d693ed76f92a30df.tar.gz
rust-bfd9aa9755149725e39d8024d693ed76f92a30df.zip
core:rt: A few micro-opts
-rw-r--r--src/libcore/rt/context.rs1
-rw-r--r--src/libcore/rt/global_heap.rs14
-rw-r--r--src/libcore/rt/local_sched.rs1
-rw-r--r--src/libcore/rt/thread_local_storage.rs3
-rw-r--r--src/rt/rust_exchange_alloc.cpp16
-rw-r--r--src/rt/rustrt.def.in2
6 files changed, 21 insertions, 16 deletions
diff --git a/src/libcore/rt/context.rs b/src/libcore/rt/context.rs
index 9c1612884f0..2add314fd11 100644
--- a/src/libcore/rt/context.rs
+++ b/src/libcore/rt/context.rs
@@ -84,6 +84,7 @@ pub impl Context {
 }
 
 extern {
+    #[rust_stack]
     fn swap_registers(out_regs: *mut Registers, in_regs: *Registers);
 }
 
diff --git a/src/libcore/rt/global_heap.rs b/src/libcore/rt/global_heap.rs
index 3b35c2fb804..ce7ff87b445 100644
--- a/src/libcore/rt/global_heap.rs
+++ b/src/libcore/rt/global_heap.rs
@@ -9,7 +9,7 @@
 // except according to those terms.
 
 use sys::{TypeDesc, size_of};
-use libc::{c_void, size_t};
+use libc::{c_void, size_t, uintptr_t};
 use c_malloc = libc::malloc;
 use c_free = libc::free;
 use managed::raw::{BoxHeaderRepr, BoxRepr};
@@ -34,7 +34,7 @@ pub unsafe fn malloc(td: *TypeDesc, size: uint) -> *c_void {
     box.header.prev = null();
     box.header.next = null();
 
-    let exchange_count = &mut *rust_get_exchange_count_ptr();
+    let exchange_count = &mut *exchange_count_ptr();
     atomic_xadd(exchange_count, 1);
 
     return transmute(box);
@@ -52,7 +52,7 @@ pub unsafe fn malloc_raw(size: uint) -> *c_void {
 }
 
 pub unsafe fn free(ptr: *c_void) {
-    let exchange_count = &mut *rust_get_exchange_count_ptr();
+    let exchange_count = &mut *exchange_count_ptr();
     atomic_xsub(exchange_count, 1);
 
     assert!(ptr.is_not_null());
@@ -77,7 +77,11 @@ fn align_to(size: uint, align: uint) -> uint {
     (size + align - 1) & !(align - 1)
 }
 
+fn exchange_count_ptr() -> *mut int {
+    // XXX: Need mutable globals
+    unsafe { transmute(&rust_exchange_count) }
+}
+
 extern {
-    #[rust_stack]
-    fn rust_get_exchange_count_ptr() -> *mut int;
+    static rust_exchange_count: uintptr_t;
 }
diff --git a/src/libcore/rt/local_sched.rs b/src/libcore/rt/local_sched.rs
index eb35eb7881d..1ef1fd33a83 100644
--- a/src/libcore/rt/local_sched.rs
+++ b/src/libcore/rt/local_sched.rs
@@ -126,6 +126,7 @@ fn maybe_tls_key() -> Option<tls::Key> {
 }
 
 extern {
+    #[fast_ffi]
     fn rust_get_sched_tls_key() -> *mut c_void;
 }
 
diff --git a/src/libcore/rt/thread_local_storage.rs b/src/libcore/rt/thread_local_storage.rs
index 366996fb935..6a08c0f59b1 100644
--- a/src/libcore/rt/thread_local_storage.rs
+++ b/src/libcore/rt/thread_local_storage.rs
@@ -46,8 +46,11 @@ type pthread_key_t = ::libc::c_uint;
 
 #[cfg(unix)]
 extern {
+    #[fast_ffi]
     fn pthread_key_create(key: *mut pthread_key_t, dtor: *u8) -> c_int;
+    #[fast_ffi]
     fn pthread_setspecific(key: pthread_key_t, value: *mut c_void) -> c_int;
+    #[fast_ffi]
     fn pthread_getspecific(key: pthread_key_t) -> *mut c_void;
 }
 
diff --git a/src/rt/rust_exchange_alloc.cpp b/src/rt/rust_exchange_alloc.cpp
index 5958c68f3e7..89257dc9f6e 100644
--- a/src/rt/rust_exchange_alloc.cpp
+++ b/src/rt/rust_exchange_alloc.cpp
@@ -15,14 +15,15 @@
 #include <string.h>
 #include <stdio.h>
 
-uintptr_t exchange_count = 0;
+extern uintptr_t rust_exchange_count;
+uintptr_t rust_exchange_count = 0;
 
 void *
 rust_exchange_alloc::malloc(size_t size) {
   void *value = ::malloc(size);
   assert(value);
 
-  sync::increment(exchange_count);
+  sync::increment(rust_exchange_count);
 
   return value;
 }
@@ -36,20 +37,15 @@ rust_exchange_alloc::realloc(void *ptr, size_t size) {
 
 void
 rust_exchange_alloc::free(void *ptr) {
-  sync::decrement(exchange_count);
+  sync::decrement(rust_exchange_count);
   ::free(ptr);
 }
 
-extern "C" uintptr_t *
-rust_get_exchange_count_ptr() {
-  return &exchange_count;
-}
-
 void
 rust_check_exchange_count_on_exit() {
-  if (exchange_count != 0) {
+  if (rust_exchange_count != 0) {
     printf("exchange heap not empty on exit\n");
-    printf("%d dangling allocations\n", (int)exchange_count);
+    printf("%d dangling allocations\n", (int)rust_exchange_count);
     abort();
   }
 }
diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in
index 75a5a069605..a62d7991d49 100644
--- a/src/rt/rustrt.def.in
+++ b/src/rt/rustrt.def.in
@@ -195,7 +195,7 @@ rust_register_exit_function
 rust_get_global_data_ptr
 rust_inc_kernel_live_count
 rust_dec_kernel_live_count
-rust_get_exchange_count_ptr
+rust_exchange_count
 rust_get_sched_tls_key
 swap_registers
 rust_readdir