summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJens Georg <mail@jensge.org>2015-05-03 20:56:24 +0200
committerJens Georg <mail@jensge.org>2015-05-03 20:56:24 +0200
commit0417764eb98d33e8ff80ee6b8115e4526ddb5450 (patch)
treeae091decb3cc2ffd1d633e3b65d91342cad131b4 /src
parentc20a9e9f2cb083891a5b6fc8560a554caa45b5de (diff)
downloadrygel-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.vala27
-rw-r--r--src/media-engines/simple/rygel-simple-media-engine.vala13
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);
}
}