projects
/
cinaest
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
aaa2969
)
Make search thread cancellable
author
Philipp Zabel
<philipp.zabel@gmail.com>
Tue, 10 Nov 2009 19:11:42 +0000
(20:11 +0100)
committer
Philipp Zabel
<philipp.zabel@gmail.com>
Wed, 11 Nov 2009 18:36:21 +0000
(19:36 +0100)
src/movie-list-store.vala
patch
|
blob
|
history
src/plugin-interface.vala
patch
|
blob
|
history
src/plugins/google-parser.vala
patch
|
blob
|
history
src/plugins/google-plugin.vala
patch
|
blob
|
history
src/plugins/imdb-plugin.vala
patch
|
blob
|
history
diff --git
a/src/movie-list-store.vala
b/src/movie-list-store.vala
index
e75894d
..
1ad805f
100644
(file)
--- a/
src/movie-list-store.vala
+++ b/
src/movie-list-store.vala
@@
-41,6
+41,8
@@
public class MovieListStore : ListStore, TreeModel {
public MovieSource source;
private MovieFilter filter;
public bool update_running { get; set; }
public MovieSource source;
private MovieFilter filter;
public bool update_running { get; set; }
+ private weak Thread thread;
+ private Cancellable cancellable;
construct {
set_column_types (base_type);
construct {
set_column_types (base_type);
@@
-83,12
+85,19
@@
public class MovieListStore : ListStore, TreeModel {
}
public bool start_search (MovieFilter _filter) {
}
public bool start_search (MovieFilter _filter) {
- if (update_running)
- return false;
+ if (update_running) {
+ stdout.printf ("aborting search thread (%p)...\n", thread);
+ cancellable.cancel ();
+ // poster_factory.clear_queue ();
+ thread.join ();
+ stdout.printf ("search thread aborted\n");
+ }
+ if (cancellable == null || cancellable.is_cancelled ())
+ cancellable = new Cancellable ();
filter = _filter;
try {
filter = _filter;
try {
- Thread.create (search_thread, false);
+ thread = Thread.create (search_thread, true);
update_running = true;
} catch (ThreadError e) {
warning ("Failed to start search thread: %s", e.message);
update_running = true;
} catch (ThreadError e) {
warning ("Failed to start search thread: %s", e.message);
@@
-106,7
+115,7
@@
public class MovieListStore : ListStore, TreeModel {
if (source != null)
// FIXME - arbitrary limit
if (source != null)
// FIXME - arbitrary limit
- source.get_movies (filter, receive_movie, 100);
+ source.get_movies (filter, receive_movie, 100, cancellable);
Gdk.threads_enter ();
update_running = false;
Gdk.threads_enter ();
update_running = false;
@@
-119,6
+128,9
@@
public class MovieListStore : ListStore, TreeModel {
private void receive_movie (Movie movie) {
TreeIter iter;
private void receive_movie (Movie movie) {
TreeIter iter;
+ if (cancellable.is_cancelled ())
+ return;
+
Gdk.threads_enter ();
add (movie, out iter);
Gdk.threads_leave ();
Gdk.threads_enter ();
add (movie, out iter);
Gdk.threads_leave ();
diff --git
a/src/plugin-interface.vala
b/src/plugin-interface.vala
index
df453b0
..
2d14e4a
100644
(file)
--- a/
src/plugin-interface.vala
+++ b/
src/plugin-interface.vala
@@
-29,7
+29,7
@@
public abstract class Plugin : Object {
public abstract class MovieSource : Object {
public delegate void ReceiveMovieFunction (Movie movie);
public abstract class MovieSource : Object {
public delegate void ReceiveMovieFunction (Movie movie);
- public abstract void get_movies (MovieFilter filter, ReceiveMovieFunction callback, int limit);
+ public abstract void get_movies (MovieFilter filter, ReceiveMovieFunction callback, int limit, GLib.Cancellable? cancellable);
public abstract void add_movie (Movie movie);
public abstract void add_movie (Movie movie);
diff --git
a/src/plugins/google-parser.vala
b/src/plugins/google-parser.vala
index
e36cce5
..
b9dc1d5
100644
(file)
--- a/
src/plugins/google-parser.vala
+++ b/
src/plugins/google-parser.vala
@@
-253,7
+253,7
@@
public class GoogleParser : Object {
}
}
}
}
- public GoogleParser (MovieFilter filter, string? location, MovieSource.ReceiveMovieFunction callback) {
+ public GoogleParser (MovieFilter filter, string? location, MovieSource.ReceiveMovieFunction callback, Cancellable? cancellable) {
_get_callback = callback;
_filter = filter;
if (filter.title.chr(filter.title.length, '*') != null) {
_get_callback = callback;
_filter = filter;
if (filter.title.chr(filter.title.length, '*') != null) {
@@
-271,7
+271,7
@@
public class GoogleParser : Object {
char[] buf = new char[256*1024];
size_t nread;
char[] buf = new char[256*1024];
size_t nread;
- bool ok = stream.read_all (buf, buf.length, out nread, null);
+ bool ok = stream.read_all (buf, buf.length, out nread, cancellable);
buf[nread] = 0;
parse (ref buf);
buf[nread] = 0;
parse (ref buf);
diff --git
a/src/plugins/google-plugin.vala
b/src/plugins/google-plugin.vala
index
2b88eef
..
7a165f1
100644
(file)
--- a/
src/plugins/google-plugin.vala
+++ b/
src/plugins/google-plugin.vala
@@
-74,8
+74,8
@@
class GoogleSource : MovieSource {
public string location;
public string description;
public string location;
public string description;
- public override void get_movies (MovieFilter filter, MovieSource.ReceiveMovieFunction callback, int limit) {
- var parser = new GoogleParser (filter, location, callback);
+ public override void get_movies (MovieFilter filter, MovieSource.ReceiveMovieFunction callback, int limit, Cancellable? cancellable) {
+ var parser = new GoogleParser (filter, location, callback, cancellable);
}
public override void add_movie (Movie movie) {
}
public override void add_movie (Movie movie) {
diff --git
a/src/plugins/imdb-plugin.vala
b/src/plugins/imdb-plugin.vala
index
8c82ccd
..
e9cf4f9
100644
(file)
--- a/
src/plugins/imdb-plugin.vala
+++ b/
src/plugins/imdb-plugin.vala
@@
-125,7
+125,7
@@
class IMDbPlugin : Plugin {
class IMDBSource : MovieSource {
MovieSource.ReceiveMovieFunction _get_callback;
class IMDBSource : MovieSource {
MovieSource.ReceiveMovieFunction _get_callback;
- public override void get_movies (MovieFilter filter, MovieSource.ReceiveMovieFunction callback, int limit) {
+ public override void get_movies (MovieFilter filter, MovieSource.ReceiveMovieFunction callback, int limit, Cancellable? cancellable) {
// IMDb has too many movies
if (filter.title == "")
return;
// IMDb has too many movies
if (filter.title == "")
return;