about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/rt/rust_sched_launcher.cpp7
-rw-r--r--src/rt/rust_sched_launcher.h13
-rw-r--r--src/rt/rust_scheduler.cpp15
-rw-r--r--src/rt/rust_scheduler.h6
4 files changed, 31 insertions, 10 deletions
diff --git a/src/rt/rust_sched_launcher.cpp b/src/rt/rust_sched_launcher.cpp
index b9c1f87f9d3..e1b0651cf9d 100644
--- a/src/rt/rust_sched_launcher.cpp
+++ b/src/rt/rust_sched_launcher.cpp
@@ -20,3 +20,10 @@ rust_manual_sched_launcher::rust_manual_sched_launcher(rust_scheduler *sched,
                                                        rust_srv *srv, int id)
     : rust_sched_launcher(sched, srv, id) {
 }
+
+rust_sched_launcher *
+rust_thread_sched_launcher_factory::create(rust_scheduler *sched, int id) {
+    rust_srv *srv = sched->srv->clone();
+    return new(sched->kernel, "rust_thread_sched_launcher")
+        rust_thread_sched_launcher(sched, srv, id);
+}
diff --git a/src/rt/rust_sched_launcher.h b/src/rt/rust_sched_launcher.h
index 7f3e0ed9f1c..7b5dc719424 100644
--- a/src/rt/rust_sched_launcher.h
+++ b/src/rt/rust_sched_launcher.h
@@ -42,4 +42,17 @@ public:
   void start_main_loop() { driver.start_main_loop(); }
 };
 
+class rust_sched_launcher_factory {
+public:
+    virtual ~rust_sched_launcher_factory() { }
+    virtual rust_sched_launcher *
+    create(rust_scheduler *sched, int id) = 0;
+};
+
+class rust_thread_sched_launcher_factory
+    : public rust_sched_launcher_factory {
+public:
+    virtual rust_sched_launcher *create(rust_scheduler *sched, int id);
+};
+
 #endif // RUST_SCHED_LAUNCHER_H
diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp
index 57b166208f9..82eac1b1c93 100644
--- a/src/rt/rust_scheduler.cpp
+++ b/src/rt/rust_scheduler.cpp
@@ -17,7 +17,8 @@ rust_scheduler::rust_scheduler(rust_kernel *kernel,
     num_threads(num_threads),
     id(id)
 {
-    create_task_threads();
+    rust_thread_sched_launcher_factory launchfac;
+    create_task_threads(&launchfac);
 }
 
 rust_scheduler::~rust_scheduler() {
@@ -25,11 +26,9 @@ rust_scheduler::~rust_scheduler() {
 }
 
 rust_sched_launcher *
-rust_scheduler::create_task_thread(int id) {
-    rust_srv *srv = this->srv->clone();
-    rust_sched_launcher *thread =
-        new (kernel, "rust_thread_sched_launcher")
-        rust_thread_sched_launcher(this, srv, id);
+rust_scheduler::create_task_thread(rust_sched_launcher_factory *launchfac,
+                                   int id) {
+    rust_sched_launcher *thread = launchfac->create(this, id);
     KLOG(kernel, kern, "created task thread: " PTR ", id: %d",
           thread, id);
     return thread;
@@ -44,11 +43,11 @@ rust_scheduler::destroy_task_thread(rust_sched_launcher *thread) {
 }
 
 void
-rust_scheduler::create_task_threads() {
+rust_scheduler::create_task_threads(rust_sched_launcher_factory *launchfac) {
     KLOG(kernel, kern, "Using %d scheduler threads.", num_threads);
 
     for(size_t i = 0; i < num_threads; ++i) {
-        threads.push(create_task_thread(i));
+        threads.push(create_task_thread(launchfac, i));
     }
 }
 
diff --git a/src/rt/rust_scheduler.h b/src/rt/rust_scheduler.h
index 48a33c52ef6..132fa9e6089 100644
--- a/src/rt/rust_scheduler.h
+++ b/src/rt/rust_scheduler.h
@@ -4,6 +4,7 @@
 #include "rust_internal.h"
 
 class rust_sched_launcher;
+class rust_sched_launcher_factory;
 
 class rust_scheduler : public kernel_owned<rust_scheduler> {
     // FIXME: Make these private
@@ -26,10 +27,11 @@ private:
 
     rust_sched_id id;
 
-    void create_task_threads();
+    void create_task_threads(rust_sched_launcher_factory *launchfac);
     void destroy_task_threads();
 
-    rust_sched_launcher *create_task_thread(int id);
+    rust_sched_launcher *
+    create_task_thread(rust_sched_launcher_factory *launchfac, int id);
     void destroy_task_thread(rust_sched_launcher *thread);
 
     void exit();