diff options
author | Jens Georg <mail@jensge.org> | 2015-05-03 20:56:24 +0200 |
---|---|---|
committer | Jens Georg <mail@jensge.org> | 2015-05-03 20:56:24 +0200 |
commit | 0417764eb98d33e8ff80ee6b8115e4526ddb5450 (patch) | |
tree | ae091decb3cc2ffd1d633e3b65d91342cad131b4 /src | |
parent | c20a9e9f2cb083891a5b6fc8560a554caa45b5de (diff) | |
download | rygel-0417764eb98d33e8ff80ee6b8115e4526ddb5450.tar.gz |
engine simple: Use ThreadPool
Signed-off-by: Jens Georg <mail@jensge.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/media-engines/simple/rygel-simple-data-source.vala | 27 | ||||
-rw-r--r-- | src/media-engines/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 b80a8957..c2d64949 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 849b485b..0832e3f7 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); } } |