sl@0
|
1 |
/* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
|
sl@0
|
2 |
#undef G_DISABLE_ASSERT
|
sl@0
|
3 |
#undef G_LOG_DOMAIN
|
sl@0
|
4 |
|
sl@0
|
5 |
|
sl@0
|
6 |
#include <errno.h>
|
sl@0
|
7 |
#include <glib.h>
|
sl@0
|
8 |
|
sl@0
|
9 |
#ifdef G_OS_UNIX
|
sl@0
|
10 |
#include <unistd.h>
|
sl@0
|
11 |
#endif
|
sl@0
|
12 |
#include <stdio.h>
|
sl@0
|
13 |
#include <stdlib.h>
|
sl@0
|
14 |
|
sl@0
|
15 |
#ifdef G_OS_WIN32
|
sl@0
|
16 |
#include <fcntl.h> /* For _O_BINARY used by pipe() macro */
|
sl@0
|
17 |
#include <io.h> /* for _pipe() */
|
sl@0
|
18 |
#endif
|
sl@0
|
19 |
|
sl@0
|
20 |
|
sl@0
|
21 |
|
sl@0
|
22 |
#ifdef SYMBIAN
|
sl@0
|
23 |
#include <glib_global.h>
|
sl@0
|
24 |
#include "mrt2_glib2_test.h"
|
sl@0
|
25 |
#endif /*SYMBIAN*/
|
sl@0
|
26 |
|
sl@0
|
27 |
|
sl@0
|
28 |
#define ITERS 10
|
sl@0
|
29 |
#define INCREMENT 10
|
sl@0
|
30 |
#define NTHREADS 4
|
sl@0
|
31 |
#define NCRAWLERS 4
|
sl@0
|
32 |
#define CRAWLER_TIMEOUT_RANGE 40
|
sl@0
|
33 |
#define RECURSER_TIMEOUT 50
|
sl@0
|
34 |
|
sl@0
|
35 |
/* The partial ordering between the context array mutex and
|
sl@0
|
36 |
* crawler array mutex is that the crawler array mutex cannot
|
sl@0
|
37 |
* be locked while the context array mutex is locked
|
sl@0
|
38 |
*/
|
sl@0
|
39 |
GPtrArray *context_array;
|
sl@0
|
40 |
GMutex *context_array_mutex;
|
sl@0
|
41 |
GCond *context_array_cond;
|
sl@0
|
42 |
|
sl@0
|
43 |
GMainLoop *main_loop;
|
sl@0
|
44 |
|
sl@0
|
45 |
G_LOCK_DEFINE_STATIC (crawler_array_lock);
|
sl@0
|
46 |
GPtrArray *crawler_array;
|
sl@0
|
47 |
|
sl@0
|
48 |
typedef struct _AddrData AddrData;
|
sl@0
|
49 |
typedef struct _TestData TestData;
|
sl@0
|
50 |
|
sl@0
|
51 |
struct _AddrData
|
sl@0
|
52 |
{
|
sl@0
|
53 |
GMainLoop *loop;
|
sl@0
|
54 |
GIOChannel *dest;
|
sl@0
|
55 |
gint count;
|
sl@0
|
56 |
};
|
sl@0
|
57 |
|
sl@0
|
58 |
struct _TestData
|
sl@0
|
59 |
{
|
sl@0
|
60 |
gint current_val;
|
sl@0
|
61 |
gint iters;
|
sl@0
|
62 |
GIOChannel *in;
|
sl@0
|
63 |
};
|
sl@0
|
64 |
|
sl@0
|
65 |
static void cleanup_crawlers (GMainContext *context);
|
sl@0
|
66 |
|
sl@0
|
67 |
gboolean
|
sl@0
|
68 |
read_all (GIOChannel *channel, char *buf, gsize len)
|
sl@0
|
69 |
{
|
sl@0
|
70 |
gsize bytes_read = 0;
|
sl@0
|
71 |
gsize count;
|
sl@0
|
72 |
GIOError err;
|
sl@0
|
73 |
|
sl@0
|
74 |
while (bytes_read < len)
|
sl@0
|
75 |
{
|
sl@0
|
76 |
err = g_io_channel_read (channel, buf + bytes_read, len - bytes_read, &count);
|
sl@0
|
77 |
if (err)
|
sl@0
|
78 |
{
|
sl@0
|
79 |
if (err != G_IO_ERROR_AGAIN)
|
sl@0
|
80 |
g_assert(FALSE && "mainloop-test failed");
|
sl@0
|
81 |
return FALSE;
|
sl@0
|
82 |
}
|
sl@0
|
83 |
else if (count == 0)
|
sl@0
|
84 |
return FALSE;
|
sl@0
|
85 |
|
sl@0
|
86 |
bytes_read += count;
|
sl@0
|
87 |
}
|
sl@0
|
88 |
|
sl@0
|
89 |
return TRUE;
|
sl@0
|
90 |
}
|
sl@0
|
91 |
|
sl@0
|
92 |
gboolean
|
sl@0
|
93 |
write_all (GIOChannel *channel, char *buf, gsize len)
|
sl@0
|
94 |
{
|
sl@0
|
95 |
gsize bytes_written = 0;
|
sl@0
|
96 |
gsize count;
|
sl@0
|
97 |
GIOError err;
|
sl@0
|
98 |
|
sl@0
|
99 |
while (bytes_written < len)
|
sl@0
|
100 |
{
|
sl@0
|
101 |
err = g_io_channel_write (channel, buf + bytes_written, len - bytes_written, &count);
|
sl@0
|
102 |
if (err && err != G_IO_ERROR_AGAIN)
|
sl@0
|
103 |
return FALSE;
|
sl@0
|
104 |
|
sl@0
|
105 |
bytes_written += count;
|
sl@0
|
106 |
}
|
sl@0
|
107 |
|
sl@0
|
108 |
return TRUE;
|
sl@0
|
109 |
}
|
sl@0
|
110 |
|
sl@0
|
111 |
gboolean
|
sl@0
|
112 |
adder_callback (GIOChannel *source,
|
sl@0
|
113 |
GIOCondition condition,
|
sl@0
|
114 |
gpointer data)
|
sl@0
|
115 |
{
|
sl@0
|
116 |
char buf1[32];
|
sl@0
|
117 |
char buf2[32];
|
sl@0
|
118 |
|
sl@0
|
119 |
char result[32];
|
sl@0
|
120 |
|
sl@0
|
121 |
AddrData *addr_data = data;
|
sl@0
|
122 |
|
sl@0
|
123 |
if (!read_all (source, buf1, 32) ||
|
sl@0
|
124 |
!read_all (source, buf2, 32))
|
sl@0
|
125 |
{
|
sl@0
|
126 |
g_main_loop_quit (addr_data->loop);
|
sl@0
|
127 |
return FALSE;
|
sl@0
|
128 |
}
|
sl@0
|
129 |
|
sl@0
|
130 |
sprintf (result, "%d", atoi(buf1) + atoi(buf2));
|
sl@0
|
131 |
write_all (addr_data->dest, result, 32);
|
sl@0
|
132 |
|
sl@0
|
133 |
return TRUE;
|
sl@0
|
134 |
}
|
sl@0
|
135 |
|
sl@0
|
136 |
gboolean
|
sl@0
|
137 |
timeout_callback (gpointer data)
|
sl@0
|
138 |
{
|
sl@0
|
139 |
AddrData *addr_data = data;
|
sl@0
|
140 |
|
sl@0
|
141 |
addr_data->count++;
|
sl@0
|
142 |
|
sl@0
|
143 |
return TRUE;
|
sl@0
|
144 |
}
|
sl@0
|
145 |
|
sl@0
|
146 |
gpointer
|
sl@0
|
147 |
adder_thread (gpointer data)
|
sl@0
|
148 |
{
|
sl@0
|
149 |
GMainContext *context;
|
sl@0
|
150 |
GSource *adder_source;
|
sl@0
|
151 |
GSource *timeout_source;
|
sl@0
|
152 |
|
sl@0
|
153 |
GIOChannel **channels = data;
|
sl@0
|
154 |
AddrData addr_data;
|
sl@0
|
155 |
|
sl@0
|
156 |
context = g_main_context_new ();
|
sl@0
|
157 |
|
sl@0
|
158 |
g_assert(context != NULL);
|
sl@0
|
159 |
|
sl@0
|
160 |
g_mutex_lock (context_array_mutex);
|
sl@0
|
161 |
|
sl@0
|
162 |
g_ptr_array_add (context_array, context);
|
sl@0
|
163 |
|
sl@0
|
164 |
if (context_array->len == NTHREADS)
|
sl@0
|
165 |
g_cond_broadcast (context_array_cond);
|
sl@0
|
166 |
|
sl@0
|
167 |
g_mutex_unlock (context_array_mutex);
|
sl@0
|
168 |
|
sl@0
|
169 |
addr_data.dest = channels[1];
|
sl@0
|
170 |
addr_data.loop = g_main_loop_new (context, FALSE);
|
sl@0
|
171 |
addr_data.count = 0;
|
sl@0
|
172 |
|
sl@0
|
173 |
adder_source = g_io_create_watch (channels[0], G_IO_IN | G_IO_HUP);
|
sl@0
|
174 |
|
sl@0
|
175 |
g_assert(adder_source != NULL);
|
sl@0
|
176 |
|
sl@0
|
177 |
g_source_set_callback (adder_source, (GSourceFunc)adder_callback, &addr_data, NULL);
|
sl@0
|
178 |
g_source_attach (adder_source, context);
|
sl@0
|
179 |
g_source_unref (adder_source);
|
sl@0
|
180 |
|
sl@0
|
181 |
timeout_source = g_timeout_source_new (10);
|
sl@0
|
182 |
|
sl@0
|
183 |
g_assert(timeout_source != NULL);
|
sl@0
|
184 |
|
sl@0
|
185 |
g_source_set_callback (timeout_source, (GSourceFunc)timeout_callback, &addr_data, NULL);
|
sl@0
|
186 |
g_source_set_priority (timeout_source, G_PRIORITY_HIGH);
|
sl@0
|
187 |
g_source_attach (timeout_source, context);
|
sl@0
|
188 |
g_source_unref (timeout_source);
|
sl@0
|
189 |
|
sl@0
|
190 |
g_main_loop_run (addr_data.loop);
|
sl@0
|
191 |
|
sl@0
|
192 |
g_io_channel_unref (channels[0]);
|
sl@0
|
193 |
g_io_channel_unref (channels[1]);
|
sl@0
|
194 |
|
sl@0
|
195 |
g_free (channels);
|
sl@0
|
196 |
|
sl@0
|
197 |
g_main_loop_unref (addr_data.loop);
|
sl@0
|
198 |
|
sl@0
|
199 |
#ifdef VERBOSE
|
sl@0
|
200 |
g_print ("Timeout run %d times\n", addr_data.count);
|
sl@0
|
201 |
#endif
|
sl@0
|
202 |
|
sl@0
|
203 |
g_mutex_lock (context_array_mutex);
|
sl@0
|
204 |
g_ptr_array_remove (context_array, context);
|
sl@0
|
205 |
if (context_array->len == 0)
|
sl@0
|
206 |
g_main_loop_quit (main_loop);
|
sl@0
|
207 |
g_mutex_unlock (context_array_mutex);
|
sl@0
|
208 |
|
sl@0
|
209 |
cleanup_crawlers (context);
|
sl@0
|
210 |
|
sl@0
|
211 |
return NULL;
|
sl@0
|
212 |
}
|
sl@0
|
213 |
|
sl@0
|
214 |
|
sl@0
|
215 |
void
|
sl@0
|
216 |
io_pipe (GIOChannel **channels)
|
sl@0
|
217 |
{
|
sl@0
|
218 |
gint fds[2];
|
sl@0
|
219 |
|
sl@0
|
220 |
if (pipe(fds) < 0)
|
sl@0
|
221 |
{
|
sl@0
|
222 |
g_warning ("Cannot create pipe %s\n", g_strerror (errno));
|
sl@0
|
223 |
|
sl@0
|
224 |
g_assert(FALSE && "mainloop-test failed");
|
sl@0
|
225 |
|
sl@0
|
226 |
exit (1);
|
sl@0
|
227 |
}
|
sl@0
|
228 |
|
sl@0
|
229 |
channels[0] = g_io_channel_unix_new (fds[0]);
|
sl@0
|
230 |
channels[1] = g_io_channel_unix_new (fds[1]);
|
sl@0
|
231 |
|
sl@0
|
232 |
g_io_channel_set_close_on_unref (channels[0], TRUE);
|
sl@0
|
233 |
g_io_channel_set_close_on_unref (channels[1], TRUE);
|
sl@0
|
234 |
}
|
sl@0
|
235 |
|
sl@0
|
236 |
void
|
sl@0
|
237 |
do_add (GIOChannel *in, gint a, gint b)
|
sl@0
|
238 |
{
|
sl@0
|
239 |
char buf1[32];
|
sl@0
|
240 |
char buf2[32];
|
sl@0
|
241 |
|
sl@0
|
242 |
sprintf (buf1, "%d", a);
|
sl@0
|
243 |
sprintf (buf2, "%d", b);
|
sl@0
|
244 |
|
sl@0
|
245 |
write_all (in, buf1, 32);
|
sl@0
|
246 |
write_all (in, buf2, 32);
|
sl@0
|
247 |
}
|
sl@0
|
248 |
|
sl@0
|
249 |
gboolean
|
sl@0
|
250 |
adder_response (GIOChannel *source,
|
sl@0
|
251 |
GIOCondition condition,
|
sl@0
|
252 |
gpointer data)
|
sl@0
|
253 |
{
|
sl@0
|
254 |
char result[32];
|
sl@0
|
255 |
TestData *test_data = data;
|
sl@0
|
256 |
|
sl@0
|
257 |
if (!read_all (source, result, 32))
|
sl@0
|
258 |
return FALSE;
|
sl@0
|
259 |
|
sl@0
|
260 |
test_data->current_val = atoi (result);
|
sl@0
|
261 |
test_data->iters--;
|
sl@0
|
262 |
|
sl@0
|
263 |
if (test_data->iters == 0)
|
sl@0
|
264 |
{
|
sl@0
|
265 |
if (test_data->current_val != ITERS * INCREMENT)
|
sl@0
|
266 |
{
|
sl@0
|
267 |
g_print ("Addition failed: %d != %d\n",
|
sl@0
|
268 |
test_data->current_val, ITERS * INCREMENT);
|
sl@0
|
269 |
|
sl@0
|
270 |
g_assert(FALSE && "mainloop-test failed");
|
sl@0
|
271 |
|
sl@0
|
272 |
exit (1);
|
sl@0
|
273 |
}
|
sl@0
|
274 |
|
sl@0
|
275 |
g_io_channel_unref (source);
|
sl@0
|
276 |
g_io_channel_unref (test_data->in);
|
sl@0
|
277 |
|
sl@0
|
278 |
g_free (test_data);
|
sl@0
|
279 |
|
sl@0
|
280 |
return FALSE;
|
sl@0
|
281 |
}
|
sl@0
|
282 |
|
sl@0
|
283 |
do_add (test_data->in, test_data->current_val, INCREMENT);
|
sl@0
|
284 |
|
sl@0
|
285 |
return TRUE;
|
sl@0
|
286 |
}
|
sl@0
|
287 |
|
sl@0
|
288 |
void
|
sl@0
|
289 |
create_adder_thread (void)
|
sl@0
|
290 |
{
|
sl@0
|
291 |
GError *err = NULL;
|
sl@0
|
292 |
TestData *test_data;
|
sl@0
|
293 |
GThread *thread;
|
sl@0
|
294 |
|
sl@0
|
295 |
GIOChannel *in_channels[2];
|
sl@0
|
296 |
GIOChannel *out_channels[2];
|
sl@0
|
297 |
|
sl@0
|
298 |
GIOChannel **sub_channels;
|
sl@0
|
299 |
|
sl@0
|
300 |
sub_channels = g_new (GIOChannel *, 2);
|
sl@0
|
301 |
|
sl@0
|
302 |
io_pipe (in_channels);
|
sl@0
|
303 |
io_pipe (out_channels);
|
sl@0
|
304 |
|
sl@0
|
305 |
sub_channels[0] = in_channels[0];
|
sl@0
|
306 |
sub_channels[1] = out_channels[1];
|
sl@0
|
307 |
|
sl@0
|
308 |
g_thread_create (adder_thread, sub_channels, FALSE, &err);
|
sl@0
|
309 |
|
sl@0
|
310 |
if (err)
|
sl@0
|
311 |
{
|
sl@0
|
312 |
g_warning ("Cannot create thread: %s", err->message);
|
sl@0
|
313 |
|
sl@0
|
314 |
g_assert(FALSE && "mainloop-test failed");
|
sl@0
|
315 |
|
sl@0
|
316 |
exit (1);
|
sl@0
|
317 |
}
|
sl@0
|
318 |
|
sl@0
|
319 |
test_data = g_new (TestData, 1);
|
sl@0
|
320 |
test_data->in = in_channels[1];
|
sl@0
|
321 |
test_data->current_val = 0;
|
sl@0
|
322 |
test_data->iters = ITERS;
|
sl@0
|
323 |
|
sl@0
|
324 |
g_io_add_watch (out_channels[0], G_IO_IN | G_IO_HUP,
|
sl@0
|
325 |
adder_response, test_data);
|
sl@0
|
326 |
|
sl@0
|
327 |
do_add (test_data->in, test_data->current_val, INCREMENT);
|
sl@0
|
328 |
}
|
sl@0
|
329 |
|
sl@0
|
330 |
static void create_crawler (void);
|
sl@0
|
331 |
|
sl@0
|
332 |
static void
|
sl@0
|
333 |
remove_crawler (void)
|
sl@0
|
334 |
{
|
sl@0
|
335 |
GSource *other_source;
|
sl@0
|
336 |
|
sl@0
|
337 |
if (crawler_array->len > 0)
|
sl@0
|
338 |
{
|
sl@0
|
339 |
other_source = crawler_array->pdata[g_random_int_range (0, crawler_array->len)];
|
sl@0
|
340 |
g_source_destroy (other_source);
|
sl@0
|
341 |
g_assert (g_ptr_array_remove_fast (crawler_array, other_source));
|
sl@0
|
342 |
}
|
sl@0
|
343 |
}
|
sl@0
|
344 |
|
sl@0
|
345 |
static gint
|
sl@0
|
346 |
crawler_callback (gpointer data)
|
sl@0
|
347 |
{
|
sl@0
|
348 |
GSource *source = data;
|
sl@0
|
349 |
|
sl@0
|
350 |
G_LOCK (crawler_array_lock);
|
sl@0
|
351 |
|
sl@0
|
352 |
if (!g_ptr_array_remove_fast (crawler_array, source))
|
sl@0
|
353 |
remove_crawler();
|
sl@0
|
354 |
|
sl@0
|
355 |
remove_crawler();
|
sl@0
|
356 |
G_UNLOCK (crawler_array_lock);
|
sl@0
|
357 |
|
sl@0
|
358 |
create_crawler();
|
sl@0
|
359 |
//create_crawler();
|
sl@0
|
360 |
|
sl@0
|
361 |
return FALSE;
|
sl@0
|
362 |
}
|
sl@0
|
363 |
|
sl@0
|
364 |
static void
|
sl@0
|
365 |
create_crawler (void)
|
sl@0
|
366 |
{
|
sl@0
|
367 |
GSource *source = g_timeout_source_new (g_random_int_range (0, CRAWLER_TIMEOUT_RANGE));
|
sl@0
|
368 |
|
sl@0
|
369 |
g_assert(source != NULL);
|
sl@0
|
370 |
|
sl@0
|
371 |
g_source_set_callback (source, (GSourceFunc)crawler_callback, source, NULL);
|
sl@0
|
372 |
|
sl@0
|
373 |
G_LOCK (crawler_array_lock);
|
sl@0
|
374 |
g_ptr_array_add (crawler_array, source);
|
sl@0
|
375 |
|
sl@0
|
376 |
g_mutex_lock (context_array_mutex);
|
sl@0
|
377 |
if(context_array->len == 0)
|
sl@0
|
378 |
g_source_attach (source, context_array->pdata[0]);
|
sl@0
|
379 |
else
|
sl@0
|
380 |
g_source_attach (source, context_array->pdata[g_random_int_range (0, context_array->len)]);
|
sl@0
|
381 |
g_source_unref (source);
|
sl@0
|
382 |
g_mutex_unlock (context_array_mutex);
|
sl@0
|
383 |
|
sl@0
|
384 |
G_UNLOCK (crawler_array_lock);
|
sl@0
|
385 |
}
|
sl@0
|
386 |
|
sl@0
|
387 |
static void
|
sl@0
|
388 |
cleanup_crawlers (GMainContext *context)
|
sl@0
|
389 |
{
|
sl@0
|
390 |
gint i;
|
sl@0
|
391 |
|
sl@0
|
392 |
G_LOCK (crawler_array_lock);
|
sl@0
|
393 |
for (i=0; i < crawler_array->len; i++)
|
sl@0
|
394 |
{
|
sl@0
|
395 |
if (g_source_get_context (crawler_array->pdata[i]) == context)
|
sl@0
|
396 |
{
|
sl@0
|
397 |
g_source_destroy (g_ptr_array_remove_index (crawler_array, i));
|
sl@0
|
398 |
i--;
|
sl@0
|
399 |
}
|
sl@0
|
400 |
}
|
sl@0
|
401 |
G_UNLOCK (crawler_array_lock);
|
sl@0
|
402 |
}
|
sl@0
|
403 |
|
sl@0
|
404 |
static gboolean
|
sl@0
|
405 |
recurser_idle (gpointer data)
|
sl@0
|
406 |
{
|
sl@0
|
407 |
GMainContext *context = data;
|
sl@0
|
408 |
gint i;
|
sl@0
|
409 |
|
sl@0
|
410 |
for (i = 0; i < 10; i++)
|
sl@0
|
411 |
g_main_context_iteration (context, FALSE);
|
sl@0
|
412 |
|
sl@0
|
413 |
return FALSE;
|
sl@0
|
414 |
}
|
sl@0
|
415 |
|
sl@0
|
416 |
static gboolean
|
sl@0
|
417 |
recurser_start (gpointer data)
|
sl@0
|
418 |
{
|
sl@0
|
419 |
GMainContext *context;
|
sl@0
|
420 |
GSource *source;
|
sl@0
|
421 |
|
sl@0
|
422 |
g_mutex_lock (context_array_mutex);
|
sl@0
|
423 |
|
sl@0
|
424 |
if(context_array->len == 0)
|
sl@0
|
425 |
context = context_array->pdata[0];
|
sl@0
|
426 |
else
|
sl@0
|
427 |
context = context_array->pdata[g_random_int_range (0, context_array->len)];
|
sl@0
|
428 |
source = g_idle_source_new ();
|
sl@0
|
429 |
g_source_set_callback (source, recurser_idle, context, NULL);
|
sl@0
|
430 |
g_source_attach (source, context);
|
sl@0
|
431 |
g_source_unref (source);
|
sl@0
|
432 |
g_mutex_unlock (context_array_mutex);
|
sl@0
|
433 |
|
sl@0
|
434 |
return TRUE;
|
sl@0
|
435 |
}
|
sl@0
|
436 |
|
sl@0
|
437 |
int
|
sl@0
|
438 |
main (int argc,
|
sl@0
|
439 |
char *argv[])
|
sl@0
|
440 |
{
|
sl@0
|
441 |
/* Only run the test, if threads are enabled and a default thread
|
sl@0
|
442 |
implementation is available */
|
sl@0
|
443 |
#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
|
sl@0
|
444 |
gint i;
|
sl@0
|
445 |
|
sl@0
|
446 |
#ifdef SYMBIAN
|
sl@0
|
447 |
g_log_set_handler (NULL, G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
|
sl@0
|
448 |
g_set_print_handler(mrtPrintHandler);
|
sl@0
|
449 |
#endif /*SYMBIAN*/
|
sl@0
|
450 |
#if 0
|
sl@0
|
451 |
g_thread_init (NULL);
|
sl@0
|
452 |
|
sl@0
|
453 |
context_array = g_ptr_array_new ();
|
sl@0
|
454 |
|
sl@0
|
455 |
g_assert(context_array != NULL);
|
sl@0
|
456 |
|
sl@0
|
457 |
context_array_mutex = g_mutex_new ();
|
sl@0
|
458 |
|
sl@0
|
459 |
g_assert(context_array_mutex != NULL);
|
sl@0
|
460 |
|
sl@0
|
461 |
context_array_cond = g_cond_new ();
|
sl@0
|
462 |
|
sl@0
|
463 |
g_assert(context_array_cond != NULL);
|
sl@0
|
464 |
|
sl@0
|
465 |
crawler_array = g_ptr_array_new ();
|
sl@0
|
466 |
|
sl@0
|
467 |
g_assert(crawler_array != NULL);
|
sl@0
|
468 |
|
sl@0
|
469 |
main_loop = g_main_loop_new (NULL, FALSE);
|
sl@0
|
470 |
|
sl@0
|
471 |
g_assert(main_loop != NULL);
|
sl@0
|
472 |
|
sl@0
|
473 |
for (i = 0; i < NTHREADS; i++)
|
sl@0
|
474 |
create_adder_thread ();
|
sl@0
|
475 |
|
sl@0
|
476 |
/* Wait for all threads to start
|
sl@0
|
477 |
*/
|
sl@0
|
478 |
g_mutex_lock (context_array_mutex);
|
sl@0
|
479 |
|
sl@0
|
480 |
if (context_array->len < NTHREADS)
|
sl@0
|
481 |
g_cond_wait (context_array_cond, context_array_mutex);
|
sl@0
|
482 |
|
sl@0
|
483 |
g_mutex_unlock (context_array_mutex);
|
sl@0
|
484 |
|
sl@0
|
485 |
for (i = 0; i < NCRAWLERS; i++)
|
sl@0
|
486 |
create_crawler ();
|
sl@0
|
487 |
|
sl@0
|
488 |
g_timeout_add (RECURSER_TIMEOUT, recurser_start, NULL);
|
sl@0
|
489 |
|
sl@0
|
490 |
g_main_loop_run (main_loop);
|
sl@0
|
491 |
g_main_loop_unref (main_loop);
|
sl@0
|
492 |
#endif
|
sl@0
|
493 |
#endif
|
sl@0
|
494 |
|
sl@0
|
495 |
#ifdef SYMBIAN
|
sl@0
|
496 |
testResultXml("mainloop-test");
|
sl@0
|
497 |
#endif /* EMULATOR */
|
sl@0
|
498 |
|
sl@0
|
499 |
return 0;
|
sl@0
|
500 |
}
|