Tizen 2.1 base
[platform/upstream/gcd.git] / dispatch-1.0 / testing / dispatch_group.c
1 /*
2  * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
3  *
4  * @APPLE_APACHE_LICENSE_HEADER_START@
5  * 
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  * 
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  * 
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  * 
18  * @APPLE_APACHE_LICENSE_HEADER_END@
19  */
20
21 #include "config/config.h"
22
23 #include <dispatch/dispatch.h>
24 #include <unistd.h>
25 #include <stdarg.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <assert.h>
29
30 #include "dispatch_test.h"
31
32 #ifndef NSEC_PER_SEC
33 #define NSEC_PER_SEC 1000000000
34 #endif
35
36 dispatch_group_t
37 create_group(size_t count, int delay)
38 {
39         size_t i;
40
41         dispatch_group_t group = dispatch_group_create();
42
43         for (i = 0; i < count; ++i) {
44                 dispatch_queue_t queue = dispatch_queue_create(NULL, NULL);
45                 assert(queue);
46
47                 dispatch_group_async(group, queue, ^{
48                         if (delay) {
49                                 fprintf(stderr, "sleeping...\n");
50                                 sleep(delay);
51                                 fprintf(stderr, "done.\n");
52                         }
53                 });
54
55                 dispatch_release(queue);
56         }
57         return group;
58 }
59
60 int
61 main(void)
62 {
63         long res;
64
65         test_start("Dispatch Group");
66
67         dispatch_group_t group;
68
69         group = create_group(100, 0);
70         test_ptr_notnull("dispatch_group_async", group);
71
72         dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
73         
74         // should be OK to re-use a group
75         dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{});
76         dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
77
78         dispatch_release(group);
79         group = NULL;
80         
81         group = create_group(3, 7);
82         test_ptr_notnull("dispatch_group_async", group);
83
84         res = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5ull * NSEC_PER_SEC));
85         test_long("dispatch_group_wait", !res, 0);
86
87         // retry after timeout (this time succeed)
88         res = dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, 5ull * NSEC_PER_SEC));
89         test_long("dispatch_group_wait", res, 0);
90
91         dispatch_release(group);
92         group = NULL;
93
94         group = create_group(100, 0);
95         test_ptr_notnull("dispatch_group_async", group);
96
97         dispatch_group_notify(group, dispatch_get_main_queue(), ^{
98                 dispatch_queue_t m = dispatch_get_main_queue();
99                 dispatch_queue_t c = dispatch_get_current_queue();
100                 test_ptr("Notification Received", m, c);
101                 test_stop();
102         });
103         
104         dispatch_release(group);
105         group = NULL;
106
107         dispatch_main();
108
109         return 0;
110 }