auto merge of #4858 : z0w0/rust/rm_weak_task_count, r=graydon

This commit is contained in:
bors 2013-02-12 14:36:33 -08:00
commit bc2d147847
6 changed files with 26 additions and 45 deletions

View file

@ -41,12 +41,12 @@ pub unsafe fn weaken_task(f: &fn(Port<ShutdownMsg>)) {
let task = get_task_id(); let task = get_task_id();
// Expect the weak task service to be alive // Expect the weak task service to be alive
assert service.try_send(RegisterWeakTask(task, shutdown_chan)); assert service.try_send(RegisterWeakTask(task, shutdown_chan));
unsafe { rust_inc_weak_task_count(); } unsafe { rust_dec_kernel_live_count(); }
do fn&() { do fn&() {
let shutdown_port = swap_unwrap(&mut *shutdown_port); let shutdown_port = swap_unwrap(&mut *shutdown_port);
f(shutdown_port) f(shutdown_port)
}.finally || { }.finally || {
unsafe { rust_dec_weak_task_count(); } unsafe { rust_inc_kernel_live_count(); }
// Service my have already exited // Service my have already exited
service.send(UnregisterWeakTask(task)); service.send(UnregisterWeakTask(task));
} }
@ -79,11 +79,11 @@ fn create_global_service() -> ~WeakTaskService {
let port = swap_unwrap(&mut *port); let port = swap_unwrap(&mut *port);
// The weak task service is itself a weak task // The weak task service is itself a weak task
debug!("weakening the weak service task"); debug!("weakening the weak service task");
unsafe { rust_inc_weak_task_count(); } unsafe { rust_dec_kernel_live_count(); }
run_weak_task_service(port); run_weak_task_service(port);
}.finally { }.finally {
debug!("unweakening the weak service task"); debug!("unweakening the weak service task");
unsafe { rust_dec_weak_task_count(); } unsafe { rust_inc_kernel_live_count(); }
} }
} }
@ -127,8 +127,8 @@ fn run_weak_task_service(port: Port<ServiceMsg>) {
} }
extern { extern {
unsafe fn rust_inc_weak_task_count(); unsafe fn rust_inc_kernel_live_count();
unsafe fn rust_dec_weak_task_count(); unsafe fn rust_dec_kernel_live_count();
} }
#[test] #[test]

View file

@ -939,15 +939,15 @@ rust_get_global_data_ptr() {
} }
extern "C" void extern "C" void
rust_inc_weak_task_count() { rust_inc_kernel_live_count() {
rust_task *task = rust_get_current_task(); rust_task *task = rust_get_current_task();
task->kernel->inc_weak_task_count(); task->kernel->inc_live_count();
} }
extern "C" void extern "C" void
rust_dec_weak_task_count() { rust_dec_kernel_live_count() {
rust_task *task = rust_get_current_task(); rust_task *task = rust_get_current_task();
task->kernel->dec_weak_task_count(); task->kernel->dec_live_count();
} }
// //

View file

@ -291,12 +291,20 @@ rust_kernel::set_exit_status(int code) {
} }
void void
rust_kernel::register_task() { rust_kernel::inc_live_count() {
KLOG_("Registering task");
uintptr_t new_non_weak_tasks = sync::increment(non_weak_tasks); uintptr_t new_non_weak_tasks = sync::increment(non_weak_tasks);
KLOG_("New non-weak tasks %" PRIdPTR, new_non_weak_tasks); KLOG_("New non-weak tasks %" PRIdPTR, new_non_weak_tasks);
} }
void
rust_kernel::dec_live_count() {
uintptr_t new_non_weak_tasks = sync::decrement(non_weak_tasks);
KLOG_("New non-weak tasks %" PRIdPTR, new_non_weak_tasks);
if (new_non_weak_tasks == 0) {
begin_shutdown();
}
}
void void
rust_kernel::allow_scheduler_exit() { rust_kernel::allow_scheduler_exit() {
scoped_lock with(sched_lock); scoped_lock with(sched_lock);
@ -315,31 +323,6 @@ rust_kernel::allow_scheduler_exit() {
osmain_sched->allow_exit(); osmain_sched->allow_exit();
} }
void
rust_kernel::unregister_task() {
KLOG_("Unregistering task");
uintptr_t new_non_weak_tasks = sync::decrement(non_weak_tasks);
KLOG_("New non-weak tasks %" PRIdPTR, new_non_weak_tasks);
if (new_non_weak_tasks == 0) {
begin_shutdown();
}
}
void
rust_kernel::inc_weak_task_count() {
uintptr_t new_non_weak_tasks = sync::decrement(non_weak_tasks);
KLOG_("New non-weak tasks %" PRIdPTR, new_non_weak_tasks);
if (new_non_weak_tasks == 0) {
begin_shutdown();
}
}
void
rust_kernel::dec_weak_task_count() {
uintptr_t new_non_weak_tasks = sync::increment(non_weak_tasks);
KLOG_("New non-weak tasks %" PRIdPTR, new_non_weak_tasks);
}
void void
rust_kernel::begin_shutdown() { rust_kernel::begin_shutdown() {
{ {

View file

@ -160,10 +160,8 @@ public:
rust_sched_id main_sched_id() { return main_scheduler; } rust_sched_id main_sched_id() { return main_scheduler; }
rust_sched_id osmain_sched_id() { return osmain_scheduler; } rust_sched_id osmain_sched_id() { return osmain_scheduler; }
void register_task(); void inc_live_count();
void unregister_task(); void dec_live_count();
void inc_weak_task_count();
void dec_weak_task_count();
void register_exit_function(spawn_fn runner, fn_env_pair *f); void register_exit_function(spawn_fn runner, fn_env_pair *f);
}; };

View file

@ -123,7 +123,7 @@ rust_scheduler::create_task(rust_task *spawner, const char *name) {
cur_thread = (thread_no + 1) % max_num_threads; cur_thread = (thread_no + 1) % max_num_threads;
} }
KLOG(kernel, kern, "Creating task %s, on thread %d.", name, thread_no); KLOG(kernel, kern, "Creating task %s, on thread %d.", name, thread_no);
kernel->register_task(); kernel->inc_live_count();
rust_sched_launcher *thread = threads[thread_no]; rust_sched_launcher *thread = threads[thread_no];
return thread->get_loop()->create_task(spawner, name); return thread->get_loop()->create_task(spawner, name);
} }
@ -138,7 +138,7 @@ rust_scheduler::release_task() {
need_exit = true; need_exit = true;
} }
} }
kernel->unregister_task(); kernel->dec_live_count();
if (need_exit) { if (need_exit) {
exit(); exit();
} }

View file

@ -188,6 +188,6 @@ rust_raw_thread_start
rust_raw_thread_join_delete rust_raw_thread_join_delete
rust_register_exit_function rust_register_exit_function
rust_get_global_data_ptr rust_get_global_data_ptr
rust_inc_weak_task_count rust_inc_kernel_live_count
rust_dec_weak_task_count rust_dec_kernel_live_count
rust_get_exchange_count_ptr rust_get_exchange_count_ptr