about summary refs log tree commit diff
path: root/src/rt/rust_task.cpp
diff options
context:
space:
mode:
authorEric Holk <eholk@mozilla.com>2011-07-06 11:10:40 -0700
committerEric Holk <eholk@mozilla.com>2011-07-06 11:30:00 -0700
commitbc5d6aefdabc2ee928cb0599c5a8c73799f191ef (patch)
tree807d489bf1280b0b9c6b4ccbc4a5dc3e186513ed /src/rt/rust_task.cpp
parentbbdba21b1f3c7dfc4c0bac3525cc35939ae8ca4c (diff)
downloadrust-bc5d6aefdabc2ee928cb0599c5a8c73799f191ef.tar.gz
rust-bc5d6aefdabc2ee928cb0599c5a8c73799f191ef.zip
Added a task wakeup callback. Closes #599.
The callback happens when a task moves from the "blocked" state to the
"running" state. The callback is also inherited by child tasks. There
is currently only a native API.

This code hasn't been heavily exercised yet.
Diffstat (limited to 'src/rt/rust_task.cpp')
-rw-r--r--src/rt/rust_task.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index b2a60dc92bc..87492600524 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -73,7 +73,8 @@ rust_task::rust_task(rust_scheduler *sched, rust_task_list *state,
     running_on(-1),
     pinned_on(-1),
     local_region(&sched->srv->local_region),
-    synchronized_region(&sched->srv->synchronized_region)
+    synchronized_region(&sched->srv->synchronized_region),
+    _on_wakeup(NULL)
 {
     LOGPTR(sched, "new task", (uintptr_t)this);
     DLOG(sched, task, "sizeof(task) = %d (0x%x)", sizeof *this, sizeof *this);
@@ -431,6 +432,10 @@ rust_task::wakeup(rust_cond *from) {
     I(sched, cond == from);
     cond = NULL;
     cond_name = "none";
+
+    if(_on_wakeup) {
+        _on_wakeup->on_wakeup();
+    }
 }
 
 void
@@ -541,6 +546,10 @@ void rust_task::unpin() {
     pinned_on = -1;
 }
 
+void rust_task::on_wakeup(rust_task::wakeup_callback *callback) {
+    _on_wakeup = callback;
+}
+
 //
 // Local Variables:
 // mode: C++