Apache HTTPD
testpoll.c
Go to the documentation of this file.
1/* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "testutil.h"
18#include "apr_strings.h"
19#include "apr_errno.h"
20#include "apr_general.h"
21#include "apr_lib.h"
22#include "apr_network_io.h"
23#include "apr_poll.h"
24
25#if defined(__linux__)
26#include "arch/unix/apr_private.h"
27#endif
28#ifndef HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT
29#define HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT 0
30#endif
31
32#define SMALL_NUM_SOCKETS 3
33/* We can't use 64 here, because some platforms *ahem* Solaris *ahem* have
34 * a default limit of 64 open file descriptors per process. If we use
35 * 64, the test will fail even though the code is correct.
36 */
37#define LARGE_NUM_SOCKETS 50
38
43
44/* ###: tests surrounded by ifdef OLD_POLL_INTERFACE either need to be
45 * converted to use the pollset interface or removed. */
46
47#ifdef OLD_POLL_INTERFACE
50#endif
51
52/* default_pollset_impl can be overridden temporarily to control
53 * testcases which don't specify an implementation explicitly
54 */
56
59{
60 apr_status_t rv;
61
62 rv = apr_sockaddr_info_get(sa, "127.0.0.1", APR_UNSPEC, port, 0, p);
64
65 rv = apr_socket_create(sock, (*sa)->family, SOCK_DGRAM, 0, p);
67
68 rv = apr_socket_bind((*sock), (*sa));
70}
71
72#ifdef OLD_POLL_INTERFACE
73static void check_sockets(const apr_pollfd_t *pollarray,
75 abts_case *tc)
76{
77 apr_status_t rv;
79 char *str;
80
84 if (pollin) {
85 str = apr_psprintf(p, "Socket %d not signalled when it should be",
86 which);
88 } else {
89 str = apr_psprintf(p, "Socket %d signalled when it should not be",
90 which);
92 }
93}
94#endif
95
97 abts_case *tc)
98{
99 apr_size_t len = 5;
100 apr_status_t rv;
101
103
104 rv = apr_socket_sendto(sockarray[which], sas[which], 0, "hello", &len);
106 ABTS_SIZE_EQUAL(tc, strlen("hello"), len);
107}
108
110 abts_case *tc)
111{
112 apr_size_t buflen = 5;
113 char *buffer = apr_pcalloc(p, sizeof(char) * (buflen + 1));
115 apr_status_t rv;
116
118
119 apr_sockaddr_info_get(&recsa, "127.0.0.1", APR_UNSPEC, 7770, 0, p);
120
123 ABTS_SIZE_EQUAL(tc, strlen("hello"), buflen);
124 ABTS_STR_EQUAL(tc, "hello", buffer);
125}
126
127
128static void create_all_sockets(abts_case *tc, void *data)
129{
130 int i;
131
132 for (i = 0; i < LARGE_NUM_SOCKETS; i++){
133 make_socket(&s[i], &sa[i], 7777 + i, p, tc);
134 }
135}
136
137#ifdef OLD_POLL_INTERFACE
138static void setup_small_poll(abts_case *tc, void *data)
139{
140 apr_status_t rv;
141 int i;
142
145
146 for (i = 0; i < SMALL_NUM_SOCKETS;i++){
147 ABTS_INT_EQUAL(tc, 0, pollarray[i].reqevents);
148 ABTS_INT_EQUAL(tc, 0, pollarray[i].rtnevents);
149
152 ABTS_PTR_EQUAL(tc, s[i], pollarray[i].desc.s);
153 }
154}
155
156static void setup_large_poll(abts_case *tc, void *data)
157{
158 apr_status_t rv;
159 int i;
160
163
164 for (i = 0; i < LARGE_NUM_SOCKETS;i++){
165 ABTS_INT_EQUAL(tc, 0, pollarray_large[i].reqevents);
166 ABTS_INT_EQUAL(tc, 0, pollarray_large[i].rtnevents);
167
170 ABTS_PTR_EQUAL(tc, s[i], pollarray_large[i].desc.s);
171 }
172}
173
174static void nomessage(abts_case *tc, void *data)
175{
176 apr_status_t rv;
178
179 rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);
181 check_sockets(pollarray, s, 0, 0, tc);
182 check_sockets(pollarray, s, 1, 0, tc);
183 check_sockets(pollarray, s, 2, 0, tc);
184}
185
186static void send_2(abts_case *tc, void *data)
187{
188 apr_status_t rv;
190
191 send_msg(s, sa, 2, tc);
192
193 rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);
195 check_sockets(pollarray, s, 0, 0, tc);
196 check_sockets(pollarray, s, 1, 0, tc);
197 check_sockets(pollarray, s, 2, 1, tc);
198}
199
200static void recv_2_send_1(abts_case *tc, void *data)
201{
202 apr_status_t rv;
204
205 recv_msg(s, 2, p, tc);
206 send_msg(s, sa, 1, tc);
207
208 rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);
210 check_sockets(pollarray, s, 0, 0, tc);
211 check_sockets(pollarray, s, 1, 1, tc);
212 check_sockets(pollarray, s, 2, 0, tc);
213}
214
215static void send_2_signaled_1(abts_case *tc, void *data)
216{
217 apr_status_t rv;
219
220 send_msg(s, sa, 2, tc);
221
222 rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);
224 check_sockets(pollarray, s, 0, 0, tc);
225 check_sockets(pollarray, s, 1, 1, tc);
226 check_sockets(pollarray, s, 2, 1, tc);
227}
228
229static void recv_1_send_0(abts_case *tc, void *data)
230{
231 apr_status_t rv;
233
234 recv_msg(s, 1, p, tc);
235 send_msg(s, sa, 0, tc);
236
237 rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);
239 check_sockets(pollarray, s, 0, 1, tc);
240 check_sockets(pollarray, s, 1, 0, tc);
241 check_sockets(pollarray, s, 2, 1, tc);
242}
243
244static void clear_all_signalled(abts_case *tc, void *data)
245{
246 apr_status_t rv;
248
249 recv_msg(s, 0, p, tc);
250 recv_msg(s, 2, p, tc);
251
252 rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC);
254 check_sockets(pollarray, s, 0, 0, tc);
255 check_sockets(pollarray, s, 1, 0, tc);
256 check_sockets(pollarray, s, 2, 0, tc);
257}
258
259static void send_large_pollarray(abts_case *tc, void *data)
260{
261 apr_status_t rv;
263 int i;
264
265 send_msg(s, sa, LARGE_NUM_SOCKETS - 1, tc);
266
267 rv = apr_poll(pollarray_large, LARGE_NUM_SOCKETS, &lrv,
268 2 * APR_USEC_PER_SEC);
270
271 for (i = 0; i < LARGE_NUM_SOCKETS; i++) {
272 if (i == (LARGE_NUM_SOCKETS - 1)) {
274 }
275 else {
277 }
278 }
279}
280
281static void recv_large_pollarray(abts_case *tc, void *data)
282{
283 apr_status_t rv;
285 int i;
286
287 recv_msg(s, LARGE_NUM_SOCKETS - 1, p, tc);
288
289 rv = apr_poll(pollarray_large, LARGE_NUM_SOCKETS, &lrv,
290 2 * APR_USEC_PER_SEC);
292
293 for (i = 0; i < LARGE_NUM_SOCKETS; i++) {
295 }
296}
297#endif
298
299static void setup_pollset(abts_case *tc, void *data)
300{
301 apr_status_t rv;
305}
306
307static void multi_event_pollset(abts_case *tc, void *data)
308{
309 apr_status_t rv;
311 int lrv;
312 const apr_pollfd_t *descs = NULL;
313
314 ABTS_PTR_NOTNULL(tc, s[0]);
315 socket_pollfd.desc_type = APR_POLL_SOCKET;
317 socket_pollfd.desc.s = s[0];
318 socket_pollfd.client_data = s[0];
321
322 send_msg(s, sa, 0, tc);
323
324 rv = apr_pollset_poll(pollset, -1, &lrv, &descs);
326 if (lrv == 1) {
327 int ev = descs[0].rtnevents;
328 ABTS_PTR_EQUAL(tc, s[0], descs[0].desc.s);
329 ABTS_PTR_EQUAL(tc, s[0], descs[0].client_data);
330 ABTS_ASSERT(tc, "either or both of APR_POLLIN, APR_POLLOUT returned",
331 ((ev & APR_POLLIN) != 0) || ((ev & APR_POLLOUT) != 0));
332 }
333 else if (lrv == 2) {
334 ABTS_PTR_EQUAL(tc, s[0], descs[0].desc.s);
335 ABTS_PTR_EQUAL(tc, s[0], descs[0].client_data);
336 ABTS_PTR_EQUAL(tc, s[0], descs[1].desc.s);
337 ABTS_PTR_EQUAL(tc, s[0], descs[1].client_data);
338 ABTS_ASSERT(tc, "returned events incorrect",
339 ((descs[0].rtnevents | descs[1].rtnevents)
340 == (APR_POLLIN | APR_POLLOUT))
341 && descs[0].rtnevents != descs[1].rtnevents);
342 }
343 else {
344 ABTS_ASSERT(tc, "either one or two events returned",
345 lrv == 1 || lrv == 2);
346 }
347
348 recv_msg(s, 0, p, tc);
349
350 rv = apr_pollset_poll(pollset, 0, &lrv, &descs);
352 ABTS_INT_EQUAL(tc, 1, lrv);
353 ABTS_PTR_EQUAL(tc, s[0], descs[0].desc.s);
354 ABTS_INT_EQUAL(tc, APR_POLLOUT, descs[0].rtnevents);
355 ABTS_PTR_EQUAL(tc, s[0], descs[0].client_data);
356
359}
360
361static void add_sockets_pollset(abts_case *tc, void *data)
362{
363 apr_status_t rv;
364 int i;
365
366 for (i = 0; i < LARGE_NUM_SOCKETS;i++){
368
369 ABTS_PTR_NOTNULL(tc, s[i]);
370
371 socket_pollfd.desc_type = APR_POLL_SOCKET;
372 socket_pollfd.reqevents = APR_POLLIN;
373 socket_pollfd.desc.s = s[i];
374 socket_pollfd.client_data = s[i];
377 }
378}
379
380static void nomessage_pollset(abts_case *tc, void *data)
381{
382 apr_status_t rv;
383 int lrv;
384 const apr_pollfd_t *descs = NULL;
385
386 rv = apr_pollset_poll(pollset, 0, &lrv, &descs);
388 ABTS_INT_EQUAL(tc, 0, lrv);
390}
391
392static void send0_pollset(abts_case *tc, void *data)
393{
394 apr_status_t rv;
395 const apr_pollfd_t *descs = NULL;
396 int num;
397
398 send_msg(s, sa, 0, tc);
399 rv = apr_pollset_poll(pollset, -1, &num, &descs);
401 ABTS_INT_EQUAL(tc, 1, num);
403
404 ABTS_PTR_EQUAL(tc, s[0], descs[0].desc.s);
405 ABTS_PTR_EQUAL(tc, s[0], descs[0].client_data);
406}
407
408static void recv0_pollset(abts_case *tc, void *data)
409{
410 apr_status_t rv;
411 int lrv;
412 const apr_pollfd_t *descs = NULL;
413
414 recv_msg(s, 0, p, tc);
415 rv = apr_pollset_poll(pollset, 0, &lrv, &descs);
417 ABTS_INT_EQUAL(tc, 0, lrv);
419}
420
421static void send_middle_pollset(abts_case *tc, void *data)
422{
423 apr_status_t rv;
424 const apr_pollfd_t *descs = NULL;
425 int num;
426
427 send_msg(s, sa, 2, tc);
428 send_msg(s, sa, 5, tc);
429 rv = apr_pollset_poll(pollset, -1, &num, &descs);
432 ABTS_ASSERT(tc, "either one or two events returned",
433 num == 1 || num == 2);
434
435 /* The poll might only see the first sent message, in which
436 * case we just don't bother checking this assertion */
437 if (num == 2) {
438 ABTS_ASSERT(tc, "Incorrect socket in result set",
439 ((descs[0].desc.s == s[2]) && (descs[1].desc.s == s[5])) ||
440 ((descs[0].desc.s == s[5]) && (descs[1].desc.s == s[2])));
441 }
442}
443
444static void clear_middle_pollset(abts_case *tc, void *data)
445{
446 apr_status_t rv;
447 int lrv;
448 const apr_pollfd_t *descs = NULL;
449
450 recv_msg(s, 2, p, tc);
451 recv_msg(s, 5, p, tc);
452
453 rv = apr_pollset_poll(pollset, 0, &lrv, &descs);
455 ABTS_INT_EQUAL(tc, 0, lrv);
457}
458
459static void send_last_pollset(abts_case *tc, void *data)
460{
461 apr_status_t rv;
462 const apr_pollfd_t *descs = NULL;
463 int num;
464
465 send_msg(s, sa, LARGE_NUM_SOCKETS - 1, tc);
466 rv = apr_pollset_poll(pollset, -1, &num, &descs);
468 ABTS_INT_EQUAL(tc, 1, num);
470
471 ABTS_PTR_EQUAL(tc, s[LARGE_NUM_SOCKETS - 1], descs[0].desc.s);
472 ABTS_PTR_EQUAL(tc, s[LARGE_NUM_SOCKETS - 1], descs[0].client_data);
473}
474
475static void clear_last_pollset(abts_case *tc, void *data)
476{
477 apr_status_t rv;
478 int lrv;
479 const apr_pollfd_t *descs = NULL;
480
481 recv_msg(s, LARGE_NUM_SOCKETS - 1, p, tc);
482
483 rv = apr_pollset_poll(pollset, 0, &lrv, &descs);
485 ABTS_INT_EQUAL(tc, 0, lrv);
487}
488
489static void close_all_sockets(abts_case *tc, void *data)
490{
491 apr_status_t rv;
492 int i;
493
494 for (i = 0; i < LARGE_NUM_SOCKETS; i++){
495 rv = apr_socket_close(s[i]);
497 }
498}
499
500static void pollset_remove(abts_case *tc, void *data)
501{
502 apr_status_t rv;
504 const apr_pollfd_t *hot_files;
505 apr_pollfd_t pfd;
507
508 rv = apr_pollset_create_ex(&pollset, 5, p, 0,
511
512 pfd.p = p;
515
516 pfd.desc.s = s[0];
517 pfd.client_data = (void *)1;
518 rv = apr_pollset_add(pollset, &pfd);
520
521 pfd.desc.s = s[1];
522 pfd.client_data = (void *)2;
523 rv = apr_pollset_add(pollset, &pfd);
525
526 pfd.desc.s = s[2];
527 pfd.client_data = (void *)3;
528 rv = apr_pollset_add(pollset, &pfd);
530
531 pfd.desc.s = s[3];
532 pfd.client_data = (void *)4;
533 rv = apr_pollset_add(pollset, &pfd);
535
536 rv = apr_pollset_poll(pollset, 1000, &num, &hot_files);
538 ABTS_INT_EQUAL(tc, 4, num);
539
540 /* now remove the pollset element referring to desc s[1] */
541 pfd.desc.s = s[1];
542 pfd.client_data = (void *)999; /* not used on this call */
543 rv = apr_pollset_remove(pollset, &pfd);
545
546 /* this time only three should match */
547 rv = apr_pollset_poll(pollset, 1000, &num, &hot_files);
549 ABTS_INT_EQUAL(tc, 3, num);
550 ABTS_PTR_EQUAL(tc, (void *)1, hot_files[0].client_data);
551 ABTS_PTR_EQUAL(tc, s[0], hot_files[0].desc.s);
552 ABTS_PTR_EQUAL(tc, (void *)3, hot_files[1].client_data);
553 ABTS_PTR_EQUAL(tc, s[2], hot_files[1].desc.s);
554 ABTS_PTR_EQUAL(tc, (void *)4, hot_files[2].client_data);
555 ABTS_PTR_EQUAL(tc, s[3], hot_files[2].desc.s);
556
557 /* now remove the pollset elements referring to desc s[2] */
558 pfd.desc.s = s[2];
559 pfd.client_data = (void *)999; /* not used on this call */
560 rv = apr_pollset_remove(pollset, &pfd);
562
563 /* this time only two should match */
564 rv = apr_pollset_poll(pollset, 1000, &num, &hot_files);
566 ABTS_INT_EQUAL(tc, 2, num);
567 ABTS_ASSERT(tc, "Incorrect socket in result set",
568 ((hot_files[0].desc.s == s[0]) && (hot_files[1].desc.s == s[3])) ||
569 ((hot_files[0].desc.s == s[3]) && (hot_files[1].desc.s == s[0])));
570 ABTS_ASSERT(tc, "Incorrect client data in result set",
571 ((hot_files[0].client_data == (void *)1) &&
572 (hot_files[1].client_data == (void *)4)) ||
573 ((hot_files[0].client_data == (void *)4) &&
574 (hot_files[1].client_data == (void *)1)));
575}
576
577#define POLLCB_PREREQ \
578 do { \
579 if (pollcb == NULL) { \
580 ABTS_NOT_IMPL(tc, "pollcb interface not supported"); \
581 return; \
582 } \
583 } while (0)
584
585static void setup_pollcb(abts_case *tc, void *data)
586{
587 apr_status_t rv;
589 if (rv == APR_ENOTIMPL) {
590 pollcb = NULL;
591 ABTS_NOT_IMPL(tc, "pollcb interface not supported");
592 }
593 else {
595 }
596}
597
602
611
612static void trigger_pollcb(abts_case *tc, void *data)
613{
614 apr_status_t rv;
617
619
620 ABTS_PTR_NOTNULL(tc, s[0]);
621 socket_pollfd.desc_type = APR_POLL_SOCKET;
622 socket_pollfd.reqevents = APR_POLLIN;
623 socket_pollfd.desc.s = s[0];
624 socket_pollfd.client_data = s[0];
627
628 send_msg(s, sa, 0, tc);
629 pcb.tc = tc;
630 pcb.count = 0;
633 ABTS_INT_EQUAL(tc, 1, pcb.count);
634
637}
638
639static void timeout_pollcb(abts_case *tc, void *data)
640{
641 apr_status_t rv;
643
645
646 pcb.count = 0;
647 pcb.tc = tc;
648
651 ABTS_INT_EQUAL(tc, 0, pcb.count);
652}
653
654static void timeout_pollin_pollcb(abts_case *tc, void *data)
655{
656 apr_status_t rv;
659
661
662 recv_msg(s, 0, p, tc);
663
664 ABTS_PTR_NOTNULL(tc, s[0]);
665 socket_pollfd.desc_type = APR_POLL_SOCKET;
666 socket_pollfd.reqevents = APR_POLLIN;
667 socket_pollfd.desc.s = s[0];
668 socket_pollfd.client_data = s[0];
671
672 pcb.count = 0;
673 pcb.tc = tc;
674
677 ABTS_INT_EQUAL(tc, 0, pcb.count);
678
681}
682
683static void pollset_default(abts_case *tc, void *data)
684{
687
688 /* verify that APR will successfully create a pollset if an invalid method
689 * is specified as long as APR_POLLSET_NODEFAULT isn't specified
690 * (no platform has both APR_POLLSET_PORT and APR_POLLSET_KQUEUE, so at
691 * least one create call will succeed after having to switch to the default
692 * type)
693 */
695
698
702
703 /* verify that APR will fail to create a pollset if an invalid method is
704 * specified along with APR_POLLSET_NODEFAULT
705 * (no platform has both APR_POLLSET_PORT and APR_POLLSET_KQUEUE, so at
706 * least one create call will fail since it can't switch to the default
707 * type)
708 */
711
712 if (rv1 == APR_SUCCESS) {
714 }
715
718 if (rv2 == APR_SUCCESS) {
720 }
721
722 ABTS_ASSERT(tc,
723 "failure using APR_POLLSET_NODEFAULT with unsupported method",
724 rv1 != APR_SUCCESS || rv2 != APR_SUCCESS);
725}
726
727static void pollcb_default(abts_case *tc, void *data)
728{
731
732 /* verify that APR will successfully create a pollcb if an invalid method
733 * is specified as long as APR_POLLSET_NODEFAULT isn't specified
734 * (no platform has both APR_POLLSET_PORT and APR_POLLSET_KQUEUE, so at
735 * least one create call will succeed after having to switch to the default
736 * type)
737 */
739 if (rv1 == APR_ENOTIMPL) {
740 ABTS_NOT_IMPL(tc, "pollcb interface not supported");
741 return;
742 }
743
746
750
751 /* verify that APR will fail to create a pollcb if an invalid method is
752 * specified along with APR_POLLSET_NODEFAULT
753 * (no platform has both APR_POLLSET_PORT and APR_POLLSET_KQUEUE, so at
754 * least one create call will fail since it can't switch to the default
755 * type)
756 */
759
760 if (rv1 == APR_SUCCESS) {
762 }
763
766 if (rv2 == APR_SUCCESS) {
768 }
769
770 ABTS_ASSERT(tc,
771 "failure using APR_POLLSET_NODEFAULT with unsupported method",
772 rv1 != APR_SUCCESS || rv2 != APR_SUCCESS);
773
774
775 /* verify basic behavior for another method fallback case (this caused
776 * APR to crash before r834029)
777 */
778
780 if (rv1 != APR_ENOTIMPL) {
783 }
784}
785
786static void pollset_wakeup(abts_case *tc, void *data)
787{
788 apr_status_t rv;
793 int i;
794
797 if (rv == APR_ENOTIMPL) {
798 ABTS_NOT_IMPL(tc, "apr_pollset_wakeup() not supported");
799 return;
800 }
802
803 /* Send wakeup but no data; apr_pollset_poll() should return APR_EINTR.
804 * Do it twice to test implementations that need to re-arm the events after
805 * poll()ing (e.g. APR_POLLSET_PORT), hence verify that the wakeup pipe is
806 * still in the place afterward.
807 */
808 for (i = 0; i < 2; ++i) {
811
813 ABTS_INT_EQUAL(tc, APR_EINTR, rv);
814 }
815
816 /* send wakeup and data; apr_pollset_poll() should return APR_SUCCESS */
817 socket_pollfd.desc_type = APR_POLL_SOCKET;
818 socket_pollfd.reqevents = APR_POLLIN;
819 socket_pollfd.desc.s = s[0];
820 socket_pollfd.client_data = s[0];
823
824 send_msg(s, sa, 0, tc); apr_sleep(1000);
825
828
831 ABTS_INT_EQUAL(tc, 1, num);
832}
833
834/* Should never be invoked */
836{
837 abts_case *tc = (abts_case *) baton;
838
839 ABTS_FAIL(tc, "pollcb callback invoked on apr_pollcb_wakeup()");
840 return APR_SUCCESS;
841}
842
843static void pollcb_wakeup(abts_case *tc, void *data)
844{
845 apr_status_t rv;
847
849 if (rv == APR_ENOTIMPL) {
850 ABTS_NOT_IMPL(tc, "pollcb interface not supported");
851 return;
852 }
853 else {
855 }
856
859
860 rv = apr_pollcb_poll(pcb, -1, wakeup_pollcb_cb, tc);
861 ABTS_INT_EQUAL(tc, APR_EINTR, rv);
862}
863
864#define JUSTSLEEP_DELAY apr_time_from_msec(200)
865#if HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT
866#define JUSTSLEEP_ENOUGH(ts, te) \
867 ((te) - (ts) >= JUSTSLEEP_DELAY)
868#else
869#define JUSTSLEEP_JIFFY apr_time_from_msec(10)
870#define JUSTSLEEP_ENOUGH(ts, te) \
871 ((te) - (ts) >= JUSTSLEEP_DELAY - JUSTSLEEP_JIFFY)
872#endif
873
874static void justsleep(abts_case *tc, void *data)
875{
877 const apr_pollfd_t *hot_files;
879 apr_status_t rv;
881 int i;
889
890 nsds = 1;
891 t1 = apr_time_now();
892 rv = apr_poll(NULL, 0, &nsds, JUSTSLEEP_DELAY);
893 t2 = apr_time_now();
895 ABTS_INT_EQUAL(tc, 0, nsds);
896 ABTS_ASSERT(tc,
897 "apr_poll() didn't sleep",
899
900 for (i = 0; i < sizeof methods / sizeof methods[0]; i++) {
901 rv = apr_pollset_create_ex(&pollset, 5, p, 0, methods[i]);
902 if (rv != APR_ENOTIMPL) {
904
905 nsds = 1;
906 t1 = apr_time_now();
908 t2 = apr_time_now();
910 ABTS_INT_EQUAL(tc, 0, nsds);
911 ABTS_ASSERT(tc,
912 "apr_pollset_poll() didn't sleep",
914
917 }
918
919 rv = apr_pollcb_create_ex(&pollcb, 5, p, 0, methods[0]);
920 if (rv != APR_ENOTIMPL) {
922
923 t1 = apr_time_now();
925 t2 = apr_time_now();
927 ABTS_ASSERT(tc,
928 "apr_pollcb_poll() didn't sleep",
930
931 /* no apr_pollcb_destroy() */
932 }
933 }
934}
935
937{
938 suite = ADD_SUITE(suite)
939
941
942#ifdef OLD_POLL_INTERFACE
946 abts_run_test(suite, send_2, NULL);
953#endif
954
978
979 return suite;
980}
981
const char apr_size_t len
Definition ap_regex.h:187
void abts_run_test(abts_suite *ts, test_func f, void *value)
Definition abts.c:175
#define ABTS_SIZE_EQUAL(a, b, c)
Definition abts.h:121
#define ABTS_PTR_EQUAL(a, b, c)
Definition abts.h:126
#define ADD_SUITE(suite)
Definition abts.h:67
#define ABTS_PTR_NOTNULL(a, b)
Definition abts.h:125
#define ABTS_NOT_IMPL(a, b)
Definition abts.h:129
#define ABTS_STR_EQUAL(a, b, c)
Definition abts.h:123
#define ABTS_ASSERT(a, b, c)
Definition abts.h:130
#define ABTS_INT_EQUAL(a, b, c)
Definition abts.h:109
#define ABTS_FAIL(a, b)
Definition abts.h:128
APR Error Codes.
APR Miscellaneous library routines.
APR general purpose library routines.
APR Network library.
APR Poll interface.
APR Strings library.
const char apr_port_t port
Definition http_vhost.h:125
ap_vhost_iterate_conn_cb void * baton
Definition http_vhost.h:87
#define APR_ENOTIMPL
Definition apr_errno.h:476
#define APR_EINTR
Definition apr_errno.h:737
#define APR_STATUS_IS_TIMEUP(s)
Definition apr_errno.h:534
apr_size_t size
#define APR_SUCCESS
Definition apr_errno.h:225
int apr_status_t
Definition apr_errno.h:44
void * data
char * buffer
apr_interface_e which
apr_socket_t * sock
apr_size_t buflen
apr_uint16_t apr_port_t
#define APR_UNSPEC
apr_int32_t apr_int32_t * nsds
Definition apr_poll.h:301
apr_interval_time_t apr_int32_t const apr_pollfd_t ** descriptors
Definition apr_poll.h:274
apr_interval_time_t apr_int32_t * num
Definition apr_poll.h:273
const apr_pollfd_t * descriptor
Definition apr_poll.h:230
apr_pollset_method_e
Definition apr_poll.h:80
@ APR_POLL_SOCKET
Definition apr_poll.h:93
@ APR_POLLSET_EPOLL
Definition apr_poll.h:85
@ APR_POLLSET_KQUEUE
Definition apr_poll.h:83
@ APR_POLLSET_SELECT
Definition apr_poll.h:82
@ APR_POLLSET_POLL
Definition apr_poll.h:86
@ APR_POLLSET_DEFAULT
Definition apr_poll.h:81
@ APR_POLLSET_PORT
Definition apr_poll.h:84
#define apr_pcalloc(p, size)
Definition apr_pools.h:465
#define APR_USEC_PER_SEC
Definition apr_time.h:60
apr_int64_t apr_time_t
Definition apr_time.h:45
#define APR_POLLSET_WAKEABLE
Definition apr_poll.h:68
#define APR_POLLSET_NODEFAULT
Definition apr_poll.h:71
#define APR_POLLOUT
Definition apr_poll.h:51
#define APR_POLLIN
Definition apr_poll.h:49
apr_pool_t * p
Definition md_event.c:32
return NULL
Definition mod_so.c:359
int i
Definition mod_so.c:347
void * client_data
Definition apr_poll.h:114
apr_int16_t reqevents
Definition apr_poll.h:111
apr_datatype_e desc_type
Definition apr_poll.h:110
apr_descriptor desc
Definition apr_poll.h:113
apr_pool_t * p
Definition apr_poll.h:109
abts_case * tc
Definition testpoll.c:599
static void nomessage_pollset(abts_case *tc, void *data)
Definition testpoll.c:380
static void send_msg(apr_socket_t **sockarray, apr_sockaddr_t **sas, int which, abts_case *tc)
Definition testpoll.c:96
static void pollcb_wakeup(abts_case *tc, void *data)
Definition testpoll.c:843
static void create_all_sockets(abts_case *tc, void *data)
Definition testpoll.c:128
static apr_pollcb_t * pollcb
Definition testpoll.c:42
static void multi_event_pollset(abts_case *tc, void *data)
Definition testpoll.c:307
static void add_sockets_pollset(abts_case *tc, void *data)
Definition testpoll.c:361
static void setup_pollcb(abts_case *tc, void *data)
Definition testpoll.c:585
static void make_socket(apr_socket_t **sock, apr_sockaddr_t **sa, apr_port_t port, apr_pool_t *p, abts_case *tc)
Definition testpoll.c:57
static void justsleep(abts_case *tc, void *data)
Definition testpoll.c:874
static apr_status_t wakeup_pollcb_cb(void *baton, apr_pollfd_t *descriptor)
Definition testpoll.c:835
static void send0_pollset(abts_case *tc, void *data)
Definition testpoll.c:392
#define JUSTSLEEP_ENOUGH(ts, te)
Definition testpoll.c:870
abts_suite * testpoll(abts_suite *suite)
Definition testpoll.c:936
static void send_last_pollset(abts_case *tc, void *data)
Definition testpoll.c:459
static void send_middle_pollset(abts_case *tc, void *data)
Definition testpoll.c:421
static void close_all_sockets(abts_case *tc, void *data)
Definition testpoll.c:489
static void pollcb_default(abts_case *tc, void *data)
Definition testpoll.c:727
static void pollset_wakeup(abts_case *tc, void *data)
Definition testpoll.c:786
static void recv_msg(apr_socket_t **sockarray, int which, apr_pool_t *p, abts_case *tc)
Definition testpoll.c:109
#define LARGE_NUM_SOCKETS
Definition testpoll.c:37
static void timeout_pollin_pollcb(abts_case *tc, void *data)
Definition testpoll.c:654
static apr_socket_t * s[50]
Definition testpoll.c:39
static void pollset_default(abts_case *tc, void *data)
Definition testpoll.c:683
static void clear_middle_pollset(abts_case *tc, void *data)
Definition testpoll.c:444
static void pollset_remove(abts_case *tc, void *data)
Definition testpoll.c:500
static void clear_last_pollset(abts_case *tc, void *data)
Definition testpoll.c:475
static apr_status_t trigger_pollcb_cb(void *baton, apr_pollfd_t *descriptor)
Definition testpoll.c:603
static void setup_pollset(abts_case *tc, void *data)
Definition testpoll.c:299
#define JUSTSLEEP_DELAY
Definition testpoll.c:864
#define POLLCB_PREREQ
Definition testpoll.c:577
static apr_sockaddr_t * sa[50]
Definition testpoll.c:40
static apr_pollset_t * pollset
Definition testpoll.c:41
static void timeout_pollcb(abts_case *tc, void *data)
Definition testpoll.c:639
static void recv0_pollset(abts_case *tc, void *data)
Definition testpoll.c:408
#define SMALL_NUM_SOCKETS
Definition testpoll.c:32
static int default_pollset_impl
Definition testpoll.c:55
static void trigger_pollcb(abts_case *tc, void *data)
Definition testpoll.c:612
static apr_table_t * t1
Definition testtable.c:34
apr_socket_t * s
Definition apr_poll.h:101
apr_status_t apr_socket_sendto(apr_socket_t *sock, apr_sockaddr_t *where, apr_int32_t flags, const char *buf, apr_size_t *len)
Definition sendrecv.c:112
apr_status_t apr_socket_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock, apr_int32_t flags, char *buf, apr_size_t *len)
Definition sendrecv.c:146
apr_status_t apr_socket_bind(apr_socket_t *sock, apr_sockaddr_t *sa)
Definition sockets.c:216
apr_status_t apr_socket_close(apr_socket_t *thesocket)
Definition sockets.c:211
apr_status_t apr_socket_create(apr_socket_t **new, int ofamily, int type, int protocol, apr_pool_t *cont)
Definition sockets.c:116
#define str