From de47fcfdf9404d53940099f5e7810bdb2bf37af3 Mon Sep 17 00:00:00 2001
From: Brian Anderson <banderson@mozilla.com>
Date: Sat, 31 Mar 2012 22:00:08 -0700
Subject: [PATCH] rt: Extract rust_thread_sched_launcher from
 rust_sched_launcher

---
 src/rt/rust_sched_launcher.cpp | 10 ++++++++--
 src/rt/rust_sched_launcher.h   | 22 ++++++++++++++++------
 src/rt/rust_scheduler.cpp      |  3 ++-
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/src/rt/rust_sched_launcher.cpp b/src/rt/rust_sched_launcher.cpp
index ea444b504aa..031f8bba60a 100644
--- a/src/rt/rust_sched_launcher.cpp
+++ b/src/rt/rust_sched_launcher.cpp
@@ -5,8 +5,14 @@ const size_t SCHED_STACK_SIZE = 1024*100;
 
 rust_sched_launcher::rust_sched_launcher(rust_scheduler *sched,
                                          rust_srv *srv, int id)
-    : rust_thread(SCHED_STACK_SIZE),
-      kernel(sched->kernel),
+    : kernel(sched->kernel),
       sched_loop(sched, srv, id),
       driver(&sched_loop) {
 }
+
+rust_thread_sched_launcher::rust_thread_sched_launcher(rust_scheduler *sched,
+						       rust_srv *srv, int id)
+    : rust_sched_launcher(sched, srv, id),
+      rust_thread(SCHED_STACK_SIZE) {
+}
+
diff --git a/src/rt/rust_sched_launcher.h b/src/rt/rust_sched_launcher.h
index 79a5835efe2..ea35dc27a22 100644
--- a/src/rt/rust_sched_launcher.h
+++ b/src/rt/rust_sched_launcher.h
@@ -5,23 +5,33 @@
 #include "sync/rust_thread.h"
 #include "rust_sched_driver.h"
 
-class rust_sched_launcher
-  : public kernel_owned<rust_sched_launcher>,
-    private rust_thread {
+class rust_sched_launcher : public kernel_owned<rust_sched_launcher> {
 public:
     rust_kernel *kernel;
 
 private:
     rust_sched_loop sched_loop;
+
+protected:
     rust_sched_driver driver;
 
 public:
     rust_sched_launcher(rust_scheduler *sched, rust_srv *srv, int id);
 
-    void start() { rust_thread::start(); }
-    void run() { driver.start_main_loop(); }
-    void join() { rust_thread::join(); }
+    virtual void start() = 0;
+    virtual void run()  = 0;
+    virtual void join() = 0;
     rust_sched_loop *get_loop() { return &sched_loop; }
 };
 
+class rust_thread_sched_launcher
+  :public rust_sched_launcher,
+   private rust_thread {
+public:
+    rust_thread_sched_launcher(rust_scheduler *sched, rust_srv *srv, int id);
+    virtual void start() { rust_thread::start(); }
+    virtual void run() { driver.start_main_loop(); }
+    virtual void join() { rust_thread::join(); }
+};
+
 #endif // RUST_SCHED_LAUNCHER_H
diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp
index 4153972f83a..48f8acd9866 100644
--- a/src/rt/rust_scheduler.cpp
+++ b/src/rt/rust_scheduler.cpp
@@ -26,7 +26,8 @@ rust_sched_launcher *
 rust_scheduler::create_task_thread(int id) {
     rust_srv *srv = this->srv->clone();
     rust_sched_launcher *thread =
-        new (kernel, "rust_sched_launcher") rust_sched_launcher(this, srv, id);
+	new (kernel, "rust_thread_sched_launcher")
+	rust_thread_sched_launcher(this, srv, id);
     KLOG(kernel, kern, "created task thread: " PTR ", id: %d",
           thread, id);
     return thread;