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 <assert.h> 2353a5a1b3Sopenharmony_ci#include <stdlib.h> 2453a5a1b3Sopenharmony_ci#include <unistd.h> 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <check.h> 2753a5a1b3Sopenharmony_ci 2853a5a1b3Sopenharmony_ci#include <pulse/util.h> 2953a5a1b3Sopenharmony_ci#include <pulsecore/asyncq.h> 3053a5a1b3Sopenharmony_ci#include <pulsecore/thread.h> 3153a5a1b3Sopenharmony_ci#include <pulsecore/log.h> 3253a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_cistatic void producer(void *_q) { 3553a5a1b3Sopenharmony_ci pa_asyncq *q = _q; 3653a5a1b3Sopenharmony_ci int i; 3753a5a1b3Sopenharmony_ci 3853a5a1b3Sopenharmony_ci for (i = 0; i < 1000; i++) { 3953a5a1b3Sopenharmony_ci pa_log_debug("pushing %i", i); 4053a5a1b3Sopenharmony_ci pa_asyncq_push(q, PA_UINT_TO_PTR(i+1), 1); 4153a5a1b3Sopenharmony_ci } 4253a5a1b3Sopenharmony_ci 4353a5a1b3Sopenharmony_ci pa_asyncq_push(q, PA_UINT_TO_PTR(-1), true); 4453a5a1b3Sopenharmony_ci pa_log_debug("pushed end"); 4553a5a1b3Sopenharmony_ci} 4653a5a1b3Sopenharmony_ci 4753a5a1b3Sopenharmony_cistatic void consumer(void *_q) { 4853a5a1b3Sopenharmony_ci pa_asyncq *q = _q; 4953a5a1b3Sopenharmony_ci void *p; 5053a5a1b3Sopenharmony_ci int i; 5153a5a1b3Sopenharmony_ci 5253a5a1b3Sopenharmony_ci pa_msleep(1000); 5353a5a1b3Sopenharmony_ci 5453a5a1b3Sopenharmony_ci for (i = 0;; i++) { 5553a5a1b3Sopenharmony_ci p = pa_asyncq_pop(q, true); 5653a5a1b3Sopenharmony_ci 5753a5a1b3Sopenharmony_ci if (p == PA_UINT_TO_PTR(-1)) 5853a5a1b3Sopenharmony_ci break; 5953a5a1b3Sopenharmony_ci 6053a5a1b3Sopenharmony_ci fail_unless(p == PA_UINT_TO_PTR(i+1)); 6153a5a1b3Sopenharmony_ci 6253a5a1b3Sopenharmony_ci pa_log_debug("popped %i", i); 6353a5a1b3Sopenharmony_ci } 6453a5a1b3Sopenharmony_ci 6553a5a1b3Sopenharmony_ci pa_log_debug("popped end"); 6653a5a1b3Sopenharmony_ci} 6753a5a1b3Sopenharmony_ci 6853a5a1b3Sopenharmony_ciSTART_TEST (asyncq_test) { 6953a5a1b3Sopenharmony_ci pa_asyncq *q; 7053a5a1b3Sopenharmony_ci pa_thread *t1, *t2; 7153a5a1b3Sopenharmony_ci 7253a5a1b3Sopenharmony_ci if (!getenv("MAKE_CHECK")) 7353a5a1b3Sopenharmony_ci pa_log_set_level(PA_LOG_DEBUG); 7453a5a1b3Sopenharmony_ci 7553a5a1b3Sopenharmony_ci q = pa_asyncq_new(0); 7653a5a1b3Sopenharmony_ci fail_unless(q != NULL); 7753a5a1b3Sopenharmony_ci 7853a5a1b3Sopenharmony_ci t1 = pa_thread_new("producer", producer, q); 7953a5a1b3Sopenharmony_ci fail_unless(t1 != NULL); 8053a5a1b3Sopenharmony_ci t2 = pa_thread_new("consumer", consumer, q); 8153a5a1b3Sopenharmony_ci fail_unless(t2 != NULL); 8253a5a1b3Sopenharmony_ci 8353a5a1b3Sopenharmony_ci pa_thread_free(t1); 8453a5a1b3Sopenharmony_ci pa_thread_free(t2); 8553a5a1b3Sopenharmony_ci 8653a5a1b3Sopenharmony_ci pa_asyncq_free(q, NULL); 8753a5a1b3Sopenharmony_ci} 8853a5a1b3Sopenharmony_ciEND_TEST 8953a5a1b3Sopenharmony_ci 9053a5a1b3Sopenharmony_ciint main(int argc, char *argv[]) { 9153a5a1b3Sopenharmony_ci int failed = 0; 9253a5a1b3Sopenharmony_ci Suite *s; 9353a5a1b3Sopenharmony_ci TCase *tc; 9453a5a1b3Sopenharmony_ci SRunner *sr; 9553a5a1b3Sopenharmony_ci 9653a5a1b3Sopenharmony_ci s = suite_create("Async Queue"); 9753a5a1b3Sopenharmony_ci tc = tcase_create("asyncq"); 9853a5a1b3Sopenharmony_ci tcase_add_test(tc, asyncq_test); 9953a5a1b3Sopenharmony_ci suite_add_tcase(s, tc); 10053a5a1b3Sopenharmony_ci 10153a5a1b3Sopenharmony_ci sr = srunner_create(s); 10253a5a1b3Sopenharmony_ci srunner_run_all(sr, CK_NORMAL); 10353a5a1b3Sopenharmony_ci failed = srunner_ntests_failed(sr); 10453a5a1b3Sopenharmony_ci srunner_free(sr); 10553a5a1b3Sopenharmony_ci 10653a5a1b3Sopenharmony_ci return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 10753a5a1b3Sopenharmony_ci} 108