1/* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19/* 20 * This test program tests whether the one-time initialization in 21 * av_get_cpu_flags() has data races. 22 */ 23 24#include <stdio.h> 25#include <string.h> 26 27#include "libavutil/cpu.h" 28#include "libavutil/thread.h" 29 30static void *thread_main(void *arg) 31{ 32 int *flags = arg; 33 34 *flags = av_get_cpu_flags(); 35 return NULL; 36} 37 38int main(void) 39{ 40 int cpu_flags1; 41 int cpu_flags2; 42 int ret; 43 pthread_t thread1; 44 pthread_t thread2; 45 46 if ((ret = pthread_create(&thread1, NULL, thread_main, &cpu_flags1))) { 47 fprintf(stderr, "pthread_create failed: %s.\n", strerror(ret)); 48 return 1; 49 } 50 if ((ret = pthread_create(&thread2, NULL, thread_main, &cpu_flags2))) { 51 fprintf(stderr, "pthread_create failed: %s.\n", strerror(ret)); 52 return 1; 53 } 54 pthread_join(thread1, NULL); 55 pthread_join(thread2, NULL); 56 57 if (cpu_flags1 < 0) 58 return 2; 59 if (cpu_flags2 < 0) 60 return 2; 61 if (cpu_flags1 != cpu_flags2) 62 return 3; 63 64 return 0; 65} 66