140
140
worker_thread(gpointer data, gpointer bogus)
142
142
gchar *filename = (gchar *) data;
143
RS_FILETYPE *filetype = NULL;
144
143
RS_PHOTO *photo = NULL;
146
if ((filetype = rs_filetype_get(filename, TRUE)))
145
photo = rs_photo_load_from_file(filename, TRUE);
148
photo = filetype->load(filename, TRUE);
152
size_t footprint = rs_image16_get_footprint(photo->input);
153
RS_PRELOADED *p = g_new0(RS_PRELOADED, 1);
154
p->filename = filename;
155
p->image = photo->input;
156
PRELOAD_DEBUG("\033[34mPreloading %s\033[0m\n", filename);
157
photo->input = NULL; /* EVIL hack to avoid freeing in rs_photo_free() */
158
g_object_unref(photo);
160
g_static_mutex_lock(&queue_lock);
161
g_static_mutex_lock(&preloaded_lock);
163
while((preloaded_memory_in_use + footprint) > max_memory)
165
preloaded_memory_in_use += footprint;
167
/* Move from queue to preloaded */
168
if ((q = g_list_find_custom(queue, filename, g_list_str_equal)))
169
queue = g_list_remove_link(queue, q);
170
preloaded = g_list_prepend(preloaded, p);
172
g_static_mutex_unlock(&preloaded_lock);
173
g_static_mutex_unlock(&queue_lock);
175
/* Calculate average image size */
176
g_static_mutex_lock(&average_size_lock);
177
if (average_size == 0)
178
average_size = footprint;
180
average_size = (average_size+footprint+1)/2;
181
g_static_mutex_unlock(&average_size_lock);
149
size_t footprint = rs_image16_get_footprint(photo->input);
150
RS_PRELOADED *p = g_new0(RS_PRELOADED, 1);
151
p->filename = filename;
152
p->image = photo->input;
153
PRELOAD_DEBUG("\033[34mPreloading %s\033[0m\n", filename);
154
photo->input = NULL; /* EVIL hack to avoid freeing in rs_photo_free() */
155
g_object_unref(photo);
157
g_static_mutex_lock(&queue_lock);
158
g_static_mutex_lock(&preloaded_lock);
160
while((preloaded_memory_in_use + footprint) > max_memory)
162
preloaded_memory_in_use += footprint;
164
/* Move from queue to preloaded */
165
if ((q = g_list_find_custom(queue, filename, g_list_str_equal)))
166
queue = g_list_remove_link(queue, q);
167
preloaded = g_list_prepend(preloaded, p);
169
g_static_mutex_unlock(&preloaded_lock);
170
g_static_mutex_unlock(&queue_lock);
172
/* Calculate average image size */
173
g_static_mutex_lock(&average_size_lock);
174
if (average_size == 0)
175
average_size = footprint;
177
average_size = (average_size+footprint+1)/2;
178
g_static_mutex_unlock(&average_size_lock);
184
180
PRELOAD_DEBUG("\033[33m[%zd/%zdMB used] [%d tasks unprocessed] [%zdMB avg]\033[0m\n", preloaded_memory_in_use/(1024*1024), max_memory/(1024*1024), g_thread_pool_unprocessed(pool), average_size/(1024*1024));