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 <pulse/util.h> 2753a5a1b3Sopenharmony_ci#include <pulse/xmalloc.h> 2853a5a1b3Sopenharmony_ci#include <pulsecore/flist.h> 2953a5a1b3Sopenharmony_ci#include <pulsecore/thread.h> 3053a5a1b3Sopenharmony_ci#include <pulsecore/log.h> 3153a5a1b3Sopenharmony_ci#include <pulsecore/core-util.h> 3253a5a1b3Sopenharmony_ci 3353a5a1b3Sopenharmony_ci#define THREADS_MAX 20 3453a5a1b3Sopenharmony_ci 3553a5a1b3Sopenharmony_cistatic pa_flist *flist; 3653a5a1b3Sopenharmony_cistatic int quit = 0; 3753a5a1b3Sopenharmony_ci 3853a5a1b3Sopenharmony_cistatic void spin(void) { 3953a5a1b3Sopenharmony_ci int k; 4053a5a1b3Sopenharmony_ci 4153a5a1b3Sopenharmony_ci /* Spin a little */ 4253a5a1b3Sopenharmony_ci k = rand() % 10000; 4353a5a1b3Sopenharmony_ci for (; k > 0; k--) 4453a5a1b3Sopenharmony_ci pa_thread_yield(); 4553a5a1b3Sopenharmony_ci} 4653a5a1b3Sopenharmony_ci 4753a5a1b3Sopenharmony_cistatic void thread_func(void *data) { 4853a5a1b3Sopenharmony_ci char *s = data; 4953a5a1b3Sopenharmony_ci int n = 0; 5053a5a1b3Sopenharmony_ci int b = 1; 5153a5a1b3Sopenharmony_ci 5253a5a1b3Sopenharmony_ci while (!quit) { 5353a5a1b3Sopenharmony_ci char *text; 5453a5a1b3Sopenharmony_ci 5553a5a1b3Sopenharmony_ci /* Allocate some memory, if possible take it from the flist */ 5653a5a1b3Sopenharmony_ci if (b && (text = pa_flist_pop(flist))) 5753a5a1b3Sopenharmony_ci pa_log("%s: popped '%s'", s, text); 5853a5a1b3Sopenharmony_ci else { 5953a5a1b3Sopenharmony_ci text = pa_sprintf_malloc("Block %i, allocated by %s", n++, s); 6053a5a1b3Sopenharmony_ci pa_log("%s: allocated '%s'", s, text); 6153a5a1b3Sopenharmony_ci } 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_ci b = !b; 6453a5a1b3Sopenharmony_ci 6553a5a1b3Sopenharmony_ci spin(); 6653a5a1b3Sopenharmony_ci 6753a5a1b3Sopenharmony_ci /* Give it back to the flist if possible */ 6853a5a1b3Sopenharmony_ci if (pa_flist_push(flist, text) < 0) { 6953a5a1b3Sopenharmony_ci pa_log("%s: failed to push back '%s'", s, text); 7053a5a1b3Sopenharmony_ci pa_xfree(text); 7153a5a1b3Sopenharmony_ci } else 7253a5a1b3Sopenharmony_ci pa_log("%s: pushed", s); 7353a5a1b3Sopenharmony_ci 7453a5a1b3Sopenharmony_ci spin(); 7553a5a1b3Sopenharmony_ci } 7653a5a1b3Sopenharmony_ci 7753a5a1b3Sopenharmony_ci if (pa_flist_push(flist, s) < 0) 7853a5a1b3Sopenharmony_ci pa_xfree(s); 7953a5a1b3Sopenharmony_ci} 8053a5a1b3Sopenharmony_ci 8153a5a1b3Sopenharmony_ciint main(int argc, char* argv[]) { 8253a5a1b3Sopenharmony_ci pa_thread *threads[THREADS_MAX]; 8353a5a1b3Sopenharmony_ci int i; 8453a5a1b3Sopenharmony_ci 8553a5a1b3Sopenharmony_ci flist = pa_flist_new(0); 8653a5a1b3Sopenharmony_ci 8753a5a1b3Sopenharmony_ci for (i = 0; i < THREADS_MAX; i++) { 8853a5a1b3Sopenharmony_ci threads[i] = pa_thread_new("test", thread_func, pa_sprintf_malloc("Thread #%i", i+1)); 8953a5a1b3Sopenharmony_ci pa_assert(threads[i]); 9053a5a1b3Sopenharmony_ci } 9153a5a1b3Sopenharmony_ci 9253a5a1b3Sopenharmony_ci pa_msleep(60000); 9353a5a1b3Sopenharmony_ci quit = 1; 9453a5a1b3Sopenharmony_ci 9553a5a1b3Sopenharmony_ci for (i = 0; i < THREADS_MAX; i++) 9653a5a1b3Sopenharmony_ci pa_thread_free(threads[i]); 9753a5a1b3Sopenharmony_ci 9853a5a1b3Sopenharmony_ci pa_flist_free(flist, pa_xfree); 9953a5a1b3Sopenharmony_ci 10053a5a1b3Sopenharmony_ci return 0; 10153a5a1b3Sopenharmony_ci} 102