153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 553a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 653a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 753a5a1b3Sopenharmony_ci or (at your option) any later version. 853a5a1b3Sopenharmony_ci 953a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1053a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1153a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1253a5a1b3Sopenharmony_ci General Public License for more details. 1353a5a1b3Sopenharmony_ci 1453a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1553a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1653a5a1b3Sopenharmony_ci***/ 1753a5a1b3Sopenharmony_ci 1853a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 1953a5a1b3Sopenharmony_ci#include <config.h> 2053a5a1b3Sopenharmony_ci#endif 2153a5a1b3Sopenharmony_ci 2253a5a1b3Sopenharmony_ci#include <check.h> 2353a5a1b3Sopenharmony_ci#include <signal.h> 2453a5a1b3Sopenharmony_ci 2553a5a1b3Sopenharmony_ci#include <pulsecore/poll.h> 2653a5a1b3Sopenharmony_ci#include <pulsecore/log.h> 2753a5a1b3Sopenharmony_ci#include <pulsecore/rtpoll.h> 2853a5a1b3Sopenharmony_ci 2953a5a1b3Sopenharmony_cistatic int before(pa_rtpoll_item *i) { 3053a5a1b3Sopenharmony_ci pa_log("before"); 3153a5a1b3Sopenharmony_ci return 0; 3253a5a1b3Sopenharmony_ci} 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_cistatic void after(pa_rtpoll_item *i) { 3553a5a1b3Sopenharmony_ci pa_log("after"); 3653a5a1b3Sopenharmony_ci} 3753a5a1b3Sopenharmony_ci 3853a5a1b3Sopenharmony_cistatic int worker(pa_rtpoll_item *w) { 3953a5a1b3Sopenharmony_ci pa_log("worker"); 4053a5a1b3Sopenharmony_ci return 0; 4153a5a1b3Sopenharmony_ci} 4253a5a1b3Sopenharmony_ci 4353a5a1b3Sopenharmony_ciSTART_TEST (rtpoll_test) { 4453a5a1b3Sopenharmony_ci pa_rtpoll *p; 4553a5a1b3Sopenharmony_ci pa_rtpoll_item *i, *w; 4653a5a1b3Sopenharmony_ci struct pollfd *pollfd; 4753a5a1b3Sopenharmony_ci 4853a5a1b3Sopenharmony_ci p = pa_rtpoll_new(); 4953a5a1b3Sopenharmony_ci 5053a5a1b3Sopenharmony_ci i = pa_rtpoll_item_new(p, PA_RTPOLL_EARLY, 1); 5153a5a1b3Sopenharmony_ci pa_rtpoll_item_set_before_callback(i, before, NULL); 5253a5a1b3Sopenharmony_ci pa_rtpoll_item_set_after_callback(i, after, NULL); 5353a5a1b3Sopenharmony_ci 5453a5a1b3Sopenharmony_ci pollfd = pa_rtpoll_item_get_pollfd(i, NULL); 5553a5a1b3Sopenharmony_ci pollfd->fd = 0; 5653a5a1b3Sopenharmony_ci pollfd->events = POLLIN; 5753a5a1b3Sopenharmony_ci 5853a5a1b3Sopenharmony_ci w = pa_rtpoll_item_new(p, PA_RTPOLL_NORMAL, 0); 5953a5a1b3Sopenharmony_ci pa_rtpoll_item_set_before_callback(w, worker, NULL); 6053a5a1b3Sopenharmony_ci 6153a5a1b3Sopenharmony_ci pa_rtpoll_set_timer_relative(p, 10000000); /* 10 s */ 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_ci fail_unless(pa_rtpoll_run(p) >= 0); 6453a5a1b3Sopenharmony_ci 6553a5a1b3Sopenharmony_ci pa_rtpoll_item_free(i); 6653a5a1b3Sopenharmony_ci 6753a5a1b3Sopenharmony_ci i = pa_rtpoll_item_new(p, PA_RTPOLL_EARLY, 1); 6853a5a1b3Sopenharmony_ci pa_rtpoll_item_set_before_callback(i, before, NULL); 6953a5a1b3Sopenharmony_ci pa_rtpoll_item_set_after_callback(i, after, NULL); 7053a5a1b3Sopenharmony_ci 7153a5a1b3Sopenharmony_ci pollfd = pa_rtpoll_item_get_pollfd(i, NULL); 7253a5a1b3Sopenharmony_ci pollfd->fd = 0; 7353a5a1b3Sopenharmony_ci pollfd->events = POLLIN; 7453a5a1b3Sopenharmony_ci 7553a5a1b3Sopenharmony_ci fail_unless(pa_rtpoll_run(p) >= 0); 7653a5a1b3Sopenharmony_ci 7753a5a1b3Sopenharmony_ci pa_rtpoll_item_free(i); 7853a5a1b3Sopenharmony_ci 7953a5a1b3Sopenharmony_ci pa_rtpoll_item_free(w); 8053a5a1b3Sopenharmony_ci 8153a5a1b3Sopenharmony_ci pa_rtpoll_free(p); 8253a5a1b3Sopenharmony_ci} 8353a5a1b3Sopenharmony_ciEND_TEST 8453a5a1b3Sopenharmony_ci 8553a5a1b3Sopenharmony_ciint main(int argc, char *argv[]) { 8653a5a1b3Sopenharmony_ci int failed = 0; 8753a5a1b3Sopenharmony_ci Suite *s; 8853a5a1b3Sopenharmony_ci TCase *tc; 8953a5a1b3Sopenharmony_ci SRunner *sr; 9053a5a1b3Sopenharmony_ci 9153a5a1b3Sopenharmony_ci s = suite_create("RT Poll"); 9253a5a1b3Sopenharmony_ci tc = tcase_create("rtpoll"); 9353a5a1b3Sopenharmony_ci tcase_add_test(tc, rtpoll_test); 9453a5a1b3Sopenharmony_ci /* the default timeout is too small, 9553a5a1b3Sopenharmony_ci * set it to a reasonable large one. 9653a5a1b3Sopenharmony_ci */ 9753a5a1b3Sopenharmony_ci tcase_set_timeout(tc, 60 * 60); 9853a5a1b3Sopenharmony_ci suite_add_tcase(s, tc); 9953a5a1b3Sopenharmony_ci 10053a5a1b3Sopenharmony_ci sr = srunner_create(s); 10153a5a1b3Sopenharmony_ci srunner_run_all(sr, CK_NORMAL); 10253a5a1b3Sopenharmony_ci failed = srunner_ntests_failed(sr); 10353a5a1b3Sopenharmony_ci srunner_free(sr); 10453a5a1b3Sopenharmony_ci 10553a5a1b3Sopenharmony_ci return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 10653a5a1b3Sopenharmony_ci} 107