diff options
| author | Michael Bebenita <mbebenita@mozilla.com> | 2010-07-28 16:24:50 -0700 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2010-07-28 20:30:29 -0700 |
| commit | 4ff8e15128f90d4e9e57897c48280c6f82bb8343 (patch) | |
| tree | 86c3808e729b4f596c3c23e228738d3d25b108bc /src/rt/rust_upcall.cpp | |
| parent | defd8a66eade4cb11960cf6de2b45c2f42ec3388 (diff) | |
| download | rust-4ff8e15128f90d4e9e57897c48280c6f82bb8343.tar.gz rust-4ff8e15128f90d4e9e57897c48280c6f82bb8343.zip | |
Move notification-messages out into their own file and unify into notify_message, make them use proxies, cache task proxies in dom.
Diffstat (limited to 'src/rt/rust_upcall.cpp')
| -rw-r--r-- | src/rt/rust_upcall.cpp | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp index e4604049c4d..42203becb58 100644 --- a/src/rt/rust_upcall.cpp +++ b/src/rt/rust_upcall.cpp @@ -122,19 +122,25 @@ extern "C" CDECL void upcall_yield(rust_task *task) { } extern "C" CDECL void -upcall_join(rust_task *task, maybe_proxy<rust_task> *proxy) { +upcall_join(rust_task *task, maybe_proxy<rust_task> *target) { LOG_UPCALL_ENTRY(task); task->log(rust_log::UPCALL | rust_log::COMM, - "join proxy 0x%" PRIxPTR " -> task = 0x%" PRIxPTR, - proxy, proxy->delegate()); - - rust_task *other = proxy->delegate(); - - // If the other task is already dying, we don't have to wait for it. - if (!other->dead()) { - other->waiting_tasks.push(&task->alarm); - task->block(other); + "target: 0x%" PRIxPTR ", task: 0x%" PRIxPTR, + target, target->delegate()); + + rust_task *target_task = target->delegate(); + if (target->is_proxy()) { + notify_message:: + send(notify_message::JOIN, "join", task, target->as_proxy()); + task->block(target_task); task->yield(2); + } else { + // If the other task is already dying, we don't have to wait for it. + if (target_task->dead() == false) { + target_task->tasks_waiting_to_join.push(task); + task->block(target_task); + task->yield(2); + } } } @@ -194,22 +200,20 @@ extern "C" CDECL void upcall_fail(rust_task *task, char const *expr, * Called whenever a task's ref count drops to zero. */ extern "C" CDECL void -upcall_kill(rust_task *task, maybe_proxy<rust_task> *target_proxy) { +upcall_kill(rust_task *task, maybe_proxy<rust_task> *target) { LOG_UPCALL_ENTRY(task); - rust_task *target_task = target_proxy->delegate(); - if (target_proxy != target_task) { - task->dom->free(target_proxy); - } + rust_task *target_task = target->delegate(); + task->log(rust_log::UPCALL | rust_log::TASK, "kill task 0x%" PRIxPTR ", ref count %d", target_task, target_task->ref_count); - if (requires_message_passing(task, target_task)) { - rust_dom *target_domain = target_task->dom; - target_domain->send_message( - new (target_domain) - kill_task_message(target_domain, target_task)); + if (target->is_proxy()) { + notify_message:: + send(notify_message::KILL, "kill", task, target->as_proxy()); + // The proxy ref_count dropped to zero, delete it here. + delete target->as_proxy(); } else { target_task->kill(); } @@ -224,7 +228,7 @@ upcall_exit(rust_task *task) { task->log(rust_log::UPCALL | rust_log::TASK, "task ref_count: %d", task->ref_count); task->die(); - task->notify_waiting_tasks(); + task->notify_tasks_waiting_to_join(); task->yield(1); } |
