42 static pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;
43 static pthread_cond_t
cond = PTHREAD_COND_INITIALIZER;
54 ScanRequest * request = g_slice_new0 (ScanRequest);
56 request->filename =
str_get (filename);
57 request->flags = flags;
58 request->decoder = decoder;
59 request->callback = callback;
61 pthread_mutex_lock (&
mutex);
63 g_queue_push_tail (&
requests, request);
64 pthread_cond_signal (&
cond);
66 pthread_mutex_unlock (&
mutex);
76 free (request->image_data);
77 free (request->image_file);
78 g_slice_free (ScanRequest, request);
83 pthread_mutex_lock (&
mutex);
87 ScanRequest * request = g_queue_pop_head (&
requests);
95 pthread_mutex_unlock (&
mutex);
97 if (! request->decoder)
100 if (request->decoder && (request->flags &
SCAN_TUPLE))
101 request->tuple =
file_read_tuple (request->filename, request->decoder);
103 if (request->decoder && (request->flags &
SCAN_IMAGE))
106 & request->image_data, & request->image_len);
108 if (! request->image_data)
112 request->callback (request);
115 pthread_mutex_lock (&
mutex);
118 pthread_mutex_unlock (&
mutex);
124 return request->filename;
129 return request->decoder;
134 Tuple * tuple = request->tuple;
135 request->tuple =
NULL;
141 * data = request->image_data;
142 * len = request->image_len;
143 request->image_data =
NULL;
144 request->image_len = 0;
149 char * image_file = request->image_file;
150 request->image_file =
NULL;
162 pthread_mutex_lock (&
mutex);
165 pthread_cond_broadcast (&
cond);
167 pthread_mutex_unlock (&
mutex);
172 ScanRequest * request;
173 while ((request = g_queue_pop_head (&
requests)))