[rygel] engine simple: Use ThreadPool
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rygel] engine simple: Use ThreadPool
- Date: Sun, 3 May 2015 18:58:41 +0000 (UTC)
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]