about summary refs log tree commit diff
path: root/src/rt
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-03-03 02:36:53 -0800
committerBrian Anderson <banderson@mozilla.com>2012-03-05 19:39:55 -0800
commit2465a63a69ea51d4fce10430b6a8fd0079cbbcd5 (patch)
tree70e01ec8c8c3cad74a0e9221cd5cfa229c4c1a14 /src/rt
parent237652299ec5fa3529ac7bd1bfddc52b7526bb82 (diff)
rt: Move transition from rust_task to rust_task_thread
Diffstat (limited to 'src/rt')
-rw-r--r--src/rt/rust_task.cpp30
-rw-r--r--src/rt/rust_task.h7
-rw-r--r--src/rt/rust_task_thread.cpp23
-rw-r--r--src/rt/rust_task_thread.h4
4 files changed, 42 insertions, 22 deletions
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index 3c375f0b4c3..0e9e7b2eb85 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -401,26 +401,16 @@ rust_task::free(void *p)
 void
 rust_task::transition(rust_task_list *src, rust_task_list *dst,
                       rust_cond *cond, const char* cond_name) {
-    bool unlock = false;
-    if(!thread->lock.lock_held_by_current_thread()) {
-        unlock = true;
-        thread->lock.lock();
-    }
-    DLOG(thread, task,
-         "task %s " PTR " state change '%s' -> '%s' while in '%s'",
-         name, (uintptr_t)this, src->name, dst->name, state->name);
-    I(thread, state == src);
-    src->remove(this);
-    dst->append(this);
-    {
-        scoped_lock with(state_lock);
-        state = dst;
-        this->cond = cond;
-        this->cond_name = cond_name;
-    }
-    thread->lock.signal();
-    if(unlock)
-        thread->lock.unlock();
+    thread->transition(this, src, dst, cond, cond_name);
+}
+
+void
+rust_task::set_state(rust_task_list *state,
+                     rust_cond *cond, const char* cond_name) {
+    scoped_lock with(state_lock);
+    this->state = state;
+    this->cond = cond;
+    this->cond_name = cond_name;
 }
 
 void
diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h
index a940b6299ac..4f1ae792ae2 100644
--- a/src/rt/rust_task.h
+++ b/src/rt/rust_task.h
@@ -137,6 +137,9 @@ private:
 
     void return_c_stack();
 
+    void transition(rust_task_list *src, rust_task_list *dst,
+                    rust_cond *cond, const char* cond_name);
+
     friend void task_start_wrapper(spawn_args *a);
     friend void cleanup_task(cleanup_args *a);
     friend void reset_stack_limit_on_c_stack(reset_args *a);
@@ -163,8 +166,8 @@ public:
     void *realloc(void *data, size_t sz);
     void free(void *p);
 
-    void transition(rust_task_list *src, rust_task_list *dst,
-                    rust_cond *cond, const char* cond_name);
+    void set_state(rust_task_list *state,
+                   rust_cond *cond, const char* cond_name);
 
     void block(rust_cond *on, const char* name);
     void wakeup(rust_cond *from);
diff --git a/src/rt/rust_task_thread.cpp b/src/rt/rust_task_thread.cpp
index 472b58f1671..57164a97c0f 100644
--- a/src/rt/rust_task_thread.cpp
+++ b/src/rt/rust_task_thread.cpp
@@ -319,6 +319,29 @@ rust_task_thread::create_task(rust_task *spawner, const char *name,
     return task->id;
 }
 
+void 
+rust_task_thread::transition(rust_task *task,
+                             rust_task_list *src, rust_task_list *dst,
+                             rust_cond *cond, const char* cond_name) {
+    bool unlock = false;
+    if(!lock.lock_held_by_current_thread()) {
+        unlock = true;
+        lock.lock();
+    }
+    DLOG(this, task,
+         "task %s " PTR " state change '%s' -> '%s' while in '%s'",
+         name, (uintptr_t)this, src->name, dst->name,
+         task->get_state()->name);
+    I(this, task->get_state() == src);
+    src->remove(task);
+    dst->append(task);
+    task->set_state(dst, cond, cond_name);
+
+    lock.signal();
+    if(unlock)
+        lock.unlock();
+}
+
 void rust_task_thread::run() {
     this->start_main_loop();
     sched->release_task_thread();
diff --git a/src/rt/rust_task_thread.h b/src/rt/rust_task_thread.h
index 49da2eeeaf5..7b05c185be1 100644
--- a/src/rt/rust_task_thread.h
+++ b/src/rt/rust_task_thread.h
@@ -123,6 +123,10 @@ public:
     rust_task_id create_task(rust_task *spawner, const char *name,
                              size_t init_stack_sz);
 
+    void transition(rust_task *task,
+                    rust_task_list *src, rust_task_list *dst,
+                    rust_cond *cond, const char* cond_name);
+
     virtual void run();
 
     void init_tls();