Mercurial > geeqie
diff src/image-load.c @ 1036:ab24c46aa6e4
load thumbnails with lower priority
TODO: maybe implement an exception for visible thumbnails
author | nadvornik |
---|---|
date | Wed, 03 Sep 2008 21:54:49 +0000 |
parents | 8acc100d5527 |
children | 5fc64d6252e7 |
line wrap: on
line diff
--- a/src/image-load.c Wed Sep 03 21:13:02 2008 +0000 +++ b/src/image-load.c Wed Sep 03 21:54:49 2008 +0000 @@ -701,10 +701,55 @@ /* execution via thread */ static GThreadPool *image_loader_thread_pool = NULL; +static GCond *image_loader_prio_cond = NULL; +static GMutex *image_loader_prio_mutex = NULL; +static gint image_loader_prio_num = 0; + + +static void image_loader_thread_enter_high() +{ + g_mutex_lock(image_loader_prio_mutex); + image_loader_prio_num++; + g_mutex_unlock(image_loader_prio_mutex); +} + +static void image_loader_thread_leave_high() +{ + g_mutex_lock(image_loader_prio_mutex); + image_loader_prio_num--; + if (image_loader_prio_num == 0) g_cond_signal(image_loader_prio_cond); + g_mutex_unlock(image_loader_prio_mutex); +} + +static void image_loader_thread_wait_high() +{ + g_mutex_lock(image_loader_prio_mutex); + while (image_loader_prio_num) + { + g_cond_wait(image_loader_prio_cond, image_loader_prio_mutex); + } + + g_mutex_unlock(image_loader_prio_mutex); +} + + void image_loader_thread_run(gpointer data, gpointer user_data) { ImageLoader *il = data; - gint cont = image_loader_begin(il); + gint cont; + + if (il->idle_priority > G_PRIORITY_DEFAULT_IDLE) + { + /* low prio, wait untill high prio tasks finishes */ + image_loader_thread_wait_high(); + } + else + { + /* high prio */ + image_loader_thread_enter_high(); + } + + cont = image_loader_begin(il); if (!cont && !image_loader_get_pixbuf(il)) { @@ -718,10 +763,21 @@ while (cont && !image_loader_get_is_done(il) && !image_loader_get_stopping(il)) { + if (il->idle_priority > G_PRIORITY_DEFAULT_IDLE) + { + /* low prio, wait untill high prio tasks finishes */ + image_loader_thread_wait_high(); + } cont = image_loader_continue(il); } image_loader_stop_loader(il); + if (il->idle_priority <= G_PRIORITY_DEFAULT_IDLE) + { + /* high prio */ + image_loader_thread_leave_high(); + } + g_mutex_lock(il->data_mutex); il->can_destroy = TRUE; g_cond_signal(il->can_destroy_cond); @@ -743,6 +799,8 @@ if (!image_loader_thread_pool) { image_loader_thread_pool = g_thread_pool_new(image_loader_thread_run, NULL, -1, FALSE, NULL); + image_loader_prio_cond = g_cond_new(); + image_loader_prio_mutex = g_mutex_new(); } il->can_destroy = FALSE; /* ImageLoader can't be freed until image_loader_thread_run finishes */ @@ -828,9 +886,8 @@ { if (!il) return; - g_mutex_lock(il->data_mutex); + if (il->thread) return; /* can't change prio if the thread already runs */ il->idle_priority = priority; - g_mutex_unlock(il->data_mutex); }