153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2008 Lennart Poettering 553a5a1b3Sopenharmony_ci 653a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 753a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 853a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 953a5a1b3Sopenharmony_ci or (at your option) any later version. 1053a5a1b3Sopenharmony_ci 1153a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1253a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1353a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1453a5a1b3Sopenharmony_ci General Public License for more details. 1553a5a1b3Sopenharmony_ci 1653a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1753a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1853a5a1b3Sopenharmony_ci***/ 1953a5a1b3Sopenharmony_ci 2053a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2153a5a1b3Sopenharmony_ci#include <config.h> 2253a5a1b3Sopenharmony_ci#endif 2353a5a1b3Sopenharmony_ci 2453a5a1b3Sopenharmony_ci#include <check.h> 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <string.h> 2753a5a1b3Sopenharmony_ci 2853a5a1b3Sopenharmony_ci#include <pulsecore/poll.h> 2953a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3053a5a1b3Sopenharmony_ci#include <pulsecore/thread.h> 3153a5a1b3Sopenharmony_ci#include <pulsecore/lock-autospawn.h> 3253a5a1b3Sopenharmony_ci#include <pulse/util.h> 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_cistatic void thread_func(void*k) { 3553a5a1b3Sopenharmony_ci fail_unless(pa_autospawn_lock_init() >= 0); 3653a5a1b3Sopenharmony_ci 3753a5a1b3Sopenharmony_ci pa_log("%i, Trying to acquire lock.", PA_PTR_TO_INT(k)); 3853a5a1b3Sopenharmony_ci 3953a5a1b3Sopenharmony_ci fail_unless(pa_autospawn_lock_acquire(true) > 0); 4053a5a1b3Sopenharmony_ci 4153a5a1b3Sopenharmony_ci pa_log("%i, Got the lock!, Sleeping for 5s", PA_PTR_TO_INT(k)); 4253a5a1b3Sopenharmony_ci 4353a5a1b3Sopenharmony_ci pa_msleep(5000); 4453a5a1b3Sopenharmony_ci 4553a5a1b3Sopenharmony_ci pa_log("%i, Releasing", PA_PTR_TO_INT(k)); 4653a5a1b3Sopenharmony_ci 4753a5a1b3Sopenharmony_ci pa_autospawn_lock_release(); 4853a5a1b3Sopenharmony_ci 4953a5a1b3Sopenharmony_ci pa_autospawn_lock_done(false); 5053a5a1b3Sopenharmony_ci} 5153a5a1b3Sopenharmony_ci 5253a5a1b3Sopenharmony_cistatic void thread_func2(void *k) { 5353a5a1b3Sopenharmony_ci int fd; 5453a5a1b3Sopenharmony_ci 5553a5a1b3Sopenharmony_ci fail_unless((fd = pa_autospawn_lock_init()) >= 0); 5653a5a1b3Sopenharmony_ci 5753a5a1b3Sopenharmony_ci pa_log("%i, Trying to acquire lock.", PA_PTR_TO_INT(k)); 5853a5a1b3Sopenharmony_ci 5953a5a1b3Sopenharmony_ci for (;;) { 6053a5a1b3Sopenharmony_ci struct pollfd pollfd; 6153a5a1b3Sopenharmony_ci int j; 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_ci if ((j = pa_autospawn_lock_acquire(false)) > 0) 6453a5a1b3Sopenharmony_ci break; 6553a5a1b3Sopenharmony_ci 6653a5a1b3Sopenharmony_ci fail_unless(j == 0); 6753a5a1b3Sopenharmony_ci 6853a5a1b3Sopenharmony_ci memset(&pollfd, 0, sizeof(pollfd)); 6953a5a1b3Sopenharmony_ci pollfd.fd = fd; 7053a5a1b3Sopenharmony_ci pollfd.events = POLLIN; 7153a5a1b3Sopenharmony_ci 7253a5a1b3Sopenharmony_ci fail_unless(pa_poll(&pollfd, 1, -1) == 1); 7353a5a1b3Sopenharmony_ci 7453a5a1b3Sopenharmony_ci pa_log("%i, woke up", PA_PTR_TO_INT(k)); 7553a5a1b3Sopenharmony_ci } 7653a5a1b3Sopenharmony_ci 7753a5a1b3Sopenharmony_ci pa_log("%i, Got the lock!, Sleeping for 5s", PA_PTR_TO_INT(k)); 7853a5a1b3Sopenharmony_ci 7953a5a1b3Sopenharmony_ci pa_msleep(5000); 8053a5a1b3Sopenharmony_ci 8153a5a1b3Sopenharmony_ci pa_log("%i, Releasing", PA_PTR_TO_INT(k)); 8253a5a1b3Sopenharmony_ci 8353a5a1b3Sopenharmony_ci pa_autospawn_lock_release(); 8453a5a1b3Sopenharmony_ci 8553a5a1b3Sopenharmony_ci pa_autospawn_lock_done(false); 8653a5a1b3Sopenharmony_ci} 8753a5a1b3Sopenharmony_ci 8853a5a1b3Sopenharmony_ciSTART_TEST (lockautospawn_test) { 8953a5a1b3Sopenharmony_ci pa_thread *a, *b, *c, *d; 9053a5a1b3Sopenharmony_ci 9153a5a1b3Sopenharmony_ci pa_assert_se((a = pa_thread_new("test1", thread_func, PA_INT_TO_PTR(1)))); 9253a5a1b3Sopenharmony_ci pa_assert_se((b = pa_thread_new("test2", thread_func2, PA_INT_TO_PTR(2)))); 9353a5a1b3Sopenharmony_ci pa_assert_se((c = pa_thread_new("test3", thread_func2, PA_INT_TO_PTR(3)))); 9453a5a1b3Sopenharmony_ci pa_assert_se((d = pa_thread_new("test4", thread_func, PA_INT_TO_PTR(4)))); 9553a5a1b3Sopenharmony_ci 9653a5a1b3Sopenharmony_ci pa_thread_join(a); 9753a5a1b3Sopenharmony_ci pa_thread_join(b); 9853a5a1b3Sopenharmony_ci pa_thread_join(c); 9953a5a1b3Sopenharmony_ci pa_thread_join(d); 10053a5a1b3Sopenharmony_ci 10153a5a1b3Sopenharmony_ci pa_thread_free(a); 10253a5a1b3Sopenharmony_ci pa_thread_free(b); 10353a5a1b3Sopenharmony_ci pa_thread_free(c); 10453a5a1b3Sopenharmony_ci pa_thread_free(d); 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("Lock Auto Spawn"); 11553a5a1b3Sopenharmony_ci tc = tcase_create("lockautospawn"); 11653a5a1b3Sopenharmony_ci tcase_add_test(tc, lockautospawn_test); 11753a5a1b3Sopenharmony_ci /* the default timeout is too small, 11853a5a1b3Sopenharmony_ci * set it to a reasonable large one. 11953a5a1b3Sopenharmony_ci */ 12053a5a1b3Sopenharmony_ci tcase_set_timeout(tc, 60 * 60); 12153a5a1b3Sopenharmony_ci suite_add_tcase(s, tc); 12253a5a1b3Sopenharmony_ci 12353a5a1b3Sopenharmony_ci sr = srunner_create(s); 12453a5a1b3Sopenharmony_ci srunner_run_all(sr, CK_NORMAL); 12553a5a1b3Sopenharmony_ci failed = srunner_ntests_failed(sr); 12653a5a1b3Sopenharmony_ci srunner_free(sr); 12753a5a1b3Sopenharmony_ci 12853a5a1b3Sopenharmony_ci return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 12953a5a1b3Sopenharmony_ci} 130