Branch data Line data Source code
1 : : #include <glib-object.h>
2 : :
3 : : typedef struct {
4 : : GObject instance;
5 : : } MyObj;
6 : :
7 : : typedef struct {
8 : : GObjectClass parent_class;
9 : : } MyObjClass;
10 : :
11 : : enum {
12 : : SIGNAL1,
13 : : SIGNAL2,
14 : : LAST_SIGNAL
15 : : };
16 : :
17 : : guint signals[LAST_SIGNAL];
18 : :
19 : : GType my_obj_get_type (void);
20 : :
21 [ + + + - : 10 : G_DEFINE_TYPE (MyObj, my_obj, G_TYPE_OBJECT)
+ + ]
22 : :
23 : : static void
24 : 8 : my_obj_init (MyObj *o)
25 : : {
26 : 8 : }
27 : :
28 : : static void
29 : 1 : my_obj_class_init (MyObjClass *class)
30 : : {
31 : 1 : signals[SIGNAL1] =
32 : 1 : g_signal_new ("signal1",
33 : : G_TYPE_FROM_CLASS (class),
34 : : G_SIGNAL_RUN_LAST,
35 : : 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
36 : 1 : signals[SIGNAL2] =
37 : 1 : g_signal_new ("signal2",
38 : : G_TYPE_FROM_CLASS (class),
39 : : G_SIGNAL_RUN_LAST,
40 : : 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
41 : 1 : }
42 : :
43 : : static void
44 : 0 : nop (void)
45 : : {
46 : 0 : }
47 : :
48 : : static guint n_handlers = 0;
49 : :
50 : : static void
51 : 1 : test_connect_many (void)
52 : : {
53 : : MyObj *o;
54 : : gdouble time_elapsed;
55 : : guint i;
56 : :
57 : 1 : o = g_object_new (my_obj_get_type (), NULL);
58 : :
59 : 1 : g_test_timer_start ();
60 : :
61 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
62 : 1 : g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL);
63 : :
64 : 1 : time_elapsed = g_test_timer_elapsed ();
65 : :
66 : 1 : g_object_unref (o);
67 : :
68 : 1 : g_test_minimized_result (time_elapsed, "connected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
69 : 1 : }
70 : :
71 : : static void
72 : 1 : test_disconnect_many_ordered (void)
73 : : {
74 : : MyObj *o;
75 : : gulong *handlers;
76 : : gdouble time_elapsed;
77 : : guint i;
78 : :
79 : 1 : handlers = g_malloc_n (n_handlers, sizeof (*handlers));
80 : 1 : o = g_object_new (my_obj_get_type (), NULL);
81 : :
82 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
83 : 1 : handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL);
84 : :
85 : 1 : g_test_timer_start ();
86 : :
87 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
88 : 1 : g_signal_handler_disconnect (o, handlers[i]);
89 : :
90 : 1 : time_elapsed = g_test_timer_elapsed ();
91 : :
92 : 1 : g_object_unref (o);
93 : 1 : g_free (handlers);
94 : :
95 : 1 : g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
96 : 1 : }
97 : :
98 : : static void
99 : 1 : test_disconnect_many_inverse (void)
100 : : {
101 : : MyObj *o;
102 : : gulong *handlers;
103 : : gdouble time_elapsed;
104 : : guint i;
105 : :
106 : 1 : handlers = g_malloc_n (n_handlers, sizeof (*handlers));
107 : 1 : o = g_object_new (my_obj_get_type (), NULL);
108 : :
109 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
110 : 1 : handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL);
111 : :
112 : 1 : g_test_timer_start ();
113 : :
114 [ + + ]: 2 : for (i = n_handlers; i > 0; i--)
115 : 1 : g_signal_handler_disconnect (o, handlers[i - 1]);
116 : :
117 : 1 : time_elapsed = g_test_timer_elapsed ();
118 : :
119 : 1 : g_object_unref (o);
120 : 1 : g_free (handlers);
121 : :
122 : 1 : g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
123 : 1 : }
124 : :
125 : : static void
126 : 1 : test_disconnect_many_random (void)
127 : : {
128 : : MyObj *o;
129 : : gulong *handlers;
130 : : gulong id;
131 : : gdouble time_elapsed;
132 : : guint i, j;
133 : :
134 : 1 : handlers = g_malloc_n (n_handlers, sizeof (*handlers));
135 : 1 : o = g_object_new (my_obj_get_type (), NULL);
136 : :
137 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
138 : 1 : handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL);
139 : :
140 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
141 : : {
142 : 1 : j = g_test_rand_int_range (0, n_handlers);
143 : 1 : id = handlers[i];
144 : 1 : handlers[i] = handlers[j];
145 : 1 : handlers[j] = id;
146 : : }
147 : :
148 : 1 : g_test_timer_start ();
149 : :
150 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
151 : 1 : g_signal_handler_disconnect (o, handlers[i]);
152 : :
153 : 1 : time_elapsed = g_test_timer_elapsed ();
154 : :
155 : 1 : g_object_unref (o);
156 : 1 : g_free (handlers);
157 : :
158 : 1 : g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
159 : 1 : }
160 : :
161 : : static void
162 : 1 : test_disconnect_2_signals (void)
163 : : {
164 : : MyObj *o;
165 : : gulong *handlers;
166 : : gulong id;
167 : : gdouble time_elapsed;
168 : : guint i, j;
169 : :
170 : 1 : handlers = g_malloc_n (n_handlers, sizeof (*handlers));
171 : 1 : o = g_object_new (my_obj_get_type (), NULL);
172 : :
173 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
174 : : {
175 [ + - ]: 1 : if (i % 2 == 0)
176 : 1 : handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL);
177 : : else
178 : 0 : handlers[i] = g_signal_connect (o, "signal2", G_CALLBACK (nop), NULL);
179 : : }
180 : :
181 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
182 : : {
183 : 1 : j = g_test_rand_int_range (0, n_handlers);
184 : 1 : id = handlers[i];
185 : 1 : handlers[i] = handlers[j];
186 : 1 : handlers[j] = id;
187 : : }
188 : :
189 : 1 : g_test_timer_start ();
190 : :
191 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
192 : 1 : g_signal_handler_disconnect (o, handlers[i]);
193 : :
194 : 1 : time_elapsed = g_test_timer_elapsed ();
195 : :
196 : 1 : g_object_unref (o);
197 : 1 : g_free (handlers);
198 : :
199 : 1 : g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
200 : 1 : }
201 : :
202 : : static void
203 : 1 : test_disconnect_2_objects (void)
204 : : {
205 : : MyObj *o1, *o2, *o;
206 : : gulong *handlers;
207 : : MyObj **objects;
208 : : gulong id;
209 : : gdouble time_elapsed;
210 : : guint i, j;
211 : :
212 : 1 : handlers = g_malloc_n (n_handlers, sizeof (*handlers));
213 : 1 : objects = g_malloc_n (n_handlers, sizeof (*objects));
214 : 1 : o1 = g_object_new (my_obj_get_type (), NULL);
215 : 1 : o2 = g_object_new (my_obj_get_type (), NULL);
216 : :
217 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
218 : : {
219 [ + - ]: 1 : if (i % 2 == 0)
220 : : {
221 : 1 : handlers[i] = g_signal_connect (o1, "signal1", G_CALLBACK (nop), NULL);
222 : 1 : objects[i] = o1;
223 : : }
224 : : else
225 : : {
226 : 0 : handlers[i] = g_signal_connect (o2, "signal1", G_CALLBACK (nop), NULL);
227 : 0 : objects[i] = o2;
228 : : }
229 : : }
230 : :
231 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
232 : : {
233 : 1 : j = g_test_rand_int_range (0, n_handlers);
234 : 1 : id = handlers[i];
235 : 1 : handlers[i] = handlers[j];
236 : 1 : handlers[j] = id;
237 : 1 : o = objects[i];
238 : 1 : objects[i] = objects[j];
239 : 1 : objects[j] = o;
240 : : }
241 : :
242 : 1 : g_test_timer_start ();
243 : :
244 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
245 : 1 : g_signal_handler_disconnect (objects[i], handlers[i]);
246 : :
247 : 1 : time_elapsed = g_test_timer_elapsed ();
248 : :
249 : 1 : g_object_unref (o1);
250 : 1 : g_object_unref (o2);
251 : 1 : g_free (objects);
252 : 1 : g_free (handlers);
253 : :
254 : 1 : g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
255 : 1 : }
256 : :
257 : : static void
258 : 1 : test_block_many (void)
259 : : {
260 : : MyObj *o;
261 : : gulong *handlers;
262 : : gulong id;
263 : : gdouble time_elapsed;
264 : : guint i, j;
265 : :
266 : 1 : handlers = g_malloc_n (n_handlers, sizeof (*handlers));
267 : 1 : o = g_object_new (my_obj_get_type (), NULL);
268 : :
269 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
270 : 1 : handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL);
271 : :
272 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
273 : : {
274 : 1 : j = g_test_rand_int_range (0, n_handlers);
275 : 1 : id = handlers[i];
276 : 1 : handlers[i] = handlers[j];
277 : 1 : handlers[j] = id;
278 : : }
279 : :
280 : 1 : g_test_timer_start ();
281 : :
282 [ + + ]: 2 : for (i = 0; i < n_handlers; i++)
283 : 1 : g_signal_handler_block (o, handlers[i]);
284 : :
285 [ + + ]: 2 : for (i = n_handlers; i > 0; i--)
286 : 1 : g_signal_handler_unblock (o, handlers[i - 1]);
287 : :
288 : 1 : time_elapsed = g_test_timer_elapsed ();
289 : :
290 : 1 : g_object_unref (o);
291 : 1 : g_free (handlers);
292 : :
293 : 1 : g_test_minimized_result (time_elapsed, "blocked and unblocked %u handlers in %6.3f seconds", n_handlers, time_elapsed);
294 : 1 : }
295 : :
296 : : int
297 : 1 : main (int argc, char *argv[])
298 : : {
299 : 1 : g_test_init (&argc, &argv, NULL);
300 : :
301 [ - + ]: 1 : n_handlers = g_test_perf () ? 500000 : 1;
302 : :
303 : 1 : g_test_add_func ("/signal/handler/connect-many", test_connect_many);
304 : 1 : g_test_add_func ("/signal/handler/disconnect-many-ordered", test_disconnect_many_ordered);
305 : 1 : g_test_add_func ("/signal/handler/disconnect-many-inverse", test_disconnect_many_inverse);
306 : 1 : g_test_add_func ("/signal/handler/disconnect-many-random", test_disconnect_many_random);
307 : 1 : g_test_add_func ("/signal/handler/disconnect-2-signals", test_disconnect_2_signals);
308 : 1 : g_test_add_func ("/signal/handler/disconnect-2-objects", test_disconnect_2_objects);
309 : 1 : g_test_add_func ("/signal/handler/block-many", test_block_many);
310 : :
311 : 1 : return g_test_run ();
312 : : }
|