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 <pulsecore/asyncmsgq.h> 2953a5a1b3Sopenharmony_ci#include <pulsecore/thread.h> 3053a5a1b3Sopenharmony_ci#include <pulsecore/log.h> 3153a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3253a5a1b3Sopenharmony_ci 3353a5a1b3Sopenharmony_cienum { 3453a5a1b3Sopenharmony_ci OPERATION_A, 3553a5a1b3Sopenharmony_ci OPERATION_B, 3653a5a1b3Sopenharmony_ci OPERATION_C, 3753a5a1b3Sopenharmony_ci QUIT 3853a5a1b3Sopenharmony_ci}; 3953a5a1b3Sopenharmony_ci 4053a5a1b3Sopenharmony_cistatic void the_thread(void *_q) { 4153a5a1b3Sopenharmony_ci pa_asyncmsgq *q = _q; 4253a5a1b3Sopenharmony_ci int quit = 0; 4353a5a1b3Sopenharmony_ci 4453a5a1b3Sopenharmony_ci do { 4553a5a1b3Sopenharmony_ci int code = 0; 4653a5a1b3Sopenharmony_ci 4753a5a1b3Sopenharmony_ci pa_assert_se(pa_asyncmsgq_get(q, NULL, &code, NULL, NULL, NULL, 1) == 0); 4853a5a1b3Sopenharmony_ci 4953a5a1b3Sopenharmony_ci switch (code) { 5053a5a1b3Sopenharmony_ci 5153a5a1b3Sopenharmony_ci case OPERATION_A: 5253a5a1b3Sopenharmony_ci pa_log_info("Operation A"); 5353a5a1b3Sopenharmony_ci break; 5453a5a1b3Sopenharmony_ci 5553a5a1b3Sopenharmony_ci case OPERATION_B: 5653a5a1b3Sopenharmony_ci pa_log_info("Operation B"); 5753a5a1b3Sopenharmony_ci break; 5853a5a1b3Sopenharmony_ci 5953a5a1b3Sopenharmony_ci case OPERATION_C: 6053a5a1b3Sopenharmony_ci pa_log_info("Operation C"); 6153a5a1b3Sopenharmony_ci break; 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_ci case QUIT: 6453a5a1b3Sopenharmony_ci pa_log_info("quit"); 6553a5a1b3Sopenharmony_ci quit = 1; 6653a5a1b3Sopenharmony_ci break; 6753a5a1b3Sopenharmony_ci } 6853a5a1b3Sopenharmony_ci 6953a5a1b3Sopenharmony_ci pa_asyncmsgq_done(q, 0); 7053a5a1b3Sopenharmony_ci 7153a5a1b3Sopenharmony_ci } while (!quit); 7253a5a1b3Sopenharmony_ci} 7353a5a1b3Sopenharmony_ci 7453a5a1b3Sopenharmony_ciSTART_TEST (asyncmsgq_test) { 7553a5a1b3Sopenharmony_ci pa_asyncmsgq *q; 7653a5a1b3Sopenharmony_ci pa_thread *t; 7753a5a1b3Sopenharmony_ci 7853a5a1b3Sopenharmony_ci q = pa_asyncmsgq_new(0); 7953a5a1b3Sopenharmony_ci fail_unless(q != NULL); 8053a5a1b3Sopenharmony_ci 8153a5a1b3Sopenharmony_ci t = pa_thread_new("test", the_thread, q); 8253a5a1b3Sopenharmony_ci fail_unless(t != NULL); 8353a5a1b3Sopenharmony_ci 8453a5a1b3Sopenharmony_ci pa_log_info("Operation A post"); 8553a5a1b3Sopenharmony_ci pa_asyncmsgq_post(q, NULL, OPERATION_A, NULL, 0, NULL, NULL); 8653a5a1b3Sopenharmony_ci 8753a5a1b3Sopenharmony_ci pa_thread_yield(); 8853a5a1b3Sopenharmony_ci 8953a5a1b3Sopenharmony_ci pa_log_info("Operation B post"); 9053a5a1b3Sopenharmony_ci pa_asyncmsgq_post(q, NULL, OPERATION_B, NULL, 0, NULL, NULL); 9153a5a1b3Sopenharmony_ci 9253a5a1b3Sopenharmony_ci pa_thread_yield(); 9353a5a1b3Sopenharmony_ci 9453a5a1b3Sopenharmony_ci pa_log_info("Operation C send"); 9553a5a1b3Sopenharmony_ci pa_asyncmsgq_send(q, NULL, OPERATION_C, NULL, 0, NULL); 9653a5a1b3Sopenharmony_ci 9753a5a1b3Sopenharmony_ci pa_thread_yield(); 9853a5a1b3Sopenharmony_ci 9953a5a1b3Sopenharmony_ci pa_log_info("Quit post"); 10053a5a1b3Sopenharmony_ci pa_asyncmsgq_post(q, NULL, QUIT, NULL, 0, NULL, NULL); 10153a5a1b3Sopenharmony_ci 10253a5a1b3Sopenharmony_ci pa_thread_free(t); 10353a5a1b3Sopenharmony_ci 10453a5a1b3Sopenharmony_ci pa_asyncmsgq_unref(q); 10553a5a1b3Sopenharmony_ci} 10653a5a1b3Sopenharmony_ciEND_TEST 10753a5a1b3Sopenharmony_ci 10853a5a1b3Sopenharmony_ciint main(int argc, char *argv[]) { 10953a5a1b3Sopenharmony_ci int failed = 0; 11053a5a1b3Sopenharmony_ci Suite *s; 11153a5a1b3Sopenharmony_ci TCase *tc; 11253a5a1b3Sopenharmony_ci SRunner *sr; 11353a5a1b3Sopenharmony_ci 11453a5a1b3Sopenharmony_ci s = suite_create("Async Message Queue"); 11553a5a1b3Sopenharmony_ci tc = tcase_create("asyncmsgq"); 11653a5a1b3Sopenharmony_ci tcase_add_test(tc, asyncmsgq_test); 11753a5a1b3Sopenharmony_ci suite_add_tcase(s, tc); 11853a5a1b3Sopenharmony_ci 11953a5a1b3Sopenharmony_ci sr = srunner_create(s); 12053a5a1b3Sopenharmony_ci srunner_run_all(sr, CK_NORMAL); 12153a5a1b3Sopenharmony_ci failed = srunner_ntests_failed(sr); 12253a5a1b3Sopenharmony_ci srunner_free(sr); 12353a5a1b3Sopenharmony_ci 12453a5a1b3Sopenharmony_ci return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 12553a5a1b3Sopenharmony_ci} 126