85 pthread_mutex_init(&testdata.mutex, NULL); |
103 pthread_mutex_init(&testdata.mutex, NULL); |
86 pthread_cond_init(&testdata.cond, NULL); |
104 pthread_cond_init(&testdata.cond, NULL); |
87 |
105 |
88 UCX_TEST_BEGIN; |
106 UCX_TEST_BEGIN; |
89 |
107 |
|
108 // test sending a single event |
|
109 // the event signals completion in the testdata object |
|
110 // wait up to 10 seconds for completion (it should be instantly) |
|
111 |
90 Event evt; |
112 Event evt; |
91 ZERO(&evt, sizeof(Event)); |
113 ZERO(&evt, sizeof(Event)); |
92 evt.fn = test_event_send_fn; |
114 evt.fn = test_event_send_fn; |
93 evt.cookie = &testdata; |
115 evt.cookie = &testdata; |
94 |
116 |
95 int ret = event_send(h, &evt); |
117 int ret = event_send(h, &evt); |
96 |
118 |
97 // wait for event finish |
119 // wait for event finish |
98 time_t tstart = time(NULL); |
120 testdata_wait_for_completion(&testdata); |
99 while(!testdata.i1) { |
|
100 time_t t = time(NULL); |
|
101 if(t - tstart > 10) { |
|
102 break; |
|
103 } |
|
104 |
|
105 pthread_mutex_lock(&testdata.mutex); |
|
106 pthread_cond_wait(&testdata.cond, &testdata.mutex); |
|
107 pthread_mutex_unlock(&testdata.mutex); |
|
108 } |
|
109 |
121 |
110 UCX_TEST_ASSERT(!ret, "event_send failed"); |
122 UCX_TEST_ASSERT(!ret, "event_send failed"); |
111 UCX_TEST_ASSERT(testdata.i1, "event callback not called"); |
123 UCX_TEST_ASSERT(testdata.i1, "event callback not called"); |
112 UCX_TEST_ASSERT(testdata.i2, "event callback received wrong event handler pointer"); |
124 UCX_TEST_ASSERT(testdata.i2, "event callback received wrong event handler pointer"); |
113 |
125 |
114 UCX_TEST_END; |
126 UCX_TEST_END; |
115 |
127 |
116 pthread_mutex_destroy(&testdata.mutex); |
128 pthread_mutex_destroy(&testdata.mutex); |
117 pthread_cond_destroy(&testdata.cond); |
129 pthread_cond_destroy(&testdata.cond); |
118 |
130 |
119 evhandler_close(ev); |
131 evhandler_shutdown(ev); |
120 } |
132 evhandler_wait_and_destroy(ev); |
|
133 } |
|
134 |
|
135 #define EV_TEST_NUM_EVENTS 2000 |
|
136 |
|
137 static int test_event_send_multi_fn_count(EventHandler *h, Event *event) { |
|
138 EVTest *test = event->cookie; |
|
139 |
|
140 test->i2++; |
|
141 |
|
142 return 0; |
|
143 } |
|
144 |
|
145 static int test_event_send_multi_fn_end(EventHandler *h, Event *event) { |
|
146 EVTest *test = event->cookie; |
|
147 test->i1 = 1; |
|
148 |
|
149 pthread_mutex_lock(&test->mutex); |
|
150 pthread_cond_signal(&test->cond); |
|
151 pthread_mutex_unlock(&test->mutex); |
|
152 |
|
153 return 0; |
|
154 } |
|
155 |
|
156 static int test_event_send_multi_fn1(EventHandler *h, Event *event) { |
|
157 EVTest *test = event->cookie; |
|
158 test->i2 = 0; |
|
159 |
|
160 for(int i=0;i<EV_TEST_NUM_EVENTS;i++) { |
|
161 Event *newevent = malloc(sizeof(Event)); |
|
162 ZERO(newevent, sizeof(Event)); |
|
163 newevent->fn = test_event_send_multi_fn_count; |
|
164 newevent->finish = ev_free_event; |
|
165 newevent->cookie = test; |
|
166 event_send(h, newevent); |
|
167 } |
|
168 |
|
169 Event *finish_event = malloc(sizeof(Event)); |
|
170 ZERO(finish_event, sizeof(Event)); |
|
171 finish_event->fn = test_event_send_multi_fn_end; |
|
172 finish_event->finish = ev_free_event; |
|
173 finish_event->cookie = test; |
|
174 event_send(h, finish_event); |
|
175 |
|
176 return 0; |
|
177 } |
|
178 |
|
179 UCX_TEST(test_event_send_multi) { |
|
180 EventHandlerConfig cfg = { .nthreads = 1}; |
|
181 |
|
182 EVHandler *ev = evhandler_create(&cfg); |
|
183 EventHandler *h = ev_instance(ev); |
|
184 |
|
185 EVTest testdata; |
|
186 ZERO(&testdata, sizeof(EVTest)); |
|
187 testdata.h = h; |
|
188 pthread_mutex_init(&testdata.mutex, NULL); |
|
189 pthread_cond_init(&testdata.cond, NULL); |
|
190 |
|
191 UCX_TEST_BEGIN; |
|
192 |
|
193 // test sending multiple events |
|
194 // the first callback test_event_send_multi_fn1 adds additional |
|
195 // EV_TEST_NUM_EVENTS events to the handler + an additional |
|
196 // finishing event, that notifies completion |
|
197 |
|
198 Event evt; |
|
199 ZERO(&evt, sizeof(Event)); |
|
200 evt.fn = test_event_send_multi_fn1; |
|
201 evt.cookie = &testdata; |
|
202 |
|
203 int ret = event_send(h, &evt); |
|
204 |
|
205 // wait for event finish |
|
206 testdata_wait_for_completion(&testdata); |
|
207 |
|
208 UCX_TEST_ASSERT(!ret, "event_send failed"); |
|
209 UCX_TEST_ASSERT(testdata.i1, "event callback not called"); |
|
210 UCX_TEST_ASSERT(testdata.i2 == EV_TEST_NUM_EVENTS, "event callback received wrong event handler pointer"); |
|
211 |
|
212 UCX_TEST_END; |
|
213 |
|
214 pthread_mutex_destroy(&testdata.mutex); |
|
215 pthread_cond_destroy(&testdata.cond); |
|
216 |
|
217 evhandler_shutdown(ev); |
|
218 evhandler_wait_and_destroy(ev); |
|
219 } |