[rygel] engine simple: Use ThreadPool



commit 0417764eb98d33e8ff80ee6b8115e4526ddb5450
Author: Jens Georg <mail jensge org>
Date:   Sun May 3 20:56:24 2015 +0200

    engine simple: Use ThreadPool
    
    Signed-off-by: Jens Georg <mail jensge org>

 .../simple/rygel-simple-data-source.vala           |   27 ++++++++++++++-----
 .../simple/rygel-simple-media-engine.vala          |   13 ++++++++-
 2 files changed, 31 insertions(+), 9 deletions(-)
---
diff --git a/src/media-engines/simple/rygel-simple-data-source.vala 
b/src/media-engines/simple/rygel-simple-data-source.vala
index b80a895..c2d6494 100644
--- a/src/media-engines/simple/rygel-simple-data-source.vala
+++ b/src/media-engines/simple/rygel-simple-data-source.vala
@@ -40,10 +40,13 @@ internal class Rygel.SimpleDataSource : DataSource, Object {
     private Posix.off_t last_byte = 0;
     private bool frozen = false;
     private bool stop_thread = false;
+    private unowned ThreadPool<SimpleDataSource> pool;
 
-    public SimpleDataSource (string uri) {
+    public SimpleDataSource (ThreadPool<SimpleDataSource>? pool,
+                             string                        uri) {
         debug ("Creating new data source for %s", uri);
         this.uri = uri;
+        this.pool = pool;
     }
 
     ~SimpleDataSource () {
@@ -86,10 +89,12 @@ internal class Rygel.SimpleDataSource : DataSource, Object {
 
     public void start () throws Error {
         debug ("Starting data source for uri %s", this.uri);
-
-        // TODO: Convert to use a thread pool
-        this.thread = new Thread<void*> ("Rygel Serving thread",
-                                         this.thread_func);
+        if (this.pool != null) {
+            this.pool.add (this);
+        } else {
+            this.thread = new Thread<void*> ("Rygel Serving Thread",
+                                             this.thread_func);
+        }
     }
 
     public void freeze () {
@@ -122,7 +127,17 @@ internal class Rygel.SimpleDataSource : DataSource, Object {
         this.mutex.unlock ();
     }
 
+    internal static void pool_func (owned SimpleDataSource data) {
+        data.run ();
+    }
+
     private void* thread_func () {
+        this.run ();
+
+        return null;
+    }
+
+    private void run () {
         var file = File.new_for_commandline_arg (this.uri);
         debug ("Spawning new thread for streaming file %s", this.uri);
         int fd = -1;
@@ -195,7 +210,5 @@ internal class Rygel.SimpleDataSource : DataSource, Object {
 
         // Signal that we're done streaming
         Idle.add ( () => { this.done (); return false; });
-
-        return null;
     }
 }
diff --git a/src/media-engines/simple/rygel-simple-media-engine.vala 
b/src/media-engines/simple/rygel-simple-media-engine.vala
index 849b485..0832e3f 100644
--- a/src/media-engines/simple/rygel-simple-media-engine.vala
+++ b/src/media-engines/simple/rygel-simple-media-engine.vala
@@ -33,9 +33,18 @@ using GUPnP;
  */
 internal class Rygel.SimpleMediaEngine : MediaEngine {
     private List<DLNAProfile> profiles;
+    private ThreadPool<SimpleDataSource> pool;
 
     public override void constructed () {
         this.profiles = new List<DLNAProfile> ();
+        try {
+            this.pool = new ThreadPool<SimpleDataSource>.with_owned_data
+                                            (SimpleDataSource.pool_func,
+                                             10,
+                                             true);
+        } catch (Error error) {
+            debug ("Failed to create pool");
+        }
     }
 
     public override unowned List<DLNAProfile> get_dlna_profiles() {
@@ -90,7 +99,7 @@ internal class Rygel.SimpleMediaEngine : MediaEngine {
         }
 
         // For MediaFileItems, the primary URI referrs to the local content file
-        return new SimpleDataSource (object.get_primary_uri ());
+        return new SimpleDataSource (this.pool, object.get_primary_uri ());
     }
 
     public override DataSource? create_data_source_for_uri (string uri) {
@@ -100,7 +109,7 @@ internal class Rygel.SimpleMediaEngine : MediaEngine {
 
         debug ("creating data source for %s", uri);
 
-        return new SimpleDataSource (uri);
+        return new SimpleDataSource (this.pool, uri);
     }
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]