diff options
| -rw-r--r-- | src/libnative/task.rs | 4 | ||||
| -rw-r--r-- | src/librustrt/bookkeeping.rs | 12 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/libnative/task.rs b/src/libnative/task.rs index 35367ff2efa..c72d6c24a7c 100644 --- a/src/libnative/task.rs +++ b/src/libnative/task.rs @@ -71,7 +71,7 @@ pub fn spawn_opts(opts: TaskOpts, f: proc():Send) { // Note that this increment must happen *before* the spawn in order to // guarantee that if this task exits it will always end up waiting for the // spawned task to exit. - bookkeeping::increment(); + let token = bookkeeping::increment(); // Spawning a new OS thread guarantees that __morestack will never get // triggered, but we must manually set up the actual stack bounds once this @@ -93,7 +93,7 @@ pub fn spawn_opts(opts: TaskOpts, f: proc():Send) { let mut task = task; task.put_runtime(ops); drop(task.run(|| { f.take_unwrap()() }).destroy()); - bookkeeping::decrement(); + drop(token); }) } diff --git a/src/librustrt/bookkeeping.rs b/src/librustrt/bookkeeping.rs index fd290491eaf..ba9995e34ca 100644 --- a/src/librustrt/bookkeeping.rs +++ b/src/librustrt/bookkeeping.rs @@ -19,14 +19,24 @@ //! decrement() manually. use core::atomics; +use core::ops::Drop; use mutex::{StaticNativeMutex, NATIVE_MUTEX_INIT}; static mut TASK_COUNT: atomics::AtomicUint = atomics::INIT_ATOMIC_UINT; static mut TASK_LOCK: StaticNativeMutex = NATIVE_MUTEX_INIT; -pub fn increment() { +pub struct Token(()); + +impl Drop for Token { + fn drop(&mut self) { decrement() } +} + +/// Increment the number of live tasks, returning a token which will decrement +/// the count when dropped. +pub fn increment() -> Token { let _ = unsafe { TASK_COUNT.fetch_add(1, atomics::SeqCst) }; + Token(()) } pub fn decrement() { |
