1/*** 2 This file is part of PulseAudio. 3 4 PulseAudio is free software; you can redistribute it and/or modify 5 it under the terms of the GNU Lesser General Public License as published 6 by the Free Software Foundation; either version 2.1 of the License, 7 or (at your option) any later version. 8 9 PulseAudio is distributed in the hope that it will be useful, but 10 WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public License 15 along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 16***/ 17 18#ifdef HAVE_CONFIG_H 19#include <config.h> 20#endif 21 22#include <assert.h> 23#include <stdlib.h> 24#include <unistd.h> 25 26#include <check.h> 27 28#include <pulsecore/asyncmsgq.h> 29#include <pulsecore/thread.h> 30#include <pulsecore/log.h> 31#include <pulsecore/macro.h> 32 33enum { 34 OPERATION_A, 35 OPERATION_B, 36 OPERATION_C, 37 QUIT 38}; 39 40static void the_thread(void *_q) { 41 pa_asyncmsgq *q = _q; 42 int quit = 0; 43 44 do { 45 int code = 0; 46 47 pa_assert_se(pa_asyncmsgq_get(q, NULL, &code, NULL, NULL, NULL, 1) == 0); 48 49 switch (code) { 50 51 case OPERATION_A: 52 pa_log_info("Operation A"); 53 break; 54 55 case OPERATION_B: 56 pa_log_info("Operation B"); 57 break; 58 59 case OPERATION_C: 60 pa_log_info("Operation C"); 61 break; 62 63 case QUIT: 64 pa_log_info("quit"); 65 quit = 1; 66 break; 67 } 68 69 pa_asyncmsgq_done(q, 0); 70 71 } while (!quit); 72} 73 74START_TEST (asyncmsgq_test) { 75 pa_asyncmsgq *q; 76 pa_thread *t; 77 78 q = pa_asyncmsgq_new(0); 79 fail_unless(q != NULL); 80 81 t = pa_thread_new("test", the_thread, q); 82 fail_unless(t != NULL); 83 84 pa_log_info("Operation A post"); 85 pa_asyncmsgq_post(q, NULL, OPERATION_A, NULL, 0, NULL, NULL); 86 87 pa_thread_yield(); 88 89 pa_log_info("Operation B post"); 90 pa_asyncmsgq_post(q, NULL, OPERATION_B, NULL, 0, NULL, NULL); 91 92 pa_thread_yield(); 93 94 pa_log_info("Operation C send"); 95 pa_asyncmsgq_send(q, NULL, OPERATION_C, NULL, 0, NULL); 96 97 pa_thread_yield(); 98 99 pa_log_info("Quit post"); 100 pa_asyncmsgq_post(q, NULL, QUIT, NULL, 0, NULL, NULL); 101 102 pa_thread_free(t); 103 104 pa_asyncmsgq_unref(q); 105} 106END_TEST 107 108int main(int argc, char *argv[]) { 109 int failed = 0; 110 Suite *s; 111 TCase *tc; 112 SRunner *sr; 113 114 s = suite_create("Async Message Queue"); 115 tc = tcase_create("asyncmsgq"); 116 tcase_add_test(tc, asyncmsgq_test); 117 suite_add_tcase(s, tc); 118 119 sr = srunner_create(s); 120 srunner_run_all(sr, CK_NORMAL); 121 failed = srunner_ntests_failed(sr); 122 srunner_free(sr); 123 124 return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 125} 126